롬복(ProjectLombok)은 어떻게 동작할까?


롬복이란?

@Getter, @Setter, @Builder등의 애노테이션과 애노테이션 프로세서를 제공하여 표준적으로 사용하는 라이브러리

우리 개발을 하면서 반복적이고 공통적인 코드작성을 애노테이션을 통해 자동화해주는 라이브러리라고도 할 수 있습니다.

결국 핵심은 애노테이션 프로세서 입니다. 이 애노테이션 프로세서는 컴파일 시점에 끼어들어 특정한 애노테이션이 붙어있는 소스코드를 참조해서 새로운 소스코드를 만들어 낼 수 있는 기능입니다. 이 때 새로생성되는 소스코드는 자바일수도있고 다른 어떤 코드일수도 있습니다.

애노테이션 프로세서는 애노테이션이 붙어있는 소스코드의 정보를 트리구조(AST)로 참조할 수 있습니다.

Abastract Syntax Tree

Abastract Syntax Tree

이런 트리를 원래는 참조만 가능하고 조작은 불가능한데, 실제 컴파일을 한 뒤 바이트코드를 보면 변경된 코드를 볼 수 있습니다.

기존 공개된 API를 보면 원래는 RoundEnvironmentTypeElement만 써야합니다. (하단 이미지 참고) 두 타입은 실제로 참조만 가능합니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6de65411-86cf-40b4-aed7-e21f0365e671/Untitled.png

근데, 해당 타입들을 하위 클래스로 캐스팅을 하는데, 타입중에는 참조 뿐 아니라 수정도 가능한 타입이 있고 그 타입으로 캐스팅을 해서 수정을 합니다. 그래서 이게 정상적인 사용법이 아니고 해킹이기 때문에 사용하면 안된다고 주장하는 개발자들도 많이 있습니다.

실제로 타당한 주장입니다만, 계속 사용되는 이유는 이 기능(롬복)에 대한 대안책이 크게 존재하지 않습니다.

[AutoValue](<https://github.com/google/auto/blob/master/value/userguide/index.md>)[Immutables](<https://immutables.github.io>)라는 오픈소스들도 있긴 하지만, 롬복을 대체할만큼의 기능제공을 해주지 못합니다.