SpringBoot/ETC
@Builder 사용 시 주의 점
by BAYABA
2021. 10. 8.
- 개인 공부 목적으로 작성한 글입니다.
- 아래 출처를 참고하여 작성하였습니다.
목차
- Intro
- 클래스 위에 @Builder 사용 시 문제점
- Builder Pattern Implementation
1. Intro
- 올바른 @Builder 사용을 위해 아래 두 가지 사항에 대해 알아보겠습니다.
- 클래스 위에 @Builder 사용 시 발생하는 문제점
- @Builder 어노테이션 기능을 실제 구현한다면 어떤 식으로 코드가 작성되는지
2. 클래스 위에 @Builder 사용 시 문제점
- 클래스 위에 @Builder를 선언하면 모든 멤버 필드에 대해서 매개변수를 받는 생성자를 만듭니다.
- 이 경우 Id, createAt, updateAt 같이 객체 생성 시 받지 않아야 할 데이터들도 빌더에 노출이 됩니다.
- 그러므로 객체 생성 시 받아야할 데이터들만 Parameter로 받는 생성자를 만들고 그 위에 @Builder를 붙이는 게 바람직합니다.
- 클래스 위에 @Builder를 선언하면 생성자의 접근 레벨이 default가 되므로 동일 패키지 내에서 해당 생성자를 호출할 수 있는 문제가 있습니다.
3. Builder Pattern Implementation
- @Builder 어노테이션 대신 빌터 패턴을 직접 구현한다면 아래와 같은 형태로 빌더 코드가 추가될 것입니다.
- 중요한 건, 빌더가 build() 메서드 호출로 최종 시점에 객체를 생성하는데 사용할 생성자를 Entity쪽에서 뚫어놔줘야 한다는 점입니다.
public class PersonInfoBuilder {
private String name;
private Integer age;
private String favoriteColor;
private String favoriteAnimal;
private Integer favoriteNumber;
public PersonInfoBuilder setName(String name) {
this.name = name;
return this;
}
public PersonInfoBuilder setAge(Integer age) {
this.age = age;
return this;
}
public PersonInfoBuilder setFavoriteColor(String favoriteColor) {
this.favoriteColor = favoriteColor;
return this;
}
public PersonInfoBuilder setFavoriteAnimal(String favoriteAnimal) {
this.favoriteAnimal = favoriteAnimal;
return this;
}
public PersonInfoBuilder setFavoriteNumber(Integer favoriteNumber) {
this.favoriteNumber = favoriteNumber;
return this;
}
public PersonInfo build(){
PersonInfo personInfo = new PersonInfo(name, age, favoriteColor, favoriteAnimal, favoriteNumber);
return personInfo;
}
}
출처
- 실무에서 Lombok 사용법
- Lombok 사용법과 주의사항
- 빌더 패턴(Builder Pattern)