Java - 애노테이션 프로세서1
애노테이션 프로세서 - 1
Moja Interface
- pullOut() 메소드만 존재하는 인터페이스를 정의
@Magic 애노테이션
- Target을 TYPE으로 지정하면, 인터페이스 ,클래스, ENUM에 지정이 가능하다.
- Rentention정보를 소스레벨 까지만 유지하고, 컴파일 시점에 애노테이션 프로세서를 상요해 MagicMoja 를 생성할 것이다.
애노테이션 프로세서를 사용하여, @Magic 애노테이션이 적용된 인터페이스가 존재하면, MagicMoja 라는 클래스를 생성할 것이다.
MagicMojaProcessor
Processor Interface를 사용해도 되지만, 자바에서 기본으로 제공하는 AbstractProcessor 추상 클래스를 사용한다.
- 인터페이스에서 기본으로 구현해야할 것들을 어느정도 구현을 하고 있다.
주요 메서드
- getSupportedAnnotationTypes
- 이 프로세서가 처리할 애노테이션들을 지정해 준다.
- getSupportedSourceVersion
- 소스코드 버전을 몇까지 지원할 것인지 지정해 준다.
- process
- 애노테이션 프로세서가 애노테이션 프로세서가 처리할 애노테이션을 사용하고 있는 엘리먼트 들을 참조할 수 있다.
엘리먼트 란 ?
- 소스코드의 구성요소들을 엘리먼트라고 한다.
- 패키지 엘리먼트
- 클래스 엘리먼트
- 메서드 엘리먼트
- 각 엘리먼트들을 프로세스할때 참조가 가능하다.
Round
- 애노테이션 프로세서는 라운드라는 개념이 존재한다.
- 여러 라운드에 걸쳐 처리를 한다.
- 각 라운드 마다 애노테이션 프로세서가 처리할 엘리먼트를 찾으면, 이를 처리하고 그 결과를 다음 프로세서에게 넘길 수도 있다.
- Filter Chaining 과 비슷한 느낌이다.
구현이 끝났다면 JAR 패키징을 하여, 다른 프로젝트에서 참조하여 사용할 수 있다.
JAR 패키징하기
- JAR 패키징을 하기위해선 MANIFEST 정보를 생성해 주어야한다.
- src/main/resource/services 하위에 javax.annotation.processing.Processor 파일을 생성한다.
- 해당 파일 내부에 우리가 생성 프로세서의 풀 패키지 경로를 적어준다.
me.june.MagicMojaProcessor
그런 다음 메이븐 패키징을 하게되면 문제가 발생한다.
이 프로세서를 사용해야하는 시점이 맞지않아 패키징이 되지 않는다.
MagicMojaProcessor 컴파일 되지 않은 시점에 사용하려고 해서 에러가 발생한다.
이를 우회하는 방법
- 기존의 파일에서 풀패키지 경로를 주석처리 해준다.
# me.june.MagicMojaProcessor
mvn clean install 을 통해 패키징을 먼저 해준뒤, clean을 하지않고, 기존 파일의 주석을 풀어준뒤 mvn install로 다시 패키징을 해준다.
이 경우에는 me.june.MagicMojaProcessor를 사용하지않고 1차적으로 컴파일 및 패키징을 하면 MagicMojaProcessor 클래스가 컴파일 되어 target 디렉터리에 존재하게 된다.
그런 다음 clean을 하지않고 패키징을 다시하게 되면 target디렉터리를 비우지않고, 그대로 사용하여 다시 패키징을 하기 때문에 컴파일된 MagicMojaProcessor 를 참조할 수 있게 되어 에러가 발생하지 않는다.
AutoService
- AutoService 를 사용하면 자동적으로 MAINFEST파일을 생성해준다.
컴파일 시점에 애노테이션 프로세서를 사용하여 META-INF/services/javax.annotation.processor.Processor 파일 자동으로 생성해 준다.
- 여기서 ServiceProvider라는 개념이 존재한다.
ServiceProvider
- 확장 포인트를 제공한다.
- 자바에서 기본으로 제공해준다.
- https://itnext.io/java-service-provider-interface-understanding-it-via-code-30e1dd45a091
참조
- http://hannesdorfmann.com/annotation-processing/annotationprocessing101
- http://notatube.blogspot.com/2010/12/project-lombok-creating-custom.html
- https://medium.com/@jintin/annotation-processing-in-java-3621cb05343a
- https://medium.com/@iammert/annotation-processing-dont-repeat-yourself-generate-your-code-8425e60c6657
- https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#processing