Dev./Spring

[Spring] Lombok 생성자 @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

limitation01 2025. 11. 20. 08:25

@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 깔끔한 생성자 주입, 필수 의존성만 강제