6. 빌더 패턴 (Builder Pattern)

서주홍's avatar
Aug 14, 2024
6. 빌더 패턴 (Builder Pattern)
💡
Builder 패턴은 객체를 생성할 때 가독성을 높이고, 실수를 줄이기 위한 디자인 패턴입니다. 특히, 필드가 많은 객체를 생성할 때 유용합니다.
 

■ 1. 엔티티와 VO(Value Object)

  • 엔티티(Entity)
    • 데이터베이스의 테이블에 대응되는 클래스입니다.
    • 자바에서는 데이터베이스의 테이블과 동일한 내용물을 가진 클래스를 엔티티라고 부릅니다.
    •  
  • VO(Value Object)
    • 단순히 데이터를 들고 있는 객체로, 불변(immutable) 상태로 다룰 때 주로 사용합니다.
    • 값의 동일성을 기준으로 동등성을 비교합니다.
 

■ 2. Builder 패턴의 필요성

  • 생성자(Constructors)
    • 필드가 많을 경우, 생성자 오버로딩(overloading)을 통해 다양한 경우의 객체 생성을 지원해야 합니다.
    • 이로 인해 코드가 복잡해지고, 생성자 호출 시 파라미터의 순서를 혼동하여 실수할 가능성이 높습니다.
  • Builder 패턴
    • Builder 패턴은 객체 생성 시 메서드 체이닝(Method Chaining)을 통해 필드의 값을 설정하며,
    • 필드의 순서와 상관없이 객체를 생성할 수 있습니다.
    • 이를 통해 가독성이 높아지고, 실수가 줄어듭니다.
 

■ 3. Builder 패턴의 장점

  • 순서의 자유
    • 필드의 값을 설정하는 순서에 상관없이 객체를 생성할 수 있습니다.
    •  
  • 가독성
    • 필드 이름을 명시적으로 지정하기 때문에, 어떤 필드에 어떤 값을 설정하는지 명확하게 알 수 있습니다.
    •  
  • 오버로딩 제거
    • 필드의 개수나 조합에 따라 생성자를 오버로딩할 필요가 없어집니다.
    •  
  • 기본형과 참조형
    • 기본형 변수는 null 값을 가질 수 없으므로,
    • Builder 패턴을 사용할 때는 기본형 대신 래퍼 클래스(Integer, Boolean 등)를 사용하는 것이 좋습니다.
 

■ 4. 예제 코드

package ex09_builder_pattern; public class Person { private Integer id; private String name; private Integer age; private String email; // private 생성자: 외부에서 직접 객체를 생성할 수 없도록 막습니다. private Person() {} // static 메서드를 통해 Person 객체를 생성하고 반환합니다. public static Person builder() { return new Person(); } // 메서드 체이닝을 통해 필드의 값을 설정합니다. public Person id(Integer id) { this.id = id; return this; // 현재 객체를 반환하여 메서드 체이닝을 가능하게 합니다. } public Person name(String name) { this.name = name; return this; } public Person age(Integer age) { this.age = age; return this; } public Person email(String email) { this.email = email; return this; } // Getter 메서드들 public Integer getId() { return id; } public String getName() { return name; } public Integer getAge() { return age; } public String getEmail() { return email; } }
  • 위의 Person 클래스는 Builder 패턴을 구현한 예제입니다.
  • 여기서 중요한 점은 Person 객체의 생성자를 private으로 만들어 외부에서 직접 객체를 생성하지 못하도록 제한한 것입니다.
  • 대신, builder() 메서드를 통해 객체를 생성하고, 필요한 필드만 선택적으로 설정할 수 있습니다.
 

■ 4.1 예제 코드2

package ex09_builder_pattern; public class App { public static void main(String[] args) { // 빌더 패턴을 사용하여 Person 객체를 생성합니다. Person p1 = Person.builder() .id(1) .name("홍길동") .age(20) .email("dong@nate.com"); // 일부 필드만 설정할 수도 있습니다. Person p2 = Person.builder() .name("홍길동") .email("dong@nate.com"); // p2 객체의 age 필드는 설정하지 않았으므로 null입니다. System.out.println(p2.getAge()); // 출력: null } }
  • 위의 App 클래스는 Person 객체를 생성하는 예제입니다.
  • Builder 패턴을 통해 객체를 생성할 때, 원하는 필드만 설정할 수 있으며,
  • 설정하지 않은 필드는 null 값으로 남습니다.
  • 이렇게 함으로써 객체 생성 시 필드의 순서와 상관없이 명확하게 값을 설정할 수 있습니다.
 

■ 5. 정리

  • Builder 패턴은 객체 생성 시 메서드 체이닝을 통해 필드를 설정하며,
  • 가독성과 안전성을 높입니다. 특히 필드가 많은 클래스에서 유용하며,
  • 생성자 오버로딩 문제를 해결하는데 효과적입니다.
Share article

maestrojava