본문으로 바로가기

java..builder() 패턴

category 카테고리 없음 2023. 8. 14. 17:18
반응형

java 언어를 사용하여 개발을 할 때, 어떤 객체의 인스턴스를 만들어 사용해야 하는 경우가 많습니다.

어떤 객체의 인스턴스를 만들어 사용하는 방법에는 여러가지가 있을 수 있는데, 여기서는 'new'를 이용하여 인스턴스를 만드는것과 builder 패턴을 이용하여 인스턴스를 받아 사용하는 방법에 대해 설명하겠습니다.

new 키워드를 사용하여 인스턴스를 생성하는 것과 빌더 패턴을 사용하여 인스턴스를 생성하는 것은 다른 방식입니다. 둘 다 객체를 생성하는 목적은 같지만, 사용 방법과 적용 상황에 차이가 있습니다.

ㅇ new 키워드 사용:
직접 생성: 생성자를 직접 호출하여 인스턴스를 만듭니다.
단순함: 인자가 몇 개 없고 생성 로직이 간단한 경우 사용하기 적합합니다.
유연성 부족: 많은 선택적 인자가 있는 경우 생성자 오버로딩이 복잡해질 수 있으며, 코드 가독성이 떨어질 수 있습니다.
ㅇ 빌더 패턴 사용:
간접 생성: 빌더 객체를 통해 인스턴스를 단계별로 만듭니다. 내부에서는 new를 사용할 수 있으나, 클라이언트는 빌더의 메서드를 통해 인스턴스를 구축합니다.
유연성: 많은 선택적 인자와 복잡한 초기화 로직을 잘 다룰 수 있습니다.
가독성: 각 단계에서 어떤 인자가 설정되는지 코드로 명확하게 표현될 수 있으므로 가독성이 좋습니다.

예를 들어, new를 사용하면 다음과 같이 생성할 수 있습니다:

AA aa = new AA("someValue", "someid");

빌더 패턴을 사용하면 다음과 같이 생성할 수 있습니다:

AA aa = AA.builder().dtm("someValue").nadid("someid").build();

빌더 패턴은 선택적 인자가 많거나, 인스턴스 생성 과정이 복잡하거나, 더 명확한 코드를 원하는 경우에 특히 유용합니다.

 

빌더 패턴을 사용하려면 일반적으로 빌더 클래스를 정의하고, 해당 클래스 내에 필요한 필드와 메서드를 구현해야 합니다. 다음은 빌더 패턴을 사용하는 기본적인 방법을 설명합니다:

1. 빌더 클래스 정의
빌더 클래스는 보통 대상 클래스 내에 정적 내부 클래스로 정의됩니다. 이 클래스는 대상 클래스의 모든 필드에 대한 설정 메서드를 제공하고, build 메서드를 통해 최종 객체를 생성합니다.

2. 대상 클래스에 빌더 메서드 추가
빌더 객체를 생성하기 위한 정적 메서드를 대상 클래스에 추가합니다.

3. 예제 구현

public class Person {
    private String firstName;
    private String lastName;
    private int age;

    private Person(Builder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.age = builder.age;
    }

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

    public static class Builder {
        private String firstName;
        private String lastName;
        private int age;

        public Builder firstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder lastName(String lastName) {
            this.lastName = lastName;
            return this;
        }

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

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

위 예제를 통한 객체 생성 예제

Person person = Person.builder()
                      .firstName("John")
                      .lastName("Doe")
                      .age(30)
                      .build();

주의사항
빌더 클래스 내의 메서드는 보통 해당 빌더 인스턴스를 반환함으로써 체이닝(chaining)을 가능하게 합니다.
선택적 필드는 빌더 패턴을 사용함으로써 간편하게 다룰 수 있으며, 필수 필드는 생성자나 별도의 검증 로직을 통해 관리할 수 있습니다.
빌더 패턴은 주로 많은 인자를 받아야 하는 객체의 생성이 필요한 경우에 유용합니다.
빌더 패턴을 사용하면 클라이언트 코드가 더 깔끔하고 유연해지며, 특히 많은 선택적 인자를 다룰 때 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

===> 위 과정을 Lombok 라이브러리를 통해 쉽게 사용하기

Lombok 라이브러리의 @Builder 어노테이션은 빌더 패턴을 자동으로 구현해주는 기능을 제공합니다. 수동으로 빌더 패턴을 작성하는 것은 상당히 번거로울 수 있는데, Lombok의 @Builder를 사용하면 이 과정을 크게 단순화할 수 있습니다.

사용 방법
@Builder 어노테이션을 클래스, 생성자, 또는 메서드에 붙임으로써 빌더 패턴을 적용할 수 있습니다.

import lombok.Builder;

@Builder
public class Person {
    private String firstName;
    private String lastName;
    private int age;
}

이렇게 하면 Lombok은 컴파일 시에 빌더 패턴을 위한 필요한 코드를 자동으로 생성합니다. 생성된 빌더를 사용하는 코드는 다음과 같이 작성할 수 있습니다.

Person person = Person.builder()
                      .firstName("John")
                      .lastName("Doe")
                      .age(30)
                      .build();

주요 특징
코드 간결화: @Builder를 사용하면 수동으로 작성해야 하는 빌더 클래스, 설정 메서드, build 메서드 등의 코드를 자동으로 생성해줍니다.
유연성: 특정 필드에 대한 빌더 설정을 커스터마이징하거나, 빌더 클래스의 이름을 변경하고 싶은 경우 등에 대응하기 위해 @Builder 어노테이션의 여러 속성을 사용할 수 있습니다.
컴파일 시 생성: Lombok은 컴파일 시에 필요한 코드를 생성하므로, 실행 시에 성능에 영향을 주지 않으며, 런타임 의존성도 없습니다.
주의할 점
IDE 플러그인: 일부 IDE는 Lombok과 관련된 코드를 올바르게 처리하기 위해 특별한 플러그인이 필요할 수 있습니다.
문서화와 유지보수: 자동 생성된 코드는 소스 코드 내에 직접 나타나지 않으므로, 개발팀이 Lombok의 동작 방식을 잘 이해하고 있어야 하며, 문서화에도 주의를 기울여야 할 수 있습니다.
Lombok의 @Builder 어노테이션은 빌더 패턴을 빠르고 간편하게 적용하고자 하는 경우 유용한 도구입니다.

반응형