[Java] Lombok 사용 시 주의사항

2023. 4. 15. 18:46Programming Languages/Java

문제 상황

Lombok은 Java 기반의 라이브러리로 getter/setter, toString, equals, hashCode 등 여러 반복적이고 귀찮은 코드들을 애너테이션 선언만으로 컴파일 시점에 바이트 코드를 조작해서 넣어준다. 그런데 만약 애너테이션을 선언했는데 개발자가 직접 코드를 작성했다면 어떻게 될까?

테스트

롬복만 추가한 프로젝트에서 진행했다.

plugins {
    id 'java'
}

group = 'io.jeidiiy'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.26'
    annotationProcessor 'org.projectlombok:lombok:1.18.26'

    testCompileOnly 'org.projectlombok:lombok:1.18.26'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.26'

    testImplementation platform('org.junit:junit-bom:5.9.1')
    testImplementation 'org.junit.jupiter:junit-jupiter'
}

test {
    useJUnitPlatform()
}

애너테이션만 선언 시

Item이라는 클래스를 만들고 @Data를 선언했다. 참고로 @Data는 @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode를 묶어놓은 애너테이션이다.

자바 파일
클래스 파일 1
클래스 파일 2

의도한 대로 getter/setter, equals, hashCode, toString이 모두 만들어졌다.

애너테이션 선언 후 정의 시

그렇다면 직접 정의한 경우 어떨까? getter와 equals를 재정의했다.

 

자바 파일
클래스 파일

getter와 equals는 직접 정의한대로 만들어졌고 나머지 setter, toString은 롬복에 의해 만들어졌다. 그리고 실행 창에는 다음과 같은 경고가 떴다.

E:\LombokTest\src\main\java\Item.java:3: warning: Not generating hashCode: One of equals or hashCode exists. You should either write both of these or none of these (in the latter case, lombok generates them). @Data

 

equals가 이미 있으므로 hashCode가 만들어지지 않았다는 뜻이다.

결론

롬복을 쓰려면 직접 정의하면 안 된다. 간단한 테스트였지만 나중에 혹시나 발생할 수도 있는 문제이므로 좋은 경험이었다.