Backend/Java&Spring

[디자인패턴] 빌더 패턴( Builder Pattern)

JINJINC 2025. 1. 16. 09:53
728x90
반응형

우리가 보통 Lombok이라는 의존성을 추가하여 Builder 클래스를 호출 하여 사용합니다. 이것을 직접 만들어 보도록 하겠습니다.

BuilderPattern

빌더패턴

빌더 패턴(Builder Pattern)은 객체 생성 패턴 중 하나로, 복잡한 객체의 생성 과정을 단계적으로 처리하면서 가독성과 유연성을 높이는 디자인 패턴입니다. 특히, 생성자나 팩토리 메서드의 파라미터가 많거나 객체를 단계적으로 초기화해야 하는 경우에 효과적입니다.

빌더 패턴의 특징

  1. 객체 생성의 분리: 객체의 생성 과정과 표현을 분리하여, 동일한 생성 절차를 통해 다양한 객체를 생성할 수 있습니다.
  2. 가독성 향상: 빌더를 활용하면 코드가 메서드 체이닝 방식으로 읽히기 때문에 가독성이 높아집니다.
  3. 불변성 유지: 빌더 패턴을 사용하면 생성된 객체가 불변(immutable) 상태를 유지할 수 있습니다.

코드예제

package java_design.ch01;

// 빌더 패턴 예제
public class Person {

    private final String name;  // 이름
    private final int age;      // 나이

    // private 생성자: 외부에서 직접 호출할 수 없도록 제한
    private Person(PersonBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }

    // 정적 내부 클래스: Builder 클래스
    public static class PersonBuilder {
        private String name;
        private int age;

        public PersonBuilder() {
            // 기본 생성자
        }

        // 이름 설정 메서드
        public PersonBuilder name(String name) {
            this.name = name;
            return this;  // 메서드 체이닝 지원
        }

        // 나이 설정 메서드
        public PersonBuilder age(int age) {
            this.age = age;
            return this;
        }

        // 최종적으로 Person 객체 생성
        public Person build() {
            return new Person(this);
        }
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }

    public static void main(String[] args) {
        // 빌더 패턴을 이용한 객체 생성
        Person person = new Person.PersonBuilder()
            .name("홍길동")
            .age(25)
            .build();

        System.out.println(person);
    }
}

빌더 패턴의 장점

  1. 가독성: 객체 생성 시 코드가 자연스럽게 읽히며, 직관적입니다.

    Person person = new Person.PersonBuilder()
        .name("홍길동")
        .age(25)
        .build();
  2. 유연성: 생성자에 모든 필드를 전달하지 않아도 되고, 필요한 값만 설정할 수 있습니다.

    Person person = new Person.PersonBuilder()
        .name("이순신")
        .build();
  3. 유지보수 용이성: 새로운 필드가 추가되어도 기존 코드를 수정하지 않고 빌더에만 변경 사항을 반영하면 됩니다.

빌더 패턴을 사용하면 좋은 경우

  1. 매개변수가 많은 경우: 생성자에 많은 파라미터를 전달하면 가독성이 떨어질 수 있습니다. 빌더 패턴은 이를 개선합니다.
  2. 객체의 단계적 생성이 필요한 경우: 객체를 생성하는 과정에서 여러 단계를 거쳐야 할 때 유용합니다.
  3. 불변 객체 생성: 생성 후 변경할 수 없는 객체를 생성할 때 적합합니다.
728x90
반응형