본문 바로가기
Java

[JAVA] 빌더(builder)

by goblin- 2024. 9. 24.

빌더 패턴 (Builder Pattern)

 

빌더 패턴은 객체 생성 시, 복잡한 생성자를 대체하고 가독성 및 유지보수성을 높이기 위한 디자인 패턴입니다. 특히, 매개변수가 많거나, 특정 설정이 필요한 경우 객체 생성 과정을 더 유연하게 처리할 수 있게 해줍니다.

 

빌더 패턴의 주요 특징

 

1. 유연한 객체 생성: 필수적인 값만 설정하고, 선택적인 값은 나중에 설정할 수 있는 유연성을 제공합니다.

2. 가독성 향상: 복잡한 생성자 호출 방식보다 각 매개변수를 명시적으로 설정하여 코드를 더 읽기 쉽게 만듭니다.

3. 불변 객체(Immutable Object) 생성: 빌더 패턴은 한 번 설정된 값이 변하지 않는 불변 객체를 만드는 데 매우 유용합니다.

4. 유지보수성 향상: 매개변수가 많아지거나 변경될 때도 쉽게 확장하거나 수정할 수 있습니다.

 

빌더 패턴의 사용 시점

 

생성자의 매개변수가 많은 경우 (특히 4개 이상)

객체의 속성이 많고, 이를 단계별로 설정해야 할 경우

불변 객체(Immutable Object)를 만들고자 할 때

객체 생성의 가독성을 높이고, 유지보수성을 향상시키고 싶을 때

 

빌더 패턴의 구조

 

빌더 패턴은 보통 두 가지 주요 클래스로 구성됩니다:

 

1. 주 클래스(Main Class): 객체의 속성을 포함한 실제 클래스입니다. 생성자는 private로 설정되어, 외부에서 직접 객체를 생성할 수 없도록 합니다.

2. 빌더 클래스(Builder Class): 주 클래스의 인스턴스를 생성하기 위해 속성을 설정하는 클래스입니다. 각 필드에 대한 setter와 같은 메서드가 제공되며, 최종적으로 build() 메서드를 호출하여 주 클래스를 반환합니다.

 

구조 예시:

public class User {
    private final String name;
    private final int age;
    private final String email;

    // private 생성자
    private User(UserBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.email = builder.email;
    }

    // 빌더 클래스
    public static class UserBuilder {
        private String name;
        private int age;
        private String email;

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

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

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

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

빌더 패턴의 장점

 

1. 유연성: 객체 생성 과정에서 불필요한 매개변수를 넣지 않고, 원하는 속성만 설정할 수 있습니다.

2. 가독성: 각 속성을 별도로 설정할 수 있으므로, 생성자에 많은 매개변수를 전달하는 것보다 더 직관적입니다.

3. 불변성: 생성된 객체가 한 번 설정되면 변경되지 않는 불변 객체를 만들 수 있어 안전합니다.

4. 유지보수성: 매개변수가 추가되거나 변경될 때 코드를 쉽게 수정할 수 있습니다.

 

빌더 패턴 사용 예시

public class Main {
    public static void main(String[] args) {
        User user = new User.UserBuilder()
                        .setName("John")
                        .setAge(30)
                        .setEmail("john@example.com")
                        .build();

        System.out.println("User: " + user);
    }
}

스프링과 빌더 패턴

 

빌더 패턴은 스프링에 국한되지 않고 자바에서 독립적으로 사용할 수 있는 패턴입니다. 하지만 스프링에서는 DTO(Data Transfer Object)나 엔티티(Entity)를 만들 때 주로 사용됩니다. 또한, Lombok 라이브러리의 @Builder 어노테이션을 사용하면 빌더 패턴을 자동으로 생성할 수 있어 더 간편하게 사용할 수 있습니다.

 

Lombok을 사용한 빌더 패턴 예시

import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class User {
    private String name;
    private String email;
}

 

Lombok 빌더 사용:

User user = User.builder()
                .name("Jane")
                .email("jane@example.com")
                .build();

 

 

정리

 

빌더 패턴은 객체 생성을 단계적으로 처리하고, 가독성을 높이며, 선택적 매개변수 처리를 쉽게 하는 디자인 패턴입니다.

자바에서 독립적으로 사용 가능하며, 스프링에서도 DTO나 엔티티 생성 시 자주 사용됩니다.

Lombok을 활용하면 빌더 패턴을 자동으로 생성하여 더 간결하게 사용할 수 있습니다.

 

빌더 패턴은 복잡한 객체 생성 과정에서 필수적인 도구이며, 자바의 다른 패턴과 비교해도 매우 직관적이고 유지보수에 유리한 패턴입니다.

'Java' 카테고리의 다른 글

[Java] Generic  (1) 2024.09.28
[JAVA] Static  (0) 2024.09.24
[JAVA] 예외처리(Exception)  (0) 2024.09.24
[JAVA] 자바의 동작원리(JVM, JRE, JDK)  (0) 2024.09.24
[JAVA] 자바의 기본 구조  (1) 2024.09.24