Java

Builder 패턴

DoRightting 2024. 7. 22. 20:32

1. Builder 패턴

Builder 패턴은 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴입니다.

1.1 수동 구현 예시

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

    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 name(String name) {
            this.name = name;
            return this;
        }

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

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

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

    public static UserBuilder builder() {
        return new UserBuilder();
    }
}

1.2 사용 예시

User user = User.builder()
                .name("John")
                .age(30)
                .email("john@example.com")
                .build();

1.3 장점

  1. 가독성: 객체 생성 코드가 어떤 필드에 어떤 값을 설정하는지 명확히 볼 수 있습니다.
  2. 유연성: 선택적 매개변수가 많은 경우에 유용합니다. 필요한 필드만 설정할 수 있습니다.
  3. 불변성: 객체를 불변으로 만들 수 있습니다.
  4. 유효성 검사: build() 메서드에서 객체 생성 전에 유효성 검사를 수행할 수 있습니다.

2. @Builder 어노테이션 (Lombok)

@Builder는 Lombok 라이브러리에서 제공하는 어노테이션으로, 빌더 패턴을 자동으로 구현해줍니다.

2.1 사용법

import lombok.Builder;

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

2.2 사용 예시

User user = User.builder()
                .name("John")
                .age(30)
                .email("john@example.com")
                .build();

2.3 주요 특징

  • 모든 필드에 대한 빌더 메서드를 자동 생성
  • 클래스 레벨에 적용하면 모든 필드를 포함하는 빌더를 생성
  • 생성자에 적용하면 해당 생성자의 매개변수만을 위한 빌더를 생성

3. 주의사항

  • 클래스에 필드가 많은 경우 빌더 클래스도 커질 수 있습니다.
  • Lombok의 @Builder를 사용할 경우, IDE에 Lombok 플러그인을 설치해야 코드 어시스트 등이 정상 작동합니다.

4. 결론

Builder 패턴은 특히 많은 필드를 가진 복잡한 객체를 생성할 때 유용하며, 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다. Lombok의 @Builder 어노테이션을 사용하면 보일러플레이트 코드를 줄이고 빠르게 Builder 패턴을 구현할 수 있습니다.