DEVLOG

[Java] 빌더 패턴이란? 본문

Java

[Java] 빌더 패턴이란?

BINTHEWORLD 2022. 11. 16. 23:08

회사 프로젝트 진행 중, JPA 엔티티 객체 생성 시 new 연산자가 아닌 @Builder 어노테이션을 사용해 생성하는 것을 보고 빌더 패턴에 대해 공부해보려한다.

 

우선 빌더 패턴과 자주 비교되는 패턴들을 보며 빌더 패턴을 왜 사용해야 하는지 알아보자.

점증적 생성자 패턴 VS  자바빈즈 패턴 VS 빌더 패턴

1) 점증적 생성자 패턴

// 점증적 생성자 패턴
public class Person{
  private String name;
  private int age; 
  private String gender; 
  
  public Person(String name){ 
     this.name = name;
  }

  public Person(String name, int age){
    this.name = name;
    this.age = age;
  }

  public Person(String name, int age, String gender){
    this.name = name;
    this.age = age;
    this.gender = gender;
  }
}

 // 객체 생성
 Person hyebin = new Person("hyebin", 27, "female"); // 순서와 타입이 보장되어야 하는 불편함

점증적 생성자 패턴은 객체 생성 시 개발자가 해당 객체의 매개변수 순서와 타입을 정확히 맞춰서 입력해야 하는 불편함이 있다. 또한, 매개변수가 늘어날수록 가독성이 굉장히 떨어질 것이다.

2) 자바빈즈 패턴

자바빈즈 패턴은 점증적 생성자 패턴의 단점 중 가독성을 보완할 수 있다.

public class Person{
  private String name;
  private int age;
  private String gender;

  public Person(){
  
  }

  public void setName(String name){
    this.name = name;
  }

  public void setAge(int age){
    this.age = age;
  }

  public void setGender(String gender){
    this.gender = gender;
  }
}

// 객체 생성
Person hyebin = new Person();

Person.setName("hyebin");
Person.setAge(27);
Person.setGender("female");

다만 이러한 자바빈즈 패턴에도 치명적인 단점이 존재하는데, 이는 객체 일관성이 깨진다는 것이다.

완전한 객체란 필수 매개변수가 모두 설정된 객체를 뜻한다. 그런데 만약 필수 매개변수가 모두 설정되지 않은, 즉 객체가 완전히 생성되지 않은 상태에서 객체 생성 코드를 작성한다면 어떻게 될까? 작성할 때나 컴파일 타임에는 이러한 문제를 알 수 없어 디버깅이 어려워지고, 런타임 오류를 발생시킬 것이다. 이외에도 set 메소드 노출로 인한 불변성 문제가 발생할 수 있다.

3) 빌더 패턴

빌더패턴의 주요 장점은 다음과 같다.

 

- 가독성 : 데이터 리딩이 힘든 점증적 생성자 패턴 대신 빌더 패턴을 통해 .age(27) 처럼 어떤 데이터가 어떤 컬럼에 들어가는지 한눈에 파악 가능하다.

- 데이터의 순서에 상관없이 객체 생성 가능
- 객체일관성 보장 : 한 번에 객체를 생성하여 객체일관성이 깨지지 않는다.

- 검증 : build() 함수가 null인지 체크해준다.

 

아래와 같이 롬복이 지원하는 @Builder 어노테이션으로 빌더패턴을 쉽게 만들 수 있다. (생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함할 수 있다.)

@Builder
public class Person {
    private final String name;
    private final int age;
    private final String gender;
}

Person person = Person.builder() // 빌더클래스 생성자
    .name("hyebin")
    .age(27)
    .gender("female")
    .build();

'Java' 카테고리의 다른 글

[Java] String / StringBuffer / StringBuilder  (0) 2022.08.10
[Java] JRE와 JDK  (0) 2022.08.10
[Java] Compiler vs Interpreter  (0) 2022.08.10
[Java] 형변환  (0) 2022.08.04
[Java] 유니코드 인코딩  (0) 2022.08.04
Comments