새소식

반응형
Java/Spring

Lombok

  • -
반응형

Lombok

Java 라이브러리로 반복되는 메소드를 Annotation으로 만들어 자동으로 작성해주는 라이브러리이다.

보통 DTO, Model, Entity 의 경우 여러 속성이 존재하고 이들이 가지는 프로퍼티에 대해 Getter 나 Setter, 생성자 등을

매번 작성해줘야 하는 경우가 많은데 이러한 부분을 자동으로 만들어주는 라이브러리이다.

 

보통 데이터 전달 객체인 DTO와 같이 자주 변경되는 클래스의 경우 멤버변수의 변경 또는 삭제할 때마다 Getter, Setter,

생성자 등을 수정해야 하는 경우가 발생한다. 이러한 경우에도 Lombok을 이용하여 어노테이션만 추가하면 매번 수정할 필요가 없이 Lombok이 자동으로 수정해준다.

 

하지만 장점만 있는게 아닌 단점도 있다.

예를 들어 @Data 나 @ToString의 경우 순환 참조 또는 무한 재귀 호출로 인해 스택오버플로우 에러가 발생할 수 있다.

 

Lombok 라이브러리 어노테이션 종류

@Getter, @Setter

// Getter, Setter 어노테이션 사용
class Car{
    @Getter
    @Setter
     private String type;
}

// 실제 모습
class Car{
     private String type;

     Car(){
     }
     
     public String getType() {
          return this.Type;
     }

     public void setType(String type) {
          this.type = type;
     }
}

위와 같이 직접 getter, setter를 설정할 필요 없이 어노테이션만으로 자동 생성 및 수정할 수 있다.

 

@NonNull

메소드나 생성자의 매개변수에 @NonNull 어노테이션을 사용하면 Lombok이 null 체크를 해준다.

class Car{
     private String type;
     private String name;

     public Car(@NonNull String type, String name){
          this.type = type;
          this.name = name;
     }
}

// 빌드
class Car{
     private String type;
     private String name;
    
     public Car(@NonNull String type, String name){
          if(type == null){
                 throw new NullPointerException("type is marked non-null but is null");
          }else {
                 this.type = type;
                 this.name = name;
          }

      
     }
}

 

@NoArgsConstructor

매개변수가 없는 생성자를 생성한다. 만약 final 필드가 있을 경우 컴파일 에러가 난다.

final 필드가 있는 클래스의 생성자 함수를 매개변수 없이 생성하기 위해선

@NoArgsConstructor(force=true)를 사용하면 final 필드는 기본값(0, null, false) 등으로 초기화 된다.

 

@RequiredArgsConstructor

초기화 되지 않은 모든 final 필드, @NonNull 필드에 대한 생성자를 생성해준다. @NonNull 어노테이션의

null check 구문도 추가해준다.

 

@AllArgsConstructor

클래스의 모든 필드에 대한 생성자를 만들어준다. @NonNull이 붙은 필드는 null check 구문까지 생성해준다.

@AllArgsConstructor
class Car{
     private String type;
     private String name;
     @NonNull
     private String brand;
}

// 빌드
class Car{
     private String type;
     private String name;
     @NonNull
     private String brand;
    
     public Car(String type, String name, @NonNull String brand){
          if(brand == null){
               throw new NullPointerException("type is marked non-null but is null");
          }else {
               this.type = type;
               this.name = name;
               this.brand = brand;
          }
     }
}

 

@Data

모든 필드에 대해 @ToString, @EqualsAndHashCode, @Getter 를, 모든 non-final 필드에 대해 @Setter를 설정하고

@RequiredArgsConstructor를 설정해주는 단축 Annotation 이다.

 

@Value

모든 필드를 private / final 로 만들고 setter는 생성되지 않는다. 클래스 또한 final 로 만들어버린다.

@Data처럼 ToString, equals(). hashCode() 를 자동으로 생성해주고 각 필드에 대한 getter와 생성자 또한 만들어준다.

즉, @Value는 @ToString, @EqualsAndHashCode, @AllArgsConstructor, @Getter 등의 단축키이다.

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.