본문 바로가기

Spring

[Spring] Annotation Processor

 

mapstruct processor 를 implementation 을 통해 의존성을 부여하였을 때 다음과 같은 예외가 발생하였습니다.

 

 

우선 문서에 나와있는대로 annotationProcessor 를 통해 의존성을 받아오니 정상동작은 하였지만 두 방식의 차이에 대해 알고있어야겠다는 생각이 듭니다.

Annotation Processor 정의

Annotation Processor 란 컴파일 시 끼어들어 특정 annotation 이 붙어있는 소스코드를 참조하여 추가적인 소스코드를 삽입하는 코드입니다.

Annotation Processor 특징

컴파일 단계에서 모든 동작을 수행하고, 런타임에는 사용만 하는 것이기 때문에 런타임시 추가적인 리소스가 들지않습니다. 따라서 런타임 예외도 발생시키지 않습니다.

다만 프로젝트의 크기가 커지면서 프로젝트 내의 어노테이션이 많아질수록 컴파일 속도가 느려질 수 있습니다.

 

Implementation 정의

라이브러리가 컴파일 및 런타임 시점에 모두 필요하다는 것을 나타냅니다. 프로젝트의 compileClasspath 및 runtimeClassPath 양쪽에 모두 포함됩니다.

Implementation 특징

이 옵션을 사용하면 프로젝트 빌드 시점에 해당 라이브러리를 컴파일에 사용합니다. 라이브러리와 관련된 클래스 및 메서드를 프로젝트에서 직접 참고합니다.

의존 라이브러리 수정 시 본 모듈까지만 재빌드 합니다.

 

runtimeOnly

라이브러리가 런타임에만 필요하다는것을 나타냅니다. 프로젝트 빌드 시점에 해당 라이브러리를 classpath에 추가하지 않고, 런타임에 필요한 경우에만 라이브러리를 프로젝트에 포함합니다.

compileOnly

라이브러리가 컴파일 시점에만 필요하다는 것을 나타냅니다. 프로젝트의 빌드 시점에 해당 라이브러리를 컴파일에 사용합니다.

api

라이브러리가 컴파일 및 런타임 시점에 모두 필요하다는 것을 나타냅니다. 프로젝트의 compileClasspath 및 runtimeClassPath 양쪽에 모두 포함됩니다.

** classpath **

자바로 작성된 프로그램은 먼저 Java 파일들을 컴파일 하여 바이트 코드로 만들어내고, JVM 이 읽어드립니다. 그리고 어플리케이션이 실행되며 바이트 코드를 기계어로 번역합니다. 자바로 작성된 프로그램을 컴파일 하고 실행할때 특정 경로에서부터 시작하여 클래스 파일과 패키지를 탐색하는데, 이를 classpath 라고 합니다.

Compile classpath: Java 코드를 class 파일로 컴파일 할 때 탐색하는 경로
Runtime classpath: 컴파일된 자바 코드(class 파일)을 JVM이 실행할 때 탐색하는 경로

 


안되는데?

정의와 특징만 보면 둘다 컴파일 시점에 이상없이 동작해서 런타임때 사용할 수 있을것 같습니다.

하지만 막상 annotationProcessor 를 implementation 으로 바꾼다면 런타임 시 에러가 발생할 것입니다 (Lombok 도 동일)

 

annotationProcessor 는 컴파일 시 추가적인 소스코드를 삽입하는 방식입니다.

하지만 implementation 은 컴파일 시 경로만 설정하므로 코드가 수정되어 런타임으로 넘어가지는 않습니다.

실제로 mapstruct processor 의 의존성을 각 implement annotationProcessor 로 했을때의 차이입니다.

 

 

비교해보면 CertDtoMapperImpl 의 존재유무에 차이가 있습니다.

따라서 컴파일 시 annotationProcessor 로 인한 코드를 추가해야하는 상황이라면 사용해야합니다.

 

'Spring' 카테고리의 다른 글

[Spring] UnknownNamedQueryException  (0) 2024.04.11
[Spring] WebSocket  (0) 2023.08.23
[Spring] AOP  (0) 2023.06.08
[Spring] JPA? Hibernate? Persistence?  (0) 2023.04.30
[Spring] Session (feat. 프로젝트 경험)  (0) 2023.04.28