요약정리
| 계층 | 주요 어노테이션 | 설명 |
| 부트 구동 | @SpringBootApplication | 스프링 부트 시작점 및 자동 설정 |
| 엔티티 매핑 | @Entity, @Table, @Column, @Id, @GeneratedValue | JPA 엔티티와 DB 매핑 |
| 비즈니스 계층 | @Service, @Transactional | 핵심 로직 및 트랜잭션 처리 |
| 웹 계층 | @Controller, @RestController, @RequestMapping | 요청/응답 제어 |
| 데이터 접근 | @Repository | 예외 변환, DAO 계층 |
| 감사/공통 관리 | @EnableJpaAuditing, @CreatedDate, @LastModifiedDate | 생성/수정일 자동 관리 |
@SpringBootApplication
설명
스프링 부트 애플리케이션의 시작점(메인 클래스) 에 붙는 어노테이션이다.
이는 세 가지 어노테이션을 결합한 복합 어노테이션이다.
- @Configuration : 스프링 설정 클래스로 인식
- @EnableAutoConfiguration : 자동 설정(Auto Configuration) 활성화
- @ComponentScan : 지정된 패키지 이하의 빈(Component)을 자동 탐색
주요 기능
- 애플리케이션 진입점 지정
- Spring Boot의 자동 구성(빈 등록, 설정 자동화)
- 컴포넌트 스캔 범위 지정 (현재 클래스의 패키지 이하)
코드 예시
@SpringBootApplication
public class StreamerHubApplication {
public static void main(String[] args) {
SpringApplication.run(StreamerHubApplication.class, args);
}
}
주의사항
- 프로젝트 내 한 번만 선언해야 한다.
- 최상위 패키지 위치에 두어야 @ComponentScan이 모든 하위 패키지를 인식한다.
- Application 클래스 이름은 명확하게(예: StreamerHubApplication) 짓는 것이 좋다.
JPA 핵심 어노테이션
@Entity
설명
JPA에서 이 클래스를 데이터베이스 테이블과 매핑하도록 지정한다.
즉, 엔티티 클래스는 하나의 DB 테이블에 대응된다.
주요 기능
- 클래스 ↔ 테이블 매핑
- 필드 ↔ 컬럼 자동 매핑
- JPA가 관리하는 영속 객체(Persistence Entity) 로 등록
코드 예시
@Entity
public class User {
@Id
private Long memNum;
}
주의사항
- 기본 생성자(public 또는 protected)가 반드시 존재해야 한다.
- final, enum, interface 클래스에는 사용할 수 없다.
- @Entity가 붙은 클래스는 반드시 식별자(@Id) 를 가져야 한다.
@Id / @GeneratedValue
설명
엔티티의 기본 키(Primary Key) 를 지정하며, 자동 생성 전략을 설정한다.
주요 기능
- @Id : 해당 필드를 엔티티 식별자로 지정
- @GeneratedValue : 자동 증가 전략 지정
| 전략 | 설명 | 주로 사용하는 DB |
| IDENTITY | DB의 AUTO_INCREMENT 사용 | MySQL, MariaDB |
| SEQUENCE | 시퀀스 객체 사용 | Oracle, PostgreSQL |
| AUTO | DB에 따라 자동 선택 | 혼합 환경 |
| TABLE | 별도 키 관리용 테이블 사용 | 비권장 (성능 저하) |
코드 예시
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "mem_num")
private Long memNum;
주의사항
- MySQL/MariaDB : IDENTITY 전략
- Oracle : SEQUENCE 전략
- 복합키가 필요한 경우 @EmbeddedId 또는 @IdClass 사용
@Table / @Column
설명
테이블 및 컬럼의 구체적 매핑 정보를 설정한다.
주요 기능
- @Table : 테이블 이름, 스키마, 인덱스 등을 지정
- @Column : 컬럼 이름, 길이, null 허용 여부, unique 여부 등 지정
코드 예시
@Entity
@Table(name = "users", indexes = @Index(name = "idx_username", columnList = "user_name"))
public class User {
@Column(name = "user_name", length = 50, nullable = false)
private String username;
}
주의사항
- 이름을 지정하지 않으면 클래스명/필드명 그대로 사용된다.
- DB 컬럼명과 자바 필드명이 다를 경우 반드시 명시해야 한다.
- @Column(nullable = false)는 DB 레벨에서 NOT NULL 제약조건으로 반영된다.
@Repository / @Service / @Controller / @RestController
설명
스프링의 계층 구조를 나타내는 주요 계층별 어노테이션이다.
| 어노테이션 | 역할 | 주요 기능 |
| @Repository | 데이터 접근 계층(DAO, JPA Repository) | 예외 변환(AOP 기반) |
| @Service | 비즈니스 로직 계층 | 트랜잭션, 핵심 로직 구현 |
| @Controller | MVC 컨트롤러 (View 반환) | 뷰 렌더링 (Thymeleaf 등) |
| @RestController | REST API 컨트롤러 | @Controller + @ResponseBody 결합형 |
코드 예시
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
public void registerUser(User user) { ... }
}
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) { ... }
}
주의사항
- 모두 @Component의 세분화 버전으로, 빈 자동 등록 대상이다.
- @RestController는 JSON 응답을 기본으로 한다.
@Transactional
설명
트랜잭션의 시작과 종료를 스프링이 자동으로 관리하도록 지정한다.
주요 기능
- 메서드 실행 전 트랜잭션 시작
- 정상 종료 시 commit, 예외 발생 시 rollback
- 읽기 전용 트랜잭션 최적화 가능 (readOnly = true)
코드 예시
@Service
public class UserService {
@Transactional
public void registerUser(User user) {
userRepository.save(user);
}
}
주의사항
- 일반적으로 Service 레이어에 선언한다.
- 기본 롤백 대상은 RuntimeException 이상이다.
- 특정 예외만 롤백하려면 rollbackFor 속성 사
@Transactional(rollbackFor = SQLException.class)
@EnableJpaAuditing / @CreatedDate / @LastModifiedDate
설명
엔티티의 생성일, 수정일을 자동으로 관리하는 기능이다.
Auditing(감사) 기능을 통해 createdAt, updatedAt 필드를 자동으로 채운다.
주요 기능
- @EnableJpaAuditing: 기능 활성화 (보통 메인 클래스에 선언)
- @CreatedDate: 최초 생성 시 자동 기록
- @LastModifiedDate: 수정 시 자동 갱신
코드 예시
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
@SpringBootApplication
@EnableJpaAuditing
public class StreamerHubApplication {
public static void main(String[] args) {
SpringApplication.run(StreamerHubApplication.class, args);
}
}
주의사항
- @EnableJpaAuditing을 반드시 한 곳에 선언해야 한다.
- 엔티티에서 상속받는 추상 클래스(@MappedSuperclass)에 선언한다.
- LocalDateTime을 사용하는 것이 일반적이며, OffsetDateTime도 가능하다.
'IT정리 > java' 카테고리의 다른 글
| 로그인 시 ID/비밀번호 안전하게 암호화하는 방법 (feat. 일회용 키 & AES 암호화) (0) | 2025.03.24 |
|---|---|
| [카카오 지도 API] 2개 이상의 지도 추가 시 랜더링 에러 삽질기 (0) | 2025.01.11 |
| java.lang.Error: Unresolved compilation problem: 에러. 1시간의 삽질기 (0) | 2025.01.02 |
| JSTL 정리 - Core 태그 라이브러리 (0) | 2024.12.19 |