본문 바로가기

PROGRAMMING/JAVA

[JAVA] Builder 패턴

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 패턴이란?

빌더 패턴이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다.

 

왜 사용하는가에 대한 답은 코드로 간단하게 설명된다.

 

적용 전

단순 constuctor를 활용한 객체 생성

적용 후

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