본문 바로가기

IT정리/java

Spring Boot & JPA 핵심 어노테이션 정리

요약정리

계층 주요 어노테이션 설명
부트 구동 @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도 가능하다.