TIL (Today I learned

2024/01/23 화요일 TIL Spring boot @Builder 애노테이션

코딩준우 2024. 1. 23. 20:00

SpringBoot @Builder 애노테이션이란 무엇인가?

@Builder시 추가되는 코드

Before:
  @Builder
  class Example<T> {
      private T foo;
      private final String bar;
  }

After:
  class Example<T> {
      private T foo;
      private final String bar;

    -----------------------------------------------------------------------

    // private 생성자
      private Example(T foo, String bar) {
          this.foo = foo;
          this.bar = bar;
      }


      public static <T> ExampleBuilder<T> builder() {
          return new ExampleBuilder<T>();
      }

    // static 내부 클래스
      public static class ExampleBuilder<T> {
          private T foo;
          private String bar;

          private ExampleBuilder() {}

        // 해당 매서드에 이름에 해당하는 필드값을 설정하는 함수
        // 자기 자신을 다시 반환하여 .을 연속적으로 입력 가능(like StringBuilder)
          public ExampleBuilder foo(T foo) {
              this.foo = foo;
              return this;
          }
          // 해당 매서드에 이름에 해당하는 필드값을 설정하는 함수
        // 자기 자신을 다시 반환하여 .을 연속적으로 입력 가능(like StringBuilder)
          public ExampleBuilder bar(String bar) {
              this.bar = bar;
              return this;
          }

          @java.lang.Override public String toString() {
              return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
          }

        // @Builder 위의 메서드를 이용하여 설정한 필드를 가지는 애너테이션을 선언한 객체 반환
          public Example build() {
              return new Example(foo, bar);
          }
      }
  }

예시 코드

package com.example.example;


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



@Getter
@Setter
class VeryBigSizeData {
    private int v;
}


@Getter
@Setter
@Builder
class Test<T> {
    private int a;
    private Integer b;
    String s;
    private T data;
}



public class Example{
    public static void main(String[] args) {
        Test test = Test.<VeryBigSizeData>builder()
                .a(1)
                .b(2)
                .s("hello")
                .data(new VeryBigSizeData())
                .build();

        System.out.println(test.getA());
        System.out.println(test.getB());
        System.out.println(test.getS());
        System.out.println(test.getData());
    }
}