🧑🔧 Lombok의 생성자 어노테이션
Lombok에는 생성자 관련 어노테이션이 대표적으로 3가지가 있다.
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
각각에 대해 명확하게 알아보자!
1. @NoArgsConstructor
첫 번째로 @NoArgsConstructor 어노테이션의 경우 매개변수가 없는 기본 생성자를 만들어 준다.
예를 들어 이런 클래스가 있을 때
@NoArgsConstructor
public class Post {
private Long id;
private String title;
private String content;
private LocalDateTime createdAt;
}
Lombok은 내부적으로 아래와 같은 생성자를 만들어준다.
public Post() {}
JPA 같은 프레임워크나 Jackson 같은 라이브러리를 사용하려면 기본 생성자가 사실상 필수이기 때문에 아주 유용하게 사용된다.
2. @AllArgsConstructor
@AllArgsConstructor는 이름에서도 알 수 있듯이 모든 필드를 매개변수로 받는 생성자를 자동으로 만들어준다.
@AllArgsConstructor
public class Post {
private Long id;
private String title;
private String content;
private LocalDateTime createdAt;
}
위와 같은 클래스가 있을 때 내부적으로 아래와 같은 생성자를 만든다.
public Post(Long id, String title, String content, LocalDateTime createdAt) {
this.id = id;
this.title = title;
this.content = content;
this.createdAt = createdAt;
}
DTO와 같이 모든 필드값을 초기화해야 하는 경우나 Builder 패턴을 사용하는 경우 유용하다.
3. @RequiredArgsConstructor
마지막으로 @RequiredArgsConstructor는 final 키워드 또는 @NonNull이 붙은 필드만 포함하는 생성자를 만들어준다.
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
}
위의 같은 코드에 내부적으로 아래의 생성자를 만들어준다.
public class PostService {
private final PostRepository postRepository;
public PostService(PostRepository postRepository) {
this.postRepository = postRepository;
}
}
주로 Spring에서 생성자 기반 의존성 주입을 할 때 @Autowired보다 훨씬 간결하기 때문에 자주 사용된다.
추가적으로 위의 3가지 어노테이션의 경우 필수는 아니지만 사용 가능한 4가지 옵션들이 있다.
access
- 생성자를 만들 때 접근 제어자를 설정할 수 있다. (PUBLIC, PRIVATE, PROTECTED 등)
- @NoArgsConstructor(access = AccessLevel.PROTECTED) 와 같이 사용한다.
staticName
- 지정한 이름으로 정적(static) 팩토리 메서드를 같이 만들어준다.
java@AllArgsConstructor(staticName = "of") public class Post { private Long id; private String title; private String content; private LocalDateTime createdAt; } // 아래와 같은 정적 메서드가 자동으로 생성된다. public static Post of(Long id, String title, String content, LocalDateTime createdAt) { return new Post(id, title, content, createdAt); }
force
- final 필드를 강제로 초기화한다.
- 예를 들어 클래스에 final 필드가 있는 경우 기본 생성자 생성이 불가능한데 이걸 강제로 초기화할 때 주로 사용한다.
- @AllArgsConstructor의 경우 모든 필드를 생성자에서 받기 때문에 force 옵션이 필요 없고 사용할 수도 없다.
onConstructor
- 생성자에 붙일 추가 어노테이션을 지정한다.
java@RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class PostService { private final PostRepository postRepository; } // 아래의 형태로 생성자를 만들어준다. @Autowired public PostService(PostRepository postRepository) { this.postRepository = postRepository; }