Published 2022. 8. 29. 20:50

Builder 패턴이란?

Effective Java 규칙 2 - 조슈아 블로크

    생성자에 인자가 많을 때는 빌더 패턴을 고려하라

 

빌더 패턴(Builder pattern) 이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. (출처: 위키백과)

 

빌더 패턴의 장점

1. 객체들마다 들어가야할 인자가 각각 다를 때 유연하게 사용할 수 있다.


2. 무조건 setter 생성을 방지하고 불변객체로 만들 수 있다.


3. 필수 argument를 지정할 수 있다.(보통의 경우, PK 역할을 할 Id 값이 될 것이다.)

 

 

Builder 패턴은 어떻게 작성하나?

이 페이지를 들어가면 명확하게 빌더 패턴을 어떻게 작성해야하는지 알 수 있다. 빌더 패턴 예제코드

 

Java 사용자라면 잘 아는 StringBuilder가 이 빌더 패턴으로 작성된 라이브러리다.

 

 

 

근데 클래스를 만들 때마다 이 기나긴 코드를 짜기 불편하다!

그래서 Java 개발자들의 보일러플레이트 코드를 획기적으로 줄여준 라이브러리인 Lombok을 활용해보자.

 

바로 @Builder 애노테이션 을 사용하면 예제코드처럼 긴 코드를 작성하지 않아도 된다.

 

 

 

Builder 패턴을 적용할 클래스

@AllArgsConstructor(access = AccessLevel.PRIVATE)
    @Builder(builderMethodName = "travelCheckListBuilder")
    @ToString
    public class TravelCheckList {

        private Long id;
        private String passport;
        private String flightTicket;
        private String creditCard;
        private String internationalDriverLicense;
        private String travelerInsurance;

        public static TravelCheckListBuilder builder(Long id) {
            if(id == null) {
                throw new IllegalArgumentException("필수 파라미터 누락");
            }
            return travelCheckListBuilder().id(id);
        }
    }

 

 

확인용 클래스

 public class MainClass {

        public static void main(String[] args) {
            // 빌더패턴을 통해 어떤 필드에 어떤 값을 넣어주는지 명확히 눈으로 확인할 수 있다!
            TravelCheckList travelCheckList = TravelCheckList.builder(145L)
                    .passport("M12345")
                    .flightTicket("Paris flight ticket")
                    .creditCard("Shinhan card")
                    .internationalDriverLicense("1235-5345")
                    .travelerInsurance("Samsung insurance")
                    .build();

            System.out.println("빌더 패턴 적용하기 : " + travelCheckList.toString());

        }

       // 결과
       // 빌더 패턴 적용하기 : TravelCheckList(id=1, passport=M12345, flightTicket=Paris flight ticket, creditCard=Shinhan card, internationalDriverLicense=1235-5345, travelerInsurance=Samsung insurance)
    }

 

@Builder : 위에서 설명했던 Builder 패턴을 자동으로 생성해주는데, builderMethodName에 들어간 이름으로 빌더 메서드를 생성해준다. 나같은 경우, 혼동을 줄이기 위해 클래스 명과 동일하게 놔두고 Builder로 선언했다.

 

클래스 내부 builder 메서드 : 필수로 들어가야할 필드들을 검증하기 위해 만들었다. 꼭 id가 아니라도 해당 클래스를 객체로 생성할 때 필수적인 필드가 있다면 활용할 수 있다.

 

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Car {

    private String id;
    private String name;

    @Builder    // 생성자를 만든 후 그 위에 @Builder 애노테이션 적용
    public Car(String id, String name) {
        this.id = id;
        this.name = name;
    }
}
public class CarImpl {

    private String id = "1";
    private String name = "carTest";

    Car car3 = Car.builder()
            .id(id)
            .name(name)
            .build();
}

 

 

'Spring > Annotation' 카테고리의 다른 글

Spring - @GeneratedValue  (0) 2022.09.05
@Sl4fj 테스트에서 적용  (0) 2022.08.27
@SpringBootTest  (0) 2022.08.23
@Transactional  (0) 2022.06.24
@EqualsAndHashCode  (0) 2022.06.03
복사했습니다!