issues
search
tonykang22
/
study
0
stars
0
forks
source link
[The JAVA, 코드 조작] 5부. 애노테이션 프로세서
#26
Open
tonykang22
opened
2 years ago
tonykang22
commented
2 years ago
5부. 애노테이션 프로세서
1. Lombok은 어떻게 동작하는 걸까?
Lombok이란?
보일러 플레이트 코드를 대신 생성해주는 라이브러리
덕분에 코드의 가독성이 좋아졌다해도 무방하다.
동작 원리
컴파일 시점에
애노테이션 프로세서
를 사용하여 소스코드의 AST(Abstract Syntax Tree)를 조작한다.
소스코드를 참고해서 또 다른 소스 코드를 만들어 내는 것으로 아무런 파일이나 만들어낼 수도 있다.
원래 애노테이션 프로세서에서 제공하는 기능은 참조 뿐이, 수정 기능은 없다.
그러나 롬복은 바이트 코드로 컴파일되는 시점에 소스를 수정한다.
참조할 수 있는 타입을 타입 캐스팅을 해서 하위 타입으로 변환해서 처리를 하기에 수정이 가능해지는 것이다.
논란 거리
공개된 API가 아닌 컴파일러 내부 클래스를 사용하여 기존 소스코드를 조작한다.
특히 이클립스의 경우엔 java agent를 사용하여 컴파일러 클래스까지 조작하여 사용한다. 해당 클래스들 역시 공개된 API가 아니다보니 버전 호환성에 문제가 생길 수 있고, 그렇다면 언제든 문제가 발생해도 이상하지 않다.
그럼에도 불구하고 엄청난 편리함 때문에 널리 쓰이며, 대안(정석적인 방법)이 몇 있으나 롬복의 모든 기능과 편의성을 대체하지 못하는게 현실이다.
AutoValue
Immutables
2. 애노테이션 프로세서 1부
Processor 인터페이스
여러 라운드(rounds)에 거쳐 소스 및 컴파일 된 코드를 처리할 수 있다.
유틸리티
AutoService : 서비스 프로바이더 레지스트리 생성기
컴파일 시점에 애노테이션 프로세서를 사용하여 Meta-INF/services/javax.annotation.processor.Processor 파일 자동으로 생성해 준다.
3. 애노테이션 프로세서 2부
Filter 인터페이스
소스 코드, 클래스 코드 및 리소스를 생성할 수 있는 인터페이스이다.
유틸리티
Javapoet : 소스 코드 생성 유틸리티
4. 애노테이션 프로세서 정리
애노테이션 프로세서 사용 예
롬복
AutoService : java.util.ServiceLoader용 파일 생성 유틸리티
`@Override :
https://stackoverflow.com/questions/18189980/how-do-annotations-like-override
- work-internally-in-java/18202623
Dagger 2 : 컴파일 타임 DI 제공
안드로이드 라이브러리
ButterKnife :
@BindView
DeepLinkDispatch : 특정 URI 링크를 Activity로 연결할 때 사용
애노테이션 프로세서 장점
런타임 비용이 제로
애노테이션 프로세서 단점
기존 클래스 코드를 변경할 때는 약간의 hack이 필요하다.
5부. 애노테이션 프로세서
1. Lombok은 어떻게 동작하는 걸까?
애노테이션 프로세서
를 사용하여 소스코드의 AST(Abstract Syntax Tree)를 조작한다.2. 애노테이션 프로세서 1부
3. 애노테이션 프로세서 2부
4. 애노테이션 프로세서 정리
@BindView