엄범

 

 

@Data

https://projectlombok.org/features/Data

  • ``kt @Data = RequiredArgsConstructor + ToString + EqualsAndHashCode + Getter + Setter``
  • 여기서 `` RequiredArgsConstructor``는 다른 Constructor 애너테이션이나 명시적으로 선언된 Constructor가 없을 때만 붙는다.
  • callSuper를 설정해야 하는 경우 해당 애너테이션과 Data를 함께 써도 된다. (설정된 애너테이션을 defer 처리 해주기 때문에 순서 상관 없다.)

 

  • `` RequiredArgsConstructor``는 final 이거나 @NonNull인 필드에 대해서 생성자를 만들어 준다.
    • Spring에서 생성자DI를 위한 생성자를 만들 때 자주 쓴다.
  • @Data는 @Setter 도 붙여주므로... 생성 시점에만 데이터 세팅하는게 맞다면 @Data 쓰지 않는 것이 낫다.

 

이름과 파라미터 수가 같은 메서드가 사용자 정의 Setter가 있다면 @Setter를 붙여도 기본 타입 세터가 만들어지지 않는다.

```java

// @Setter 소용 없다.

private int code

 

public void setCode(ResponseCode code) { } // 이게 있으면, @Setter를 붙여도 아래 함수가 자동으로 생성되지 않기 때문에 

public void setCode(int code) { }    // 이렇게 직접 적어주어야만 한다.

```

 

@Builder

 

@Builder를 붙이면?

  • ``java @AllArgsConstructor(access = AccessLevel.PACKAGE)``로 생성자가 만들어진다.
  • @Data를 붙였을 때 따라오는 @RequiredArgsConstructor가 무시된다.
  • 그러나 명시적으로 @RequiredArgsConstructor, @NoArgsConstructor, @AllArgsConstructor를 붙여주는 경우 public 생성자로도 접근이 가능하다.
    • @NoArgsConstructor나 @RequiredArgsConstructor는 단독으로 @Builder와 함께 사용하는 경우 AllArgsConstructor가 없다고 에러가 발생하므로 @AllArgsConstructor도 같이 붙여주어야 한다.
  • 그래서... @Builder + @Data 조합으로 사용하거나
  • @NoArgs가 꼭 필요한 경우에는 @Builder + @Data + @NoArgsConstructor + @AllArgsConstructor 조합으로 사용하거나.. (근데 이런 케이스는 거의 없기도 하고, 빌더와 다른 생성자를 함께 두는게 좀 어색하기도 하다.)

 

빌더를 사용하면서, 필수값은 필수로 받고, 옵셔널 값은 없으면 기본값으로 초기화 하고 싶다면!?

  • 필드에 `` =``으로 기본값으로 초기화하려면, 대상 필드에 ``java @Builder.Default``를 사용해야 하는데...
    • 이 방식은 @Builder.Default는 쓰지 않는 것이 좋다 라는 얘기도 있고, ``java f1 = f2.getName()`` 요런 식으로 다른 필드의 속성을 이용해서 또 다른 필드를 초기화하는건 불가능하다. (빌더가 static이라, static context에서 non-static 필드를 참조할 수가 없당)
  • 그래서 필수값만 받고 옵셔널 값은 기본값으로 초기화하려면! `` builderMethodName``을 지정해주면 된다.

 

특정 필드는 외부에서 받지 않고 내부에서 자체 초기화 하고 싶다면?

생성자에 @Builder 쓰면 생성자 파라미터에 있는 것만 빌더로 받아서 생성자로 넘어온다. 생성자에서 자체 초기화해주면 된다.

 

Lombok 설치

1. IntelliJ에서 `` Preferences -> Build, Execution, Deployment -> Compiler, Annotation Processors. Click Enable Annotation Processing`` 반드시 해준다. 이걸 안하면 cannot fine symbol 에러 또는 무슨 길이가 다르다느니 하는 빌드 에러가 발생함.

 

2. (생략가능)IntelliJ Perference에서 lombok 플러그인 검색해서 설치한다. 이걸 설치 안하면 컴파일은 가능하지만, lombok에서 만들어준 getter,setter,constructor 등에 접근하려 할 때 IDE가 이를 resolve하지 못해 빨간색으로 뜬다. 다시 말하지만 컴파일은 가능함.

 

3. 여기서 The Lombok Gradle Plugin 부분을 따라하면 된다.  2번을 생략했다면 Gradle without a plugin 부분을 따라하면 된다.

그리고 뭔가 수정했다면 꼭 그냥 빌드가 아니라 Rebuild를 해보기 바란다.