본문 바로가기
Java

Builder 패턴이란? ( + 개념/장점/애너테이션/적용법/예시 )

by yapdol 2023. 9. 2.

 

 

 

 

 

 

 

 

 

 

✅ Builder 패턴이란?

- GoF 디자인 패턴 중 *생성 패턴에 해당.

- 객체를 생성 방법과 표현 방법을 분리하여, 동일한 절차에서도 서로 다른 표현을 생성하는 방법 제공.

  → 생성자를 가독성 좋게 만들어주는 도구.

- builder() 메서드를 통해 셋팅하고자하는 값을 직접 세팅.

* 생성 패턴 : 인스턴스를 만드는 절차를 추상화한 패턴.

 

📌 Builder 패턴 사용 이유

: 객체 생성을 가독성있고 유연하게 적용하기 위해 사용.

→ 생성자 인자가 많을 때, 빌터 패턴 적용 (Effective Java 2 中)

 

 

 

 

✅ Builder 패턴 장점

 

📌 1. 필요한 데이터만 설정 가능

  • 생성자로 객체를 생성할 시, 특정 인자를 사용하지 않고 싶으면 해당 인자에 더미 값을 넣거나, 해당 인자가 없는 생성자를 새로 만들어야하지만, 빌더 패턴을 사용하면 불필요한 인자를 빼고 객체를 생성할 수 있다.
  • 더미값을 넣는 방법
// 1. 더미 값
User user = new User("홍길동", 0, 50);

 

  • 새로운 생성자를 추가하는 방법
// 2. 새로운 생성자 추가

@NoArgsConstructor
@AllArgsConstrctor
public class User{
    private String name;
    private int age;
    private int weight;

    public User(String name, int weight){
        this.name = name;
        this.weight = weight;
    }
}

 

  • 빌더 패턴 사용
// 3. 빌더 패턴 사용
User user = User.builder()
        .name("홍길동")
        .weight(50)
        .build();

 

📌 2. 유연성 확보 가능.

  • 생성자로 객체를 만들면 새로운 객체 추가 시, 기존 모든 코드를 수정해야하지만, 빌더패턴을 사용하면 새로운 변수가 추가되어도 기존의 코드에 영향을 주지 않음.
  •  데이터 순서에 상관없이 객체 생성 가능.

 

📌 3. 가독성 향상.

  • 명시적 선언으로 각 인자가 어떤 의미인지 이해하기 쉽다.
  • 불필요한 생성자를 제거할 수 있다.

 

📌 4. 불변성 확보 가능.

  • setter 가 없으므로 변경 불가능한 객체를 만들수 있다. (객체불변성)많은 개발자들이 setter 패턴을 사용하는데, 이는 불필요하게 확장가능성을 열어두는 것이다.그러므로, 클래스 변수를 final로 선언 / 객체생성은 빌더를 쓰는 것이 좋다.
@RequiredArgsConstructor
@Builder
public class User{
    private final String name;
    private final int age;
    private final int weight;
}

 

 

 

 

 

✅  Builder 패턴 적용법 ( + @Builder 애너테이션 / 예시 )

@Builder

: 빌더를 적용하고 싶은 클래스 or 생성자 위에 @Builder 애너테이션을 붙이면 간단하게 빌더 패턴 사용 가능.

  하지만 lombok documents 에서는 @Builder를 생성자에 추가하라고 명시하고 있음.

 

  • 클래스 전체에 Builder 적용
// 클래스에 빌더 애너테이션 적용.
@Getter
@Builder 
public class Pesron {
    private String name;
    private int age ;
    private int weight;
}
// 구성한 빌더를 통해 호출 수행.
    Person person = Person.builder()
              .name("홍길동")
              .age(20)
              .weight(50)
              .build();

 

  • 특정 생성자에만 Builder 적용
// name, age 만 인자로 받는 생성자에만 빌더 적용.
@Getter
public class Person {

    private String name;
    private int age ;
    private int weight;

    @Builder // name, age 만 빌더 사용 가능
    public Person (String name, ing age) {
        this.name = name;
        this.age = age;
    }

    public Person (String name, int age, int weight) {
        this.name = name;
        this.age = age;
        this.weight = weight
    }
}
// 구성한 빌더를 통해 최종 호출 (객체 생성)
Person person = Person.builder()
           .name("홍길동")
           .age(20)
           .build();
    }

 

 

참고자료:

https://pamyferret.tistory.com/67

https://velog.io/@bey1548/JAVA-%EB%B9%8C%EB%8D%94-%ED%8C%A8%ED%84%B4Builder-Pattern%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

https://velog.io/@midas/Builder-%ED%8C%A8%ED%84%B4-%ED%95%84%EC%9A%94%EC%84%B1%EA%B3%BC-%EC%82%AC%EC%9A%A9%EB%B2%95