BootCamp

[Nbcamp] 과제 어노테이션 정리

limitation01 2025. 11. 22. 10:11

그때그때 필요한 어노테이션을 찾기보다 왜 필요하고 무슨일을 알아서 해주는지에 대해 알고 사용하기 위해 정리했다.

⭐️ Entity

@Getter

  • Lombok제공
  • 모든 필드에 대해 getter 자동 생성
  • 불변성, 캡슐화를 깨지 않고 필드 접근 가능

@Entity

  • JPA가 이 클래스를 DB테이블과 매핑되는 엔티티로 생각
  • 해당 어노테이션이 붙은 엔티티는 JPA가 영속성 컨텍스트로 관리

@Table(name=””)

  • 엔티티가 매핑될 실제 테이블 이름 지정
  • 예약어나 기존 테이블과 충돌할 때 유용 (예약어 user와 충돌될 수 있으므로 users)

@NoArgsConstructor(access=AccessLevel.PROTECTED)

  • protected로 막아 외부에서 무분별한 객체 생성을 차단 → 얜 이해하기 너무어려움,,엔티티의 프록시조회,,

@Id

  • 기본키 PK 필드
  • 엔티티의 식별자, 영속성 컨텍스트가 엔티티를 구분하는 기준

@GeneratedValue(strategy = GenerationType.IDENTITY)

  • PK값 자동 증가

@Column()

  • 객체 필드를 테이블 컬럼에 매핑하는 어노테이션

@ManyToOne(fetch = FetchType.LAZY, optional = false)

  • 다대일(N:1) 연관 관계 매핑 어노테이션
  • 기본 fetch = EAGER지만, 성능 위해 LAZY로 변경
  • optional = false → JoinColumn의 nullable=false 세뜨

@JoinColumn(name = "00", nullable = false)

  • 외래키(FK) 컬럼명을 명시적으로 지정
  • 기본값은 필드명+_id지만 명시해 가독성 증가
  • 어떤 컬럼으로 join 되는지 명확히 표현

@OnDelete(action = OnDeleteAction.CASCADE)

  • 부모 엔티티(Schedule) 삭제 시 관련 댓글도 DB 레벨에서 자동 삭제 (단방향 맵핑과 함께 쓰임)
  • Hibernate 전용 기능 (JPA X)

⭐️ Controller

@RestController

  • Controller + ResponseBody
  • 리턴값을 JSON으로 직렬화
  • REST API 작성에 최적화
  • 전역 예외 핸들러와 연동

@RequiredArgsConstructor

  • final 키워드가 붙거나 @NonNull 어노테이션이 붙은 필드에 대해 생성자를 자동으로 생성
  • 의존성 주입을 생성자로 안전하게 처리

만일 사용하지 않는다면

@RestController
@RequestMapping("/schedules/{scheduleId}/comments")
public class CommentController {
    private final CommentService commentService;
    
    public CommentController(CommentService commentService) { >> 직접 작성해야함
	    this.commentService = commentService; 
    }
}

@RequestMapping

  • 컨트롤러의 공통 URL prefix 설정
  • 내부 HTTP 메서드는 이 경로 기준으로 상대 URL사용

@GetMapping / @PostMapping / @PatchMapping/@PutMapping

  • URL 매핑
  • 이 요청이 오면 이 메서드로 보내라 = 라우팅 역할

@Valid

  • @RequestBody 객체를 사용자로부터 가져올 때, 들어오는 객체(DTO)의 값들을 검증
  • @NotBlank, @Size 같은 Bean Validation 동작

@PathVariable

  • URL 경로에 포함된 값을 메서드의 파라미터로 바인딩
  • 리소스 식별자 추출
  • RESTful 구조에서 필수

@RequestBody

  • Jacson이 내부적으로 JSON 요청 바디를 DTO 객체로 자동 변환
  • 유효성 검증 @Valid 와 함께 자주 사용

@SessionAttribute

  • 세션을 편리하게 사용할 수 있도록 스프링에서 지원하는 어노테이션
@SessionAttribute("userId") Long userId
  • 다음과 같이 작성하면 세션에 저장된 key값 중 userId를 찾아 Long으로 가져온다.
  • HttpServletRequest 사용 없이 매우 깔끔하게 접근가능

⭐️ DTO

@Getter

  • ‘’

@NoArgsConstructor

  • 파라미터 없는 기본 생성자를 자동 생성
  • JSON → DTO 역직렬화(Jackson)가 기본 생성자를 반드시 요구

@NotBlank

  • null, "", " " 모두 허용하지 않음

@Size(max = N)

  • 문자열 길이 제한

@Email

  • 기본적인 이메일 형식(@, 도메인 구조 등)을 검증

@Pattern(regexp = "...")

  • 복합 조건(영문 + 숫자 + 특수문자 + 길이 등)을 정규식으로 강제, 비밀번호와 같이 특수한 규칙이 필요할때 사용

⭐️ Service

