롬복

김민지·2022년 10월 21일
0

자바

목록 보기
11/21

롬복

Lombok 은 java source 를 컴파일 할 때, annotation processor 로 등록된 lombok processor 가 annotation 을 확인 후, 그에 맞는 메소드를 자동으로 생성해 바이트 코드로 변환하는 방식을 사용한다.

  • 내가 다 생성하기 귀찮은 코드를 생성해주는 툴
  • getter,setter 같은 코드는 어떤 클래스에도 필요할 수 있지만 너무 장황해진다
  • annotation만 붙였는데도 getter, setter를 만들 수 있다
  • annotation processor은 컴파일할때 끼어들어서 특정한 annotation이 붙어있으면 또 다른 소스코드를 만들어내는 것
  • 그래서 롬복이 적용되어있는 .java코들를 컴파일한 .class코드를 보면 getter나 setter가 생성된 코드를 볼 수 있다

컴파일 타임에 코드 생성

annotation processor를 사용하면 어떻게 컴파일타임에 어떤코드를 만들어낼 수 있는걸까?
annotataon processor api를 사용해서 하나의 샘플을 만들어보자
샘플 : 모자에서 토끼를 꺼내는 마술을 annotation processor로 만들어보자!
MojaFactory(): annotation processor를 통해 만들어내는 클래스
@Magic: annotation processor를 통해 처리할 annotation

retentionPolicy

컴파일타임에 쓰고 바이트코드에서는 필요가 없다면 RetentionPolicy를 source레벨로 유지하면 된다

  • SOURCE : 컴파일하고버림
  • CLASS : 런타임에 버림
  • RUNTIME : 계속있음

annotation processor의 처리 과정

컴파일시에 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인 경우에만 처리를 한다
그외의 경우에는 컴파일이 제대로 안되게 해야한다. 원래의 경우에는 그냥 로깅만 하도록한다

annotation processor를 등록해보자

이렇게 다 만든다음에 resourcers/META-INF/services하위에
javax.anotation.processing.Processor(fullPath)를 넣어준다 그리고 그 파일 안에 내가 만든 프로세서의 경로를 넣어준다
(프로세스 등록완료)
이 뒤에 mvn install로 빌드를 하려고하면 안된다
-> 소스를 컴파일하는 시점에 저 annotation이 사용되면안되는데 사용되려해서 에러가 난다?
MagicMojaProcessor가 있어야 javax.anotation.processing.Processor를 쓸 수 있는건데 그게 없으니까 에러가 나는거다
이에 대한 해결방법은 다음과 같다
1. "프로세서의 경로"를 주석처리하고 컴파일한다
2. 그 뒤에 mvn install(jar파일을 생성하는 코드)을 진행한다

profile
안녕하세요!

0개의 댓글