Gradle lombok 오류

JoongHyeok.Velog·2023년 11월 28일
0

Spring

목록 보기
4/4

프로젝트에서 인텔리제이의 오른쪽 탭에 있는 gradle 탭을 통해서 clean → build 를 하니 test 쪽에서 오류가 발생하는 경험을 겪었습니다. 이에 대한 트러블 슈팅을 기록하려 합니다.

gradle 탭을 통해서 clean → build를 했을때 발생한 에러 내용은 다음과 같습니다.

error: cannot find symbol
[log.info](http://log.info/)("{로그내용 비밀비밀}", "로그내용 비밀비밀");

symbol: variable log
location: class {클래스이름}

해당 원인에 대해 구글링을 조금 찾아보니 gradle 에 Lombok 에 대한 설정오류라는 내용을 접하게 되었습니다.

그리고 gradle 에 lombok 에 대한 내용을 확인해보니 아래와 같았습니다.

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok'

저는 단순히 testImplementation 만 붙여주고 lombok을 주입받아주면 되는 줄 알았습니다.
하지만 버전에 따른 lombok 에 대한 주입방식이 다른건 예상하지 못한 변수였습니다ㅎ

https://deeplify.dev/back-end/spring/lombok-required-args-constructor-initialize-error
위의 블로그를 통해서 Gradle 버전에 따라서 lombok을 주입받을때 다르게 해줘야한다는 사실을 알게되었습니다..

위의 블로그 내용을 요약하면 다음과 같습니다.

gradle 5.x 미만

dependencies {
  implementation 'org.projectlombok:lombok'
}

gradle 5.x 이상

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

이렇게 implementation 과 compileOnly, annotationProcessor 이렇게 차이가 있었습니다.
그래서 우선은 적용은 해서 아래와 같이 수정을 진행했습니다.

변경후 gradle

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'

test 코드에 대한 lombok 주입도 똑같이 받아주니

[error: cannot find symbol
[log.info](http://log.info/)("{로그내용 비밀비밀}", "로그내용 비밀비밀");

symbol: variable log
location: class {클래스이름}]

아까 위에서 봤던 이 오류에 대한 해결이 되었습니다!
그런데 여기서 궁금한 점이 생겼습니다.

왜 저렇게 바뀌었을까, complieOnly, implementation 의 차이는 뭘까..?

이부분에 대한 궁금증을 해결하기 위해서는 우선 현재 gradle 버전을 확인해야합니다.

  • gradle 버전은 여기서 확인할 수 있습니다. 현재 프로젝트에서 gradle 은 7.5.1 버전을 사용하고 있습니다. gradle 버전은 인텔리제이에서 왼쪽탭에 gradle 을 눌러서 확인 할 수 있습니다.

그리고 현재 JDK버전에 따라서 지원하는 Gradle 의 최소 버전도 같이 확인해주어야합니다.

  • JDK버전에 따라 지원하는 Gradle 최소버전 확인하기
    Java JDK Version자바 지원하는 Gradle 최소버전
    82.0
    94.3
    104.7
    115.0
    125.4
    136.0
    146.3
    156.7
    167.0
    177.3
    187.5
    197.6
    참고 : https://adjh54.tistory.com/214

compileOnly 와 implementation의 차이는 다음과 같습니다.

  • 공통점
    • 모두 Gradle 프로젝트에서 의존성을 정의할 때 사용되는 키워드입니다.
complieOnlyimplementation
컴파일 타임에만 필요한 의존성을 정의하는데 사용컴파일 타임 & 런타임 에 모두 의존성을 정의하는데 사용,
JAR파일에 포함
  • 하지만 complieOnly를 해도 됐던 이유
    서블릿 컨테이너에서 제공하는 라이브러리에 이미 포함이 되어 있으므로
    어플리케이션을 서블릿 컨테이너에 배치할 때
    서블릿 컨테이너가 제공하는 servlet-api.jar를 사용하여
    서블릿 API에 대한 인터페이스 및 클래스에 액세스 할 수 있다.
    그 결과 런타임 환경에서도 문제없이 사용할 수 있습니다.

참고 https://goodgid.github.io/Gradle-Difference-CompileOnly-Implementation/

profile
영차영차

0개의 댓글