티스토리 뷰

반응형

Lombok이란?

Lombok 프로젝트는 자바 라이브러리로 코드 에디터나 빌드 툴(IntelliJ, Eclipse, XCode 등)에 추가하여 코드를 효율적으로 작성할 수 있도록 도와준다. class명 위에 어노테이션을 명시해줌으로써 getter나 setter, equals와 같은 method를 따로 작성해야 하는 번거로움을 덜어준다.

 

lombok 어노테이션 중 내가 실제로 개발을 하며 가장 자주 사용했던 어노테이션은 @Data, @NonNull, @NoArgsConstructor/@AllArgsConstructor로 이에 대해 자세히 알아보고자 한다.

 

@Data

@Data 어노테이션은  @Getter / @Setter, @ToString, @EqualsAndHashCode와 @RequiredArgsConstructor 를 합쳐놓은 종합 선물 세트라고 할 수 있다. POJO(Plain Old Java Objects)와 bean과 관련된 모든 보일러플레이트(boilerplate =재사용 가능한 코드)를 생성한다. class의 모든 필드에 대한 getter, setter, toString, equals와 같은 함수들 말이다.

// lombok annotation 사용

@Data
public class Example {
    private String name;
    private double score;
}


// lombok annotation 미사용

public class Example {
    private String name;
    private double score;

    public DataExample(String name) {
        this.name = name;
    }
  
    public String getName() {
        return this.name;
    }
  
    public void setScore(double score) {
        this.score = score;
    }
  
    public double getScore() {
        return this.score;
    }
  
    @Override public String toString() {
        return "DataExample(" + this.getName() + ", " + this.getAge() + ", " + this.getScore() + ", " + Arrays.deepToString(this.getTags()) + ")";
    }
  
  protected boolean canEqual(Object other) {
    return other instanceof DataExample;
  }
  
  @Override public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof DataExample)) return false;
    DataExample other = (DataExample) o;
    if (!other.canEqual((Object)this)) return false;
    if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
    if (this.getAge() != other.getAge()) return false;
    if (Double.compare(this.getScore(), other.getScore()) != 0) return false;
    if (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;
    return true;
  }
  
  @Override public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final long temp1 = Double.doubleToLongBits(this.getScore());
    result = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
    result = (result*PRIME) + this.getAge();
    result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
    result = (result*PRIME) + Arrays.deepHashCode(this.getTags());
    return result;
  }
  
}

 

 

Data 어노테이션은 callSuper, includeFieldName, exclude와 같은 파라미터와 같이 사용될 수 없으므로, 해당 파라미터 사용이 필요할 때는 개별 어노테이션을 따로 다 명시해주면 되겠다.

@Getter
@Setter
@ToString(includeFieldNames=true)
@EqualsAndHashCode
@RequiredArgsConstructor
public class Example {
    private String name;
    private double score;
}

 

 

 

[참고] projectlombok.org/features/all

반응형
반응형