Lombok 은 컴파일 시점에 바이트코드를 변환하여 원하는 부분을 주입해주는 방식으로 동작한다.
조금 더 구체적으로 설명하자면, 컴파일 시점에 애노테이션 프로세서를 사용하여 소스코드의 AST(abstract syntax tree)를 조작한다.
Lombok이 처리되는 과정은 다음과 같다
- javac는 소스파일을 파싱하여 AST트리를 만든다.
- Lombok은 AnnotaionProcessor에 따라 AST 트리를 동적으로 수정하고 새 노드(소스코드)를 추가하고 마지막으로 바이트 코드를 분석 및 생성한다.
(컴파일 과정에서 생성된 Syntax Tree는 com.sun.source.tree.*에서 public accesss를 제공한다.) - 최종적으로 javac는 Lombok Annotation Processor에 의해 수정된 AST를 기반으로 Byte Code를 생성한다.
논란 거리
- 공개된 API가 아닌 컴파일러 내부 클래스를 사용하여 기존 소스 코드를 조작한다.
- 특히 이클립스의 경우엔 java agent를 사용하여 컴파일러 클래스까지 조작하여 사용한다. 언제라도 그런 문제가 발생해도 이상하지 않다.
- 그럼에도 불구하고 엄청난 편리함 때문에 널리 쓰이고 있으며 대안이 몇가지 있지만 롬복의 모든 기능과 편의성을 대체하진 못하는 현실이다.
Abstract Syntax Tree 추상구문트리란?
- 추상이라는 말은 실제 구문에서나타나는 모든 세세한 정보를 나타내지 않는다는 것을 의미한다.
- 주로 컴파일러에서 널리 사용되는 자료구조이다.
- Abstract Syntatic 구조를 표현하기 위해서 사용된다.
- Abstract Syntatic이란 프로그래밍 언어의 문법 및 각 문단의 역할을 표현하기 위한 규칙이다.
- 프로그래밍 언어의 사용이 틀린 부분이 없는지, 문맥적인 소스코드 검사의 단계에서 사용된다.