JAVA [디자인패턴] - 빌더 패턴

gustjtmd·2025년 1월 2일

빌더 패턴이란?

빌더 패턴이란 복잡한 객체를 생성하는 방법 중 하나로, 객체의 생성 코드와 객체의 사용코드를 분리하여 코드의 가독성과 유지 보수성을 향상시키는 패턴입니다.

빌더 패턴이 필요한 이유

코드로 확인해보기

public class Person {
    private String name;
    private Integer age;
    private String favoriteColor;
    private String favoriteAnimal;
    private Integer favoriteNumber;

    public Person(String name, Integer age, String favoriteColor, String favoriteAnimal, Integer favoriteNumber){
        this.name = name;
        this.age = age;
        this.favoriteColor = favoriteColor;
        this.favoriteAnimal = favoriteAnimal;
        this.favoriteNumber = favoriteNumber;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public String getFavoriteColor() {
        return favoriteColor;
    }

    public String getFavoriteAnimal() {
        return favoriteAnimal;
    }

    public Integer getFavoriteNumber() {
        return favoriteNumber;
    }

    public String getPerson(){
        String personInfo = String.format("name:%s, age:%d, favoriteColor:%s, favoriteAnimal:%s, favoriteNumber:%d"
                , name, age, favoriteColor, favoriteAnimal, favoriteNumber);
        return personInfo;
    }
}

위와 같이 한 사람의 프로필을 담고있는 person클래스를 만들었다.
생성자를 통해 모든 매개변수를 받도록 하고있는데, 저들 중 좋아하는 색상을 넣고 싶지 않다면 어떻게 해야할까?

객체를 생성할 때 다음과 같이 데이터를 넣을 수 있지만 가독성이 떨어진다

Person person = new Person("홍길동", 20, null, "cat", 7);

이렇게 해서 하나의 케이스에 대해서는 처리를 했지만 하지만 여기에 새로운 유형의 정보가 들어온다면 어떻게 될까
예를 들자면 이름만 있다거나 이름과 좋아하는 동물만 있다거나 하면서요. 그럼 그때마다 새로운 생성자를 만들어 줘야 할까?

가장 큰 문제는 하나 더 있다.

지금은 매개변수가 많지 않아 그럴 경우는 적지만 매개 변수가 많아져서 데이터를 입력하는 순서가 달라진다면 그것도 정말 복잡해질것이다.

// 이름이 들어가야할 곳에 좋아하는 동물이 들어감.
// 반대로 좋아하는 동물이 들어가야 할 곳에 사람 이름이 들어감.
new Person("cat", 20, "JDM", null, null);

이런 경우 찾아내기도 힘들뿐더러 매번 사용자가 체크를 해야하는 상황이 온다. 조금 더 명시적이고 명확하게 객체를 만들어낼 순 없을까? 이제 빌더 패턴을 적용 해보자.

// @Data 혹은 @Getter, @Setter 등등
@Builder //LomBok 라이브러리 사용
@AllArgsConstructor // 모든 인자를 가진 생성자 생성
@NoArgsConstructor // 인자가 없는 생성자 생성
public class Person {

    private String name;
    private int age;
    private String favoriteColor;
    private String favoriteAnimal;
    private Integer favoriteNumber;
    
}
Person person = Person.Builder()
                .name("홍길동")
                .age(20)
                .favoriteColor("빨강")
                .favoriteAnimal("고양이")
                .favoriteNumber(7)
                .build();

사용자 입장에서 빌더 패턴을 적용하지 하였을때 가독성이 좋고 명확하게 이해하고 만들어 낼 수 있다.

이를 통해 다음과 같은 장점을 얻을 수 있다.

  • 필요한 데이터만 설정할 수 있다.
  • 가독성이 좋고 명확하게 이해 할 수 있다.
  • 유연성과 불변성을 확보 할 수 있다.

간단하게 디자인패턴 중 Builder 패턴이 왜 필요한지를 알아보고 사용해 보았다!

profile
반갑습니다

0개의 댓글