Lombok 은 java source 를 컴파일 할 때, annotation processor 로 등록된 lombok processor 가 annotation 을 확인 후, 그에 맞는 메소드를 자동으로 생성해 바이트 코드로 변환하는 방식을 사용한다.
annotation processor를 사용하면 어떻게 컴파일타임에 어떤코드를 만들어낼 수 있는걸까?
annotataon processor api를 사용해서 하나의 샘플을 만들어보자
샘플 : 모자에서 토끼를 꺼내는 마술을 annotation processor로 만들어보자!
MojaFactory(): annotation processor를 통해 만들어내는 클래스
@Magic: annotation processor를 통해 처리할 annotation
컴파일타임에 쓰고 바이트코드에서는 필요가 없다면 RetentionPolicy를 source레벨로 유지하면 된다
컴파일시에 annotation processor가 읽고
annotation processor는 여러 round에 걸쳐서 처리한다
true를 return하면 이 annotation type을 처리한 경우이다
그래서 다음 프로세서에게 이 어노테이션을 처리해달라고 부탁하지 않는다
1. Magic이라는 어노테이션이 붙어있는 element를 가져온다
2. annotation의 Target을 Type으로 한정짓는다고 하더라고 Interface, class, enum에 붙일 수 있다
이 processor는 interface에만 붙였으면 좋겠다. Kind를 쓰면 element의 type을 제대로 알 수 있다. 이때 interface인 경우에만 처리를 한다
그외의 경우에는 컴파일이 제대로 안되게 해야한다. 원래의 경우에는 그냥 로깅만 하도록한다
이렇게 다 만든다음에 resourcers/META-INF/services하위에
javax.anotation.processing.Processor(fullPath)를 넣어준다 그리고 그 파일 안에 내가 만든 프로세서의 경로를 넣어준다
(프로세스 등록완료)
이 뒤에 mvn install로 빌드를 하려고하면 안된다
-> 소스를 컴파일하는 시점에 저 annotation이 사용되면안되는데 사용되려해서 에러가 난다?
MagicMojaProcessor가 있어야 javax.anotation.processing.Processor를 쓸 수 있는건데 그게 없으니까 에러가 나는거다
이에 대한 해결방법은 다음과 같다
1. "프로세서의 경로"를 주석처리하고 컴파일한다
2. 그 뒤에 mvn install(jar파일을 생성하는 코드)을 진행한다