Builder 패턴이란?

빌더 패턴은 생성과 관련된 디자인 패턴 중 하나로, 생성과 관련된 문제를 해결하고자 고안된 패턴이다. 

객체를 생성할 때 생성자 패턴, 정적 메소드 패턴, 수정자 패턴, 빌더 패턴 등을 사용할 수 있다.

 


빌더 패턴(Builder Pattern)을 사용해야 하는 이유

@Getter
@ToString
@NoArgsConstructor
public class PostCreate {

    @NotBlank(message = "제목을 입력해주세요.")
    private String title;

    @NotBlank(message = "내용을 입력해주세요.")
    private String content;
    
    public PostCreate(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

 

객체에서 생성자가 필요할 때 보통 이렇게 코드를 작성하곤 하지만 이는 잠재적 버그를 내포하는 코드이다.

위와 같이 매개변수로 받는 두 필드 값의 타입이 같을 때 만약 순서가 달라지면 어떻게 될까?

누군가 실수로 이 생성자를 이용해 content, title 순으로 매개변수를 입력해도 개발자는 쉽게 발견하기 어렵다.

이런 코드들은 나중에 코드 길이가 길어지면 쉽게 발견하기 어려운 버그가 되곤 한다.

 

[ 빌더 패턴(Builder Pattern)의 장점 ]

  1.  필요한 데이터만 설정할 수 있다.
  2.  가독성을 높일 수 있다.
  3.  불변성을 보장할 수 있다.

 

1. 필요한 데이터만 설정할 수 있다.

@Getter
@ToString
@NoArgsConstructor
public class PostCreate {

    @NotBlank(message = "제목을 입력해주세요.")
    private String title;

    @NotBlank(message = "내용을 입력해주세요.")
    private String content;

    @Builder
    public PostCreate(String title, String content) {
        this.title = title;
        this.content = content;
    }
}
PostCreate request = PostCreate.builder()
            .content("글 내용입니다 하하")
            .build();

PostCreate request = PostCreate.builder()
            .title("글 제목입니다")
            .content("글 내용입니다 하하")
            .build();

빌더 패턴을 사용하면 위처럼 원하는 필드에 값을 넣을 수도 있고 필요없으면 해당 필드를 입력하지 않을 수도 있다.

 

2. 가독성을 높일 수 있다.

PostCreate postCreate = new PostCreate("글 내용입니다 하하", "글 제목입니다");

PostCreate request = PostCreate.builder()
            .title("글 제목입니다")
            .content("글 내용입니다 하하")
            .build();            
                      
PostCreate request = PostCreate.builder()
            .content("글 내용입니다 하하")
            .title("글 제목입니다")            
            .build();

맨 위처럼 생성자 패턴을 사용하면 내용과 제목의 순서를 반대로 입력하는 문제가 생길 수 있다.

이로 인해 버그가 발생한다면 이런 버그는 찾아내기가 정말 힘들다.

하지만 빌더 패턴을 사용하면 두번째와 세번째 경우처럼 순서를 반대로 쓰더라도

입력하는 필드값이 명확하므로 문제가 없다.

요즘엔 IDE 가 필드에 해당하는 힌트를 주기는 하지만 입력할 변수가 많아지면 그마저도 효용이 떨어진다.

특히나 혼자 개발하는게 아닌 협업을 하는 상황에서는 이런 가독성의 차이가 극명하게 느껴진다.

 

3. 불변성을 보장할 수 있다.

@Getter
@ToString
@NoArgsConstructor
public class PostCreate {

    @NotBlank(message = "제목을 입력해주세요.")
    private String title;

    @NotBlank(message = "내용을 입력해주세요.")
    private String content;

    @Builder
    public PostCreate(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

위처럼 Setter 를 닫아놓고 생성자를 통해서만 객체에 접근이 가능하게 만들면 객체의 불변성을 보장할 수 있다.

불변성을 보장하는건 생성자 패턴과도 공통된 장점이다.

 


결론

객체를 생성하는 대부분의 경우에는 빌더 패턴을 적용하는것이 바람직하다.

하지만 빌더의 남용은 오히려 코드 길이를 비대하게 할 수 있으므로 변경 가능성 및 변수의 개수를 보고 판단하자.

변경 가능성이 전혀 없고 변수의 개수가 적다면 굳이 사용하지 않아도 된다.

 

 

'언어 > Java' 카테고리의 다른 글

GC와 JVM 메모리 영역  (0) 2024.02.14

+ Recent posts