프로그래밍/Java

Lombok 동작원리

개발정리 2022. 5. 3. 19:02

Lombok 은 컴파일 시점에 바이트코드를 변환하여 원하는 부분을 주입해주는 방식으로 동작한다. 

조금 더 구체적으로 설명하자면, 컴파일 시점에 애노테이션 프로세서를 사용하여 소스코드의 AST(abstract syntax tree)조작한다.

 

Lombok이 처리되는 과정은 다음과 같다

 

  1.  javac는 소스파일을 파싱하여 AST트리를 만든다.
  2. Lombok은 AnnotaionProcessor에 따라 AST 트리를 동적으로 수정하고 새 노드(소스코드)를 추가하고 마지막으로 바이트 코드를 분석 및 생성한다.
    (컴파일 과정에서 생성된 Syntax Tree는 com.sun.source.tree.*에서 public accesss를 제공한다.)
  3. 최종적으로 javac는 Lombok Annotation Processor에 의해 수정된 AST를 기반으로 Byte Code를 생성한다.

 

 

논란 거리

  • 공개된 API가 아닌 컴파일러 내부 클래스를 사용하여 기존 소스 코드를 조작한다.
  • 특히 이클립스의 경우엔 java agent를 사용하여 컴파일러 클래스까지 조작하여 사용한다. 언제라도 그런 문제가 발생해도 이상하지 않다.
  • 그럼에도 불구하고 엄청난 편리함 때문에 널리 쓰이고 있으며 대안이 몇가지 있지만 롬복의 모든 기능과 편의성을 대체하진 못하는 현실이다.

 

 

Abstract Syntax Tree 추상구문트리란?

  • 추상이라는 말은 실제 구문에서나타나는 모든 세세한 정보를 나타내지 않는다는 것을 의미한다.
  • 주로 컴파일러에서 널리 사용되는 자료구조이다.
  • Abstract Syntatic 구조를 표현하기 위해서 사용된다.
  • Abstract Syntatic이란 프로그래밍 언어의 문법 및 각 문단의 역할을 표현하기 위한 규칙이다.
  • 프로그래밍 언어의 사용이 틀린 부분이 없는지, 문맥적인 소스코드 검사의 단계에서 사용된다.

'프로그래밍 > Java' 카테고리의 다른 글

Optional  (0) 2022.05.05
Stream  (0) 2022.05.04
다이나믹 프록시  (0) 2022.05.03
클래스 로더 (class loader)  (0) 2022.05.01
JVM 구조  (0) 2022.04.30