티스토리 뷰

Java

Java - 애노테이션 프로세서1

사용자 엔꾸꾸 2019. 11. 17. 16:03

애노테이션 프로세서 - 1

Moja Interface

  • pullOut() 메소드만 존재하는 인터페이스를 정의

@Magic 애노테이션

  • Target을 TYPE으로 지정하면, 인터페이스 ,클래스, ENUM에 지정이 가능하다.
  • Rentention정보를 소스레벨 까지만 유지하고, 컴파일 시점에 애노테이션 프로세서를 상요해 MagicMoja 를 생성할 것이다.

애노테이션 프로세서를 사용하여, @Magic 애노테이션이 적용된 인터페이스가 존재하면, MagicMoja 라는 클래스를 생성할 것이다.

MagicMojaProcessor

Processor Interface를 사용해도 되지만, 자바에서 기본으로 제공하는 AbstractProcessor 추상 클래스를 사용한다.

  • 인터페이스에서 기본으로 구현해야할 것들을 어느정도 구현을 하고 있다.

주요 메서드

  1. getSupportedAnnotationTypes
  • 이 프로세서가 처리할 애노테이션들을 지정해 준다.
  1. getSupportedSourceVersion
  • 소스코드 버전을 몇까지 지원할 것인지 지정해 준다.
  1. 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

참조

댓글
댓글쓰기 폼
공지사항
Total
68,328
Today
36
Yesterday
123
링크
TAG
more
«   2021/10   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
글 보관함