그때그때 필요한 어노테이션을 찾기보다 왜 필요하고 무슨일을 알아서 해주는지에 대해 알고 사용하기 위해 정리했다.
⭐️ 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)
- 문자열 길이 제한
- 기본적인 이메일 형식(@, 도메인 구조 등)을 검증
@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이 터지면 이 어노테이션이 붙은 메서드가 작동
- 예외 타입을 지정할 수 있어 정확한 에러 핸들링 가능
'BootCamp' 카테고리의 다른 글
| [Error] 일정 관리 트러블슈팅 1 - URI 설계 (User) (0) | 2025.11.15 |
|---|---|
| [Error] 일정 관리 트러블 슈팅 2- 양방향vs단방향 (0) | 2025.11.14 |
| [Error] 일정 트러블 슈팅 (1) | 2025.11.05 |
| [내배캠] 한달 회고 (0) | 2025.10.31 |
| [Error] 키오스크 트러블 슈팅 3 - 장바구니 구조 설계 (0) | 2025.10.28 |