@Builder 와 @AllArgsConstructor @NoArgsConstructor
개요
Spring 프로젝트 중 생성자에 값을 넣어주는 문제에 대해 잠시 고민해보았다.
생성자에 넣어주는 값이 예를 들면 title만 넣으려다 title, name, phoneNumber 로 늘어나게 된다면 생성자 수정/추가가 계속 필요하다.
그래서 찾아보던 중 @Builder를 사용해보고자 했다.
@Getter
public class ColResponseDto {
private String title;
private int position;
private Long boardId;
public ColResponseDto(Col columns) {
this.title = columns.getTitle();
this.position = columns.getPosition();
this.boardId = columns.getBoard().getId();
}
}
ColResponseDto 클래스를 .builder() 를 사용하고 싶다.
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ColResponseDto {
private String title;
private int position;
private Long boardId;
public ColResponseDto(Col columns) {
this.title = columns.getTitle();
this.position = columns.getPosition();
this.boardId = columns.getBoard().getId();
}
}
클래스 위에 @Builder을 추가해주면 된다.
Builder의 장점은 무엇일까?
1. 빌더 패턴(Builder Pattern)을 사용해야 하는 이유
- 필요한 데이터만 설정할 수 있음 -> 위에 말한것처럼 필요할때마다 생성자 수정이 아닌 필요한것만 설정이 가능해진다.
- 유연성을 확보할 수 있음
- 가독성을 높일 수 있음
- 변경 가능성을 최소화 할 수 있음
2. 그럼 빌더 패턴이 무조건 필요한가?
- 객체의 생성을 라이브러리로 위임하는 경우
- 변수의 개수가 2개 이하이며, 변경 가능성이 없는 경우
만약, 엔티티(Entity) 객체나 도메인(Domain) 객체로부터 Dto를 생성하는 경우
- 직접 빌더를 만들고 하는 작업이 번거롭기 때문에 MapStruct나 Model Mapper와 같은 라이브러리를 통해 생성을 위임할 수 있다.
변수가 2개 이하인 경우에는
- 변수가 늘어날 가능성이 없기 때문에 정적 팩토리 메소드를 사용하는 것이 더 좋을 수 있다.
빌더의 남용은 오히려 코드를 비대하게 만들 수 있으므로 변수의 개수와 변경 가능성 등을 중점적으로 보고 필더 패턴을 적용할지 판단하면 된다.
더 자세한 예시는 이 블로그에 예시와 함께 나와있다.
https://mangkyu.tistory.com/163
내가 주목하고 싶었던건 @AllArgsConstructor 달아주지 않으면 오류가 난다.
저 어노테이션을 달아주지 않으면 오류가 발생했다. 모든 멤버변수를 받는 생성자가 없는 것이 이유였다.
Q. @AllArgsConstructor 어노테이션이 필요한 이유
빌더는 필드의 초기화 작업을 도와주는 역할
Lombok 공식사이트를 보면
@Builder 사용 시, 생성한 생성자가 없으면 @AllArgsConstructor(access = AccessLevel.PACKAGE)가 암묵적으로 적용된다.
또한 @Builder 내에서 모든 파라미터를 갖는 생성자를 필요로 한다.
그러니 @Builder를 사용하는 엔티티(Entity)에서는 꼭 @AllArgsConstructor을 달아주자