[Lombok] @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

artp·2025년 6월 3일

java

목록 보기
28/32
post-thumbnail

Java에서는 객체 생성 시 생성자가 필수입니다. 하지만 매번 생성자를 작성하는 건 번거롭고 오류 가능성도 있습니다.
이때 Lombok의 생성자 관련 애노테이션을 사용하면 코드를 훨씬 간결하게 만들 수 있습니다.

1. @NoArgsConstructor

매개변수가 없는 생성자(기본 생성자)를 생성해줍니다.

@NoArgsConstructor
public class User {
    private String name;
    private int age;
}

// 생성되는 코드
public User() {
}

주요 사용 사례

  • JPA 엔티티: JPA는 리플렉션 기반으로 객체를 생성하므로 기본 생성자가 필수
  • 역직렬화: Jackson, Gson 등의 라이브러리에서 JSON을 객체로 변환할 때 필요
  • Spring DI (의존성 주입): 프레임워크에서 빈 생성 시 사용

2. @AllArgsConstructor

모든 필드를 인자로 받는 생성자를 생성합니다.

@AllArgsConstructor
public class Authentication {
    private String username;
    private String password;
    private Role authority;
}

// 생성되는 코드
public Authentication(String username, String password, Role authority) {
    this.username = username;
    this.password = password;
    this.authority = authority;
}

주요 사용 사례

  • 불변 객체 생성: 모든 필드를 한 번에 설정하여 객체 생성
  • 테스트 코드: 테스트용 객체를 빠르게 생성
  • 빌더 패턴과 조합: @Builder와 함께 사용하여 다양한 생성 방법 제공

3. @RequiredArgsConstructor

필수 필드(final 또는 @NonNUll이 붙은 필드)만 인자로 받는 생성자를 생성합니다.

@RequiredArgsConstructor
public class Sample {
    private final String name;
    private final int age;
    private String address; // final 아님
    @NonNull 
    private String email;
}

// 생성되는 코드
public Sample(String name, int age, @NonNull String email) {
    if (email == null) {
        throw new NullPointerException("email is marked non-null but is null");
    }
    this.name = name;
    this.age = age;
    this.email = email;
}

주요 사용 사례

  • 의존성 주입: Spring에서 생성자 기반 의존성 주입 시 매우 유용
  • 불변 객체의 필수 필드: 반드시 설정되어야 하는 필드만 생성자로 받고 싶을 때
  • 도메인 객체: 비즈니스 로직상 필수인 필드들만 생성자로 강제

4. 주의사항

생성자 매개변수 순서

생성자 매개변수 순서는 필드 선언 순서를 따름
→ 필드 순서를 변경하면 생성자 시그니처도 변경됨

final 필드와 @NoArgsConstructor

final 필드는 기본 생성자로 초기화 불가 → 컴파일 에러

  • @NoArgsConstructor에서 final 필드가 있으면 컴파일 에러
  • force = true 옵션 (@NoArgsConstructor(force = true))으로 해결 가능하지만 final 필드가 null, 0 등으로 초기화됨

상속 관계에서 주의

롬복은 부모 클래스의 필드는 생성자에 포함하지 않음

  • @SuperBuilder 사용 또는 명시적 생성자 작성 필요
profile
donggyun_ee

0개의 댓글