Forest Gump?

cannot find symbol 오류로 알아보는 gradle 의존성 옵션 정리 본문

SPRING

cannot find symbol 오류로 알아보는 gradle 의존성 옵션 정리

code1010 2023. 2. 28. 00:53

error: cannot find symbol
String message = makeMessage(targetToken, title, body, Message.Data.builder().build());

 

푸쉬 테스트 프로그램 진행중에, cannot find symbol method builder() 오류가 나왔다. 왜 롬복의 builder method 를 못찾는건가 하고 찾아봤다.

컴파일 이전에 annotationProcessor 가 선언 되어야지만 먼저 builder method 생성이 되고, 그 후에 가능하다

고 해서 추가해줬다 . 

annotationProcessor('org.projectlombok:lombok')

 

 

문제 없이 실행이 되니 , 궁금해졌다. 왜 annotationProcessor 선언을 해야 할까? 의미가 궁금해져서 구글링을 해봤다. 


Annotation Processing is a hook into the compile process of the java compiler, to analyse the source code for user defined annotations and handle then by producing compiler errors, compiler warning, emitting source code, byte code.


어노테이션 프로세싱은 자바 컴파일러의 컴파일 단계에서, 유저가 정의한 어노테이션의 소스코드를 분석하고 처리하기 위해 사용되는 훅이다. 컴파일 에러나 컴파일 경고를 만들어내거나, 소스코드(.java)와 바이트코드(.class)를 내보내기도 한다.

 

한마디로 정리하면, 컴파일 시 자바 컴파일러에게 "롬복 어노테이션 설정좀 같이 분석해서 처리해줘  "  의미로 사용된다고 생각이 들었다. 그리고 gradle 의존성 옵션을 다시 찾아봤다. 

옛날 프로젝트의 경우 compile 을 사용했는데, 최신 gradle 을 받은 뒤로, compile 이 deprecated 되어 명령어를 변경한 기억이 있다. 찾아보니 compile 의 경우 depreacated 되어 사용되지 않고, 최근 7.0 버전부터는 완전히 지워졌다고 한다.

현재는 api 명령어가 그 역할을 대신한다고 한다. 

 

그럼 api 와 implementation 의 차이는 뭘까? 해당 방법에 대해 잘 설명된 그림이 있길래 가져왔다. 

api
implemantation

 

쉽게 설명하자면, 컴파일 시 api 는 의존하고 있는 모든 모듈들을 재빌드하고, implemantation은 컴파일 시 바로 전 모듈만 갖고와서 빌드 하기떄문에, 클린 아키텍쳐적 측면에서 서비스의 레이어 단 분리가 일어나야하는데 api의 경우 의존성이

너무 넒은 범위에 적용되어 바로 참조가 가능하기 때문에 레이어 단을 분리하는 의미가 퇴색된다고 한다. 

 

프로그래밍 유지보수의 핵심은 모듈간 의존성을 줄여야 하는것인데, compile시 참조된 모듈의 또 참조한 모듈의 의존성까지 갖고 오기때문에 지양되는 방법이라고 한다 .

 

무엇보다, api 시 implemenation 보다 그만큼 시간도 많이 걸린다고 한다. (당연히 그만큼 더 많은 빌드를 해야하기 때문에)

 

아래는 gradle configuration 의 대한 간략한 정의다. 잊어버릴 때 마다 참고해서 외워야겠다. 

 

Configuration name Description  
api 컴파일 및 런타임 시 필요한 의존성 선언(사용자에게 의존성 노출)
implementation 컴파일 및 런타임 시 필요한 의존성 선언(런타임 시에만 사용자에게 의존성 노출)
compileOnly 컴파일 시에만 필요한 의존성 선언
compileOnlyApi 사용자의 모듈을 컴파일 할때 필요한 의존성 선언
runtimeOnly 런타임 시에만 필요한 의존성 선언
apiElements 해당 라이브러리를 컴파일하는 데 필요한 모든 요소를 검색할 때 사용
(default 설정과 다르게, implemenation이나 runtime 의존성에 대한 정보를 노출하지 않음)
runtimeElements 해당 라이브러리를 실행하는 데 필요한 모든 요소를 검색할 때 사용
compileClasspath 라이브러리의 컴파일 클래스 경로를 지정(자바 컴파일러를 호출할 때 사용)
runtimeClasspath 라이브러리의 런타임 클래스 경로 지정

 

 

 

https://kotlinworld.com/317

 

https://jdoryeon.tistory.com/36

 

https://stackoverflow.com/questions/2146104/what-is-annotation-processing-in-java

'SPRING' 카테고리의 다른 글

GRADLE과 MAVEN 알아보기  (0) 2021.07.27