@Service

  • 이 클래스가 비즈니스 로직을 담당하는 서비스 계층이라는 의미
  • 컴포넌트 스캔시 빈으로 등록
  • 이 어노테이션으로 3레이어 구분이 쉬워진다
  • 예외처리, AOP(트랜잭션 등)적용 대상

@RequiredArgsConstructor

  • ‘’

@Transactional

  • 트랜잭션의 경계를 표현
  • 메서드 안에서 예외가 발생시 DB 변경 내용 롤백
  • 쓰기작업에 필수
  • 같은 트랙잭션 내에서 영속성 컨텍스트 공유

@Transactional(readOnly = true)

  • 조회 전용 트랜잭션
  • 읽기 작업만 있는 메서드에 사용

⭐️ Repository

레포지토리는 어노테이션 없는 형태가 권장

왜??

public interface CommentRepository extends JpaRepository<Comment, Long> { ... }
  • JpaRepository를 상속한 인터페이스를 자동으로 repository 빈으로 등록함
  • @Repository 가 필요한 경우는 직접 만든 repoository일때 (ex.QueryDSL, JDBC Template, MyBatis)

⭐️ ETC

@Component

  • 스프링 빈의 가장 기본적인 형태 = 이 클래스 빈으로 등록해줘
  • 일반적인 빈일 경우, 도메인/서비스/컨트롤러 어디에도 속하지 않을때 직접 붙인다
  • 붙이면 컴포넌트 스캔시 싱글톤 빈으로 만들어져 자동 의존성 주입 가능
  • @Bean 과의 차이
    • 메서드 위에 붙이며 수동 등록, 명시적으로 빈을 등록해야 하는 경우
    • @Component는 컴포넌트 스캔에 의해 자동 등록

@MappedSuperClass

  • 공통 컬럼(생성일/ 수정일) 을 공유할때 사용
  • 상속 받는 엔티티는 이 필드를 자신의 테이블 컬럼으로 가질 수 있음
  • 엔티티가 아님 → 쿼리 대상 사용 불가
  • JPA 설계에서 가장 많이 쓰는 공통 부모 엔티티 패턴

@EntityListeners(AuditingEntityListener.class)

  • 엔티티 생성/ 수정 시점에 Auditing 기능을 자동 실행
  • @CreatedDate, @LastModifiedDate 등과 함께 사용
  • 스프링이 엔티티의 라이프사이클 이벤트를 감지하여 날짜를 자동 설정 = 개발자가 수동으로 넣을필요X
  • 메인클래스에 @EnableJpaAuditing 활성화 필요

@EnableJpaAuditing

  • JPA Auditing 기능을 전역적으로 활성화하는 스프링 설정 어노테이션
  • 보통 SpringBootApplication이 있는 메인 클래스에 추가

@CreatedDate

  • 엔티티가 CREATE시 자동으로 값 기록, 업데이트시에도 변동 X
  • 생성일이 필요한 모든 엔티티에서 사용

@Column(updatable = false)

  • 최초 생성시에만 설정되기 위해 UPDATE시 제외되도록 JPA에게 명령

@LastModifiedDate

  • CREATE, UPDATE시 자동 업데이트
  • JPA의 엔티티 Dirty Checking과 함께 동작

@AllArgsConstructor

  • 클래스의 모든 필드를 파라미터로 받는 생성자를 자동 생성
  • 불변 값 객체나 Response DTO를 한번에 생성할 때 유용
  • @Setter 없이도 객체를 완전한 상태를 만들 수 있음

💡헷갈리는 Lombok 생성자 어노테이션

어노테이션  생성자 주요 목적 사용하는 곳  장점 주의점
@NoArgsConstructor 파라미터 없는 기본 생성자 JPA, Jackson 등 프레임워크가 객체 생성 가능하도록 함 엔티티, Request DTO JPA 스펙 충족 / JSON 역직렬화 가능 객체가 “불완전한 상태”로 생성될 수 있음
@AllArgsConstructor 모든 필드를 파라미터로 받음 모든 필드를 한 번에 초기화하는 생성자 제공 Response DTO, Value Object(VO) 작성이 간단, 값 세팅 빠름 필드 많을수록 순서 헷갈려 위험 / 엔티티에 비권장
@RequiredArgsConstructor final + @NonNull 필드만 받음 Spring DI(의존성 주입)에 최적화 Service, Controller, Component 불변 의존성 보장, 안전한 생성자 주입 final 아님 + @NonNull 아님 필드는 포함 안됨

@RestControllerAdvice

  • 프로젝트 전체 컨트롤러에 공통적으로 적용되는 오류 처리 클래스
  • 모든 API 에러를 이 클래스가 받아서 JSON으로 오류 메세지를 반환

@ExceptionHandler

  • 예를 들어 CustomException이 터지면 이 어노테이션이 붙은 메서드가 작동
  • 예외 타입을 지정할 수 있어 정확한 에러 핸들링 가능