lombok - @Builder

@Builder??

@Builder가 무엇이고 어떻게 사용하는지 사용하면 뭐가 좋은지 알아보자

@Builder란?

Builder 어노테이션은 롬복에 포함되어있는 어노테이션중에 하나로 오브젝트 생성을 위한 디자인 패턴중에 하나이다.

예를들어

1
2
3
4
Person person = Person.builder()
                    .name("철수")
                    .city("서울")
                    .build();

이런식으로 builder패턴을 사용하여 인스턴스를 초기화 하는 방식은 생성자를 사용해서 초기화하는 방식이랑 유사하지만 builder패턴의 장점은 순서를 기억할 필요가 없다는 것이다

위 말을 다른 말로 하면 어떤 필드에 파라미터가 잘 전달되었는지 알 수 있다는 의미이다.

@Builder 사용할때 올바른 사용방법

  1. @Builder를 class에 달지 말자 class에 달게 되면 @AllArgsConstructor도 같이 달아주는것과 같기 때문에 바람직 하지 않다.

    @AllArgsConstructor : 클래스에 존재하는 모든 필드에 대한 생성자 만들어줌

    @NoArgsConstructor : 기본 생성자 생성해줌

    조금 번거롭겠지만 요즘 intellj에서 생성자도 자동 생성해주기 때문에

    1
    2
    3
    4
    5
     @Builder
     public Person(String name, String city){
         this.name = name;
         this.city = city;
     } 
    

    요런식으로 사용하자

  2. Builder 이름으로 책임을 부여하자 단순히 @Builder 어노테이션만 붙이고 땡 하지 말고, 예를 들어 주문 시스템에서 사용자에게 환불해서 받을 주소을 입력 받아야 하는데 단순히 Address.build()가 아니라

    • 지번주소로 환불
      1
      2
      3
      4
      5
      @Builder(builderClassName = "ByNumberBuilder", builderMethodName = "ByNumberBuilder")
      public Refund(Number number, Order order){
        this.address = number;
        this.order = order; 
      }
      
    • 도로명주소로 환불
      1
      2
      3
      4
      5
       @Builder(builderClassName = "ByRoadBuilder", builderMethodName = "ByRoadBuilder")
       public Refund(Road road, Order order){
         this.road = road;
         this.order = order;
       }
      

    이처럼 지번주소 환불인 경우에는 지번주소를 입력받게 하고, 도로명 주소 환불인 경우에는 도로명 주소를 입력받게 해서 빌더의 이름으로 책임을 부여하고, 받아야 하는 인자도 명확해진다.

    1
    2
    3
    4
     Refund refund = Refund.ByNumberBuilder()
                         .number(number)
                         .order(order)
                         .build();
    
    1
    2
    3
    4
     Refund refund = Refund.ByRoadBuilder()
                         .road(road)
                         .order(order)
                         .build();