Builder 패턴와 @Builder

이규훈·2023년 9월 18일
0

스프링 정리

목록 보기
30/30

Builder 패턴

Builder 패턴은 객체 생성과 표현을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 생성할 수 있는 디자인 패턴입니다. 주로 복잡한 객체를 생성할 때 사용됩니다.

왜 Builder 패턴을 사용하는가?

  1. 가독성: 객체 생성 시에 많은 매개변수가 필요한 경우, 각 매개변수가 어떤 역할을 하는지 파악하기 어려울 수 있습니다. Builder 패턴은 이름 있는 메서드 체이닝을 통해 객체를 생성하므로 가독성이 향상됩니다.
  2. 불변성: Builder를 사용하여 객체를 생성한 후, 해당 객체의 상태를 변경할 수 없게 만들 수 있습니다. 이는 객체의 안정성을 보장합니다.
  3. 선택적 매개변수: 일부 속성은 선택적일 수 있습니다. Builder 패턴을 사용하면 선택적 매개변수를 편리하게 설정할 수 있습니다.

예시 코드

public class User {
    private final String firstName; // 필수
    private final String lastName;  // 필수
    private final int age;          // 선택적
    private final String phone;     // 선택적
    private final String address;   // 선택적

    private User(UserBuilder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.age = builder.age;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    public static class UserBuilder {
        private final String firstName;
        private final String lastName;
        private int age;
        private String phone;
        private String address;

        public UserBuilder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }

        public UserBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public UserBuilder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }

    // getters 생략...
}

// 사용 방법
User user = new User.UserBuilder("John", "Doe")
                .age(30)
                .phone("1234567890")
                .address("123 Elm Street")
                .build();

@Builder (Lombok)

Lombok은 Java 코드의 반복적인 부분 (getter, setter, 생성자 등)을 어노테이션을 통해 자동으로 생성해주는 라이브러리입니다. @Builder는 Lombok에서 제공하는 어노테이션 중 하나로, Builder 패턴을 자동으로 구현해줍니다.

동작 방식

  1. @Builder 어노테이션이 클래스, 생성자, 또는 메서드에 추가되면, Lombok은 해당 요소의 매개변수를 기반으로 Builder 클래스를 생성합니다.
  2. 생성된 Builder 클래스에는 해당 객체를 생성하는데 필요한 모든 설정 메서드와 build() 메서드가 포함됩니다.
  3. 컴파일 시에 Lombok은 해당 코드를 바이트 코드로 변환하면서 필요한 Builder 관련 코드를 자동으로 추가합니다.

예시 코드

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class User {
    private final String firstName;
    private final String lastName;
    private final int age;
    private final String phone;
    private final String address;
}

// 사용 방법 (Lombok을 사용하여 간결하게 표현)
User user = User.builder()
                .firstName("John")
                .lastName("Doe")
                .age(30)
                .phone("1234567890")
                .address("123 Elm Street")
                .build();

아스키 아트로 Builder 패턴의 구조

  +------------+     +--------------+
  |   Client   |---->|   Builder    |
  +------------+     +--------------+
                         ^
                         |
          +-----------------------------+
          |                             |
 +--------------+                +--------------+
 | Concrete     |                | Concrete     |
 | Builder1     |                | Builder2     |
 +--------------+                +--------------+
  • Client: 객체를 생성할 필요가 있는 코드.
  • Builder: 모든 구체적인 빌더의 공통 인터페이스.
  • ConcreteBuilder: 특정 표현 방식에 대한 객체 생성 절차를 구현.

그러면 @Builder가 빌더패턴과 연관이 있나?

네, 정확합니다. Lombok의 @Builder 어노테이션은 빌더 패턴과 직접적으로 연관되어 있습니다.

@Builder는 자동으로 빌더 패턴의 코드를 생성해주는 Lombok의 어노테이션입니다. 이 어노테이션을 사용하면 개발자가 수동으로 빌더 패턴 관련 코드를 작성할 필요가 없어져서, 코드의 중복을 줄이고 가독성을 향상시킬 수 있습니다.

빌더 패턴 vs. @Builder

  • 빌더 패턴: 이 패턴은 객체 생성과 표현을 분리하여 복잡한 객체를 생성할 때 사용되는 설계 패턴입니다. 개발자는 빌더 패턴을 수동으로 구현하여 사용합니다.
  • @Builder: Lombok 라이브러리가 제공하는 어노테이션으로, 빌더 패턴의 구현을 자동화합니다. 해당 어노테이션을 클래스나 메서드에 적용하면, Lombok은 빌더 패턴 코드를 자동으로 생성해줍니다.

결론적으로, @Builder는 빌더 패턴을 쉽게 구현하기 위한 도구로 볼 수 있습니다. 개발자는 @Builder를 사용하여 빌더 패턴의 장점을 누릴 수 있으면서도, 복잡한 코드 작성을 피할 수 있습니다.

profile
개발취준생

0개의 댓글

관련 채용 정보