⇒ @Getter
, @Setter
, @Builder
등의 애노테이션과 애노테이션 프로세서를 제공하여 표준적으로 사용하는 라이브러리
우리 개발을 하면서 반복적이고 공통적인 코드작성을 애노테이션을 통해 자동화해주는 라이브러리라고도 할 수 있습니다.
결국 핵심은 애노테이션 프로세서
입니다. 이 애노테이션 프로세서는 컴파일 시점에 끼어들어 특정한 애노테이션이 붙어있는 소스코드를 참조해서 새로운 소스코드를 만들어 낼 수 있는 기능입니다. 이 때 새로생성되는 소스코드는 자바일수도있고 다른 어떤 코드일수도 있습니다.
애노테이션 프로세서는 애노테이션이 붙어있는 소스코드의 정보를 트리구조(AST)로 참조할 수 있습니다.
Abastract Syntax Tree
이런 트리를 원래는 참조만 가능하고 조작은 불가능한데, 실제 컴파일을 한 뒤 바이트코드를 보면 변경된 코드를 볼 수 있습니다.
기존 공개된 API를 보면 원래는 RoundEnvironment
와 TypeElement
만 써야합니다. (하단 이미지 참고) 두 타입은 실제로 참조만 가능합니다.
근데, 해당 타입들을 하위 클래스로 캐스팅을 하는데, 타입중에는 참조 뿐 아니라 수정도 가능한 타입이 있고 그 타입으로 캐스팅을 해서 수정을 합니다. 그래서 이게 정상적인 사용법이 아니고 해킹이기 때문에 사용하면 안된다고 주장하는 개발자들도 많이 있습니다.
실제로 타당한 주장입니다만, 계속 사용되는 이유는 이 기능(롬복)에 대한 대안책이 크게 존재하지 않습니다.
[AutoValue](<https://github.com/google/auto/blob/master/value/userguide/index.md>)
나 [Immutables](<https://immutables.github.io>)
라는 오픈소스들도 있긴 하지만, 롬복을 대체할만큼의 기능제공을 해주지 못합니다.