https://ko.wikipedia.org/wiki/%EB%B9%8C%EB%8D%94_%ED%8C%A8%ED%84%B4
빌더 패턴 - 위키백과, 우리 모두의 백과사전
빌더 패턴이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. 2 단어 요약 : 생성자 오버로딩 /** "Product" */ class Pizza {
ko.wikipedia.org
Builder 패턴이란?
빌더 패턴이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다.
왜 사용하는가에 대한 답은 코드로 간단하게 설명된다.
적용 전

적용 후

단순 생성자를 활용해 객체를 생성하다보면 몇번째 파라미터에 뭐가 와야됬는지 해깔리며
추후 유지보수시에 가독성도 떨어진다.
가독성 뿐 아니라 유연하게 전체가 아니라 원하는 파라미터만 세팅을 할 수 있다는 장점이 있다.
만약 List 필드가 있다면 @Singular 어노테이션을 필드에 추가해 아래와 같이 하나씩도 추가가 가능하다.
Person.builder()
.job("Mythbusters")
.job("Unchained Reaction")
.build();
그렇다면 어떻게 빌더 패턴을 적용할 수 있을까?
가장 간단한 방법은 Lombok의 @Builder 어노테이션을 사용하는 것이다.
Gradle Lombok 추가하기
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
https://projectlombok.org/features/Builder
@Builder
projectlombok.org
직접 구현하는 방법
@Schema(description = "사용자 DTO")
public class UserDto {
@NotNull
@Schema(description = "사용자 아이디")
private String userId;
@NotNull
@Schema(description = "사용자 이름")
private String name;
@NotNull
@Schema(description = "사용자 주민번호")
private String regNo;
public UserDto() {
}
static class Builder{
private String userId;
private String name;
private String regNo;
public Builder(String username){
this.userId = username;
}
public Builder setName(String name){
this.name = name;
return this;
}
public Builder setRegNo(String regNo){
this.regNo = regNo;
return this;
}
public UserDto build(){
UserDto userDto = new UserDto();
userDto.userId = userId;
userDto.name = name;
userDto.regNo = regNo;
return userDto;
}
}
Lombok을 사용하지 않으면 필드가 많아질 수록 코드가 길어지게 되는 단점이 있다.
또한 롬복을 사용하더라도 눈에 보이지 않을 뿐 Builder라는 객체가 하나 더 생성되기 때문에
필드가 많거나 선택적으로 생성해야할 경우 적용하는것이 조금 더 적절한 Builder 패턴의 적용으로 보인다.
'PROGRAMMING > JAVA' 카테고리의 다른 글
| [JAVA] AtomicInteger (0) | 2024.04.09 |
|---|---|
| [JAVA] Stream을 활용해 Array를 List로 변환하기 (0) | 2021.11.24 |
| [JAVA] Scanner와 BufferedReader (0) | 2021.11.21 |
| [JAVA] Collection Set/Map/List (0) | 2021.11.21 |
| [JAVA] Set, List -> Array로 변환 (0) | 2021.11.05 |