Builder 패턴을 알기 전엔 DTO를 만들 때 Mapper라는 클래스를 만들어 변환해줬습니다.
public static ArticleResponseDto articleToDto(Article article) {
ArticleDto articleDto = new ArticleDto();
ArticleDto.setTitle(article.getTitle());
ArticleDto.setContents(article.getContents());
ArticleDto.setAuthor(article.getAuthor());
ArticleDto.setCreatedAt(article.getCreatedAt());
return ArticleDto;
}
하지만 Builder Pattern이라는 것을 알게된 뒤론
public static ArticleResponseDto articleToDto(Article article) {
ArticleResponseDto articleDto = ArticleResponseDto.builder()
.articleId(article.getArticleId())
.title(article.getTitle())
.contents(article.getContents())
.author(article.getTitle())
.createdAt(article.getCreatedAt())
.build();
return articleDto;
}
이렇게 더욱 쉽게 객체와 DTO를 변환할 수 있었습니다.
이러 경험을 이유로 Builder Pattern에 대해 정리해보았습니다.
Builder Pattern은 객체 생성을 단순화하고 가독성을 높이는 디자인 패턴입니다.
Builder Pattern은 생성자의 매개변수가 많거나 선택적인 경우에 유용하게 사용할 수 있습니다.
Builder Pattern의 장점은 다음과 같습니다.
Builder Pattern의 예시는 다음과 같습니다.
// Person 클래스
public class Person {
// 필수 매개변수
private final String name;
private final int age;
// 선택적 매개변수
private final String gender;
private final String address;
private final String phone;
// private 생성자
private Person(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.gender = builder.gender;
this.address = builder.address;
this.phone = builder.phone;
}
// getter 메소드
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
public String getAddress() {
return address;
}
public String getPhone() {
return phone;
}
// Builder 클래스
public static class Builder {
// 필수 매개변수
private final String name;
private final int age;
// 선택적 매개변수
private String gender = "";
private String address = "";
private String phone = "";
// public 생성자
public Builder(String name, int age) {
this.name = name;
this.age = age;
}
// setter 메소드
public Builder gender(String gender) {
this.gender = gender;
return this;
}
public Builder address(String address) {
this.address = address;
return this;
}
public Builder phone(String phone) {
this.phone = phone;
return this;
}
// build 메소드
public Person build() {
return new Person(this);
}
}
}
// 객체 생성 예시
Person person1 = Person.Builder("김철수", 25)
.gender("남")
.address("서울")
.phone("010-1234-5678")
.build();
Person person2 = Person.Builder("이영희", 30)
.gender("여")
.build();
Lombok 라이브러리가 지원해주는 @Builder 어노테이션을 사용하면 더욱 쉽게 Builder Pattern을 사용할 수 있습니다.
// Person 클래스
@Builder
@Getter
public class Person {
// 필수 매개변수
private final String name;
private final int age;
// 선택적 매개변수
private final String gender;
private final String address;
private final String phone;
}
// 객체 생성 예시
Person person1 = Person.Builder("김철수", 25)
.gender("남")
.address("서울")
.phone("010-1234-5678")
.build();
매우 간단하게 Builder Pattern을 사용할 수 있습니다.
@Builder 주석에 toBuilder = true 속성을 추가하여 객체의 복사본 또는 거의 복사본을 만들 수 있습니다.
이는 Lombok에게 toBuilder() 메소드를 클래스에 추가하도록 지시합니다.
toBuilder() 메서드를 호출하면 호출된 인스턴스의 속성으로 초기화된 빌더가 반환됩니다.
@Builder(toBuilder = true)
@Getter
public class Person {
// 필수 매개변수
private final String name;
private final int age;
// 선택적 매개변수
private final String gender;
private final String address;
private final String phone;
}
Person copiedPerson = Person.builder("김철수", 25)
.gender("남")
.address("서울")
.phone("010-1234-5678")
.build();
// 복사본이 생김
Person.PersonBuilder personBuilder = copiedPerson.toBuilder();
Lombok에 의해 생성 된 빌더 클래스의 이름이 "Builder"가 추가 된 클래스와 같은 이름을 가졌음을 알 수 있습니다.