@NoArgsConstructor
매개변수가 없는 기본 생성자를 자동으로 만들어준다 new User()
@NoArgsConstructor
public class User {
private String username;
private int age;
}
언제 사용할까
- JPA Entity 필수 조건 - Hibernate가 리플렉션으로 객체를 생성하기 때문에 protected 기본 생성자가 필요함
- DTO 중에서도 빈 객체 만들고 setter로 채우는 경우
⚠️ 주의점
- 모든 필드가 초기화되지 않은 상태로 생성되므로 불완전한 객체가 생긴다.
- 엔티티는 protected로 제한하는 게 안전함.
@AllArgsConstructor
모든 필드를 매개변수로 받는 생성자를 만들어준다 new User( "Kim", 25 )
@AllArgsConstructor
public class User {
private String username;
private int age;
}
언제 사용할까
- 테스트 코드에서 필드를 한 번에 세팅하고 싶을 때
- 단순한 DTO (불변 객체가 아닐 때)
⚠️ 주의점
- 엔티티에 사용하면 너무 많은 값을 외부에서 마음대로 넣는 위험성 존재
- JPA는 연관관계를 하나씩 세팅해야 해서 AllArgs는 비추천
@RequiredArgsConstructor
final 또는 @NonNull 필드만 생성자로 만든다
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}
→ Spring이 생성자 주입을 위해 딱 필요한 필드만 생성자에 넣어줌
언제 쓰나?
- Spring에서 DI 받을 클래스 (Service, Controller 등)
- 의존성을 final로 만들어 불변을 보장하고, 필요한 필드만 생성
- 객체를 불완전하게 만들지 않음 → 안정적
특징
- 가장 깔끔한 DI 패턴
- 이 클래스는 이 필드 없이는 동작할 수 없다는 의도를 정확하게 표현
정리
| 어노테이션 | 생성자 | 사용 기준 | 주 사용처 | 장점 |
| @NoArgsConstructor | 기본 생성자(매개변수 없음) | Jackson이 객체를 만들기 위해 필요JPA(Hibernate)가 프록시 생성 위해 필요 | Request DTO, Entity | 프레임워크가 마음대로 객체 생성 가능 |
| @AllArgsConstructor | 모든 필드를 매개변수로 받는 생성자 | DTO 전체를 한 번에 만들 때 | Response DTO, 테스트 | 필드 전체 초기화가 간편 |
| @RequiredArgsConstructor | final 또는 @NonNull 필드만 생성자에 포함 | 불변성 보장(필수 의존성만 주입)Spring DI 최적화 | Service, Controller | 깔끔한 생성자 주입, 필수 의존성만 강제 |
'Dev. > Spring' 카테고리의 다른 글
| [Spring] 응답DTO에 엔티티 의존성을 주입해야 하는 경우 (0) | 2025.11.19 |
|---|---|
| [Spring] Pageable+Page 사용해 Pagination 적용해보기 (0) | 2025.11.18 |
| [Spring] record DTO 클래스 (0) | 2025.11.17 |
| [Spring] DELETE 메소드에 RequestBody를 지양해야 하는 이유 (0) | 2025.11.13 |
| [Spring] Filter (0) | 2025.11.13 |