엄범

 

 

@Data

https://projectlombok.org/features/Data

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

 

  • `` RequiredArgsConstructor``는 final 이거나 @NonNull인 필드에 대해서 생성자를 만들어 준다.
    • Spring에서 생성자DI를 위한 생성자를 만들 때 자주 쓴다.

 

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

```java

// @Setter 소용 없다.

private int code

 

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

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

```

 

@Builder

 

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

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

 

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

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

 

Bean Validation 애너테이션

beanvalidation.org/2.0/spec/#builtinconstraints

  • @Size, @Past, @Min(1) 등
  • 애너테이션이 어떤 제약조건을 가지고 있는지 확인하려면 그냥 애너테이션 소스 확인해보면 된다.
  • 참고로 `` @Email`` 애너테이션은 길이 제한도 겸하고 있다.  `` {64}@{255}``
    • DB에 저장할 때도 VARCHAR2(320)으로 하면 깔끔하다.

 

Null, 빈값 관련

  • `` @NotBlank``
    • @NotNull + "" 및 " " 허용하지 않음
  • `` @NonNull``의 전체 적용?
  • Controller에서 @RequestBody로 바로 객체로 매핑하는 경우 애초에 input json에 포함이 안되어 있는 필드는 setter 거치지 않고 바로 null을 할당한다.
    • @NonNull이 붙어 있는 필드라면 에러가 발생할 것 같지만, 그냥 null이 들어가버린다.
    • 이 때문에 @NonNull 대신 @NotNull을 사용하는 것을 권장
  • int같은 primitive type에는 @NonNull 계열의 애너테이션이 의미가 없으므로(warning뜬다.) 대신 @Min(1)을 쓴다.

 

주의해야 할 점

lombok resolve?

  • `` @Size``같은건, 직접 `` new``로 객체를 생성할 때는 동작하는게 아니다.
  • controller에서 `` @Valid``매핑할 때 동작하거나, 직접 validator를 불러주어 annotation을 resolve하도록 해야 한다.

 

javax.validation.constraints 와 org.hibernate.validator.constraints

`` @Email`` 애너테이션을 사용하는데, 다음과 같은 에러가 발생함

```

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Email' validating type 'java.lang.String'

```

이는 javax.validation 1.0.1이 @Email을 지원하지 않아 생긴 문제.

분명 해당 라이브러리 constraints 패키지 확인해보면 없는데,

intelliJ에서 @Email 입력 시 import 가이드로 javax.validation을 권장하고 있으니 주의 ㅡ.ㅡ

이 것 때문에 장애가 ㅜ.ㅜ

 

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를 해보기 바란다.