티스토리 뷰

Java+Spring/Java

[Java]빌더 패턴(Builder Pattern)

Vagabund.Gni 2022. 9. 28. 22:21
728x90
반응형

빌더 패턴(Builder Pattern)다양한 조건의 객체를 손쉽게 만들어내기 위한 디자인 패턴, 그중에서도 생성 패턴이다.

 

디자인 패턴이라 함은 쉽게 말해 재사용 가능한 일종의 솔루션이라는 뜻이며,

 

생성 패턴객체 생성 절차를 추상화하는 패턴이라는 뜻이다.

 

구체적으로 빌더 패턴은 생성자를 거치지 않고 빌더라는 내부 클래스를 통해 간접적으로 인스턴스를 생성하는 방식이다.

 

위키백과에는 이를 생성 과정과 표현 방법을 분리하는 패턴이라고 표현하고 있기도 하다.

 

이는 특히 대상 클래스가 복잡해지고 요구사항이 늘어날수록 빛을 발하게 되는데, 그 이유는 아래와 같다.

 

  • 대상 클래스의 생성자를 private으로 묶고 간접적으로 인스턴스를 생성 → 결합도를 낮춰 수정 및 유지보수가 편해짐
  • 뛰어나고 직관적인 가독성으로 요소에 담긴 의미를 쉽게 파악 가능

그럼 계속해서 코드 레벨에서 빌더 패턴의 장점에 대해 살펴보자.

 

위의 그림과 같이 패스트푸드점에서 햄버거 세트를 주문받는 상황이라고 치면 아래와 같은 클래스를 구성할 수 있다.

@AllArgsConstructor
@NoArgsConstructor
public class Meal {

    private String burger;
    private String side;
    private String drink;

}

어떤 세트를 주문받건 이 틀에서 크게 벗어나지 않을 것이다.

 

그러다 한 손님이 세트에서 사이드 메뉴를 뺐다고 치자.

 

이런 경우 생성자를 이용하면 아래와 같이 필요 없는 요소에 더미 데이터를 넣거나 생성자를 새로 만들어야 한다.

Meal meal = new Meal("Cheese Burger", "", "Diet Coke"); // 더미 데이터 추가


public Meal(String burger, String drink) { // 생성자 추가
    this.burger = burger;
    this.drink = drink;
}

처음은 간단하지만 프로젝트의 규모가 커지고 요구사항이 복잡해질수록 변경과 적용이 힘들어질 것이다.

 

빌더 패턴은 이를 간단하게 처리한다.

 

먼저 빌더 패턴을 사용하기 위해 애너테이션을 추가한다.

@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Meal {

    private String burger;
    private String side;
    private String drink;

}

계속해서 빌더 패턴을 이용해 객체를 생성한다.

Meal meal = Meal.builder()
        .burger("Cheese Burger")
        .drink("Diet Coke")
        .build();

불필요한 코드를 늘리지 않으면서도 문제를 간단히 처리하고, 가독성 역시 좋아진 것을 확인할 수 있다.

 

이는 Setter 메서드를 사용하지 않아 객체의 변경 가능성을 최소화할 수 있으며,

 

위와 같이 주문을 줄이는 것 뿐 아니라 추후에 매개변수를 추가하게 되더라도

 

빌드 패턴으로 만들어진 객체는 건드릴 필요가 전혀 없게 된다.

 

가능하면 객체 생성시에 빌더 패턴을 적용할 수 있도록 하자.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함