컴파일러 플러그인
컴파일러 플러그인 (Compiler plugins)
컴파일러 플러그인은 컴파일러 자체를 수정하지 않으면서, 코드가 컴파일되는 동안 그 코드를 분석하거나 변경하기 위해 컴파일 과정에 끼어드는(hook) 도구예요. 예를 들어 코드에 애너테이션을 달거나, 다른 프레임워크·API와 호환되도록 새 코드를 생성할 수 있어요.
이 페이지에서는 사용할 수 있는 코틀린 컴파일러 플러그인들과, 그중 어느 것도 여러분의 사용 사례에 맞지 않을 때 할 수 있는 일을 설명할게요.
Kotlin 팀이 유지보수하는 컴파일러 플러그인
Kotlin 팀은 다음과 같은 컴파일러 플러그인을 유지보수해요.
| 플러그인 | 설명 |
|---|---|
| All-open | 애너테이션이 붙은 클래스와 그 멤버를 자동으로 open으로 만들어, 프레임워크가 런타임에 그 클래스를 확장할 수 있게 해요. |
| AtomicFU | 원자(atomic) 연산을 락-프리 동시성을 위한 효율적인 플랫폼별 구현으로 변환해요. |
| DataFrame | DataFrame을 안전하고 코틀린 친화적인 방식으로 다룰 수 있게 해 주는 타입화된 API를 생성해요. |
| jvm-abi-gen | ABI(Application Binary Interface) JAR을 생성해요. |
| js-plain-objects | 코틀린 클래스를 일반 자바스크립트 객체로 노출해서 JS 도구·라이브러리와의 상호운용을 개선해요. |
| kapt | 코틀린 코드에 자바 애너테이션 프로세서를 실행하고 추가 소스 파일을 생성해요. |
| Lombok | 코틀린 코드가 자바 소스에서 Lombok 애너테이션이 생성한 코드를 이해하고 사용할 수 있게 해요. |
| no-arg | 애너테이션이 붙은 클래스에 인자가 없는(no-argument) 생성자를 생성해서, 그런 생성자를 요구하는 프레임워크를 지원해요. |
| Power-assert | 표현식의 각 부분에 대한 상세한 값을 보여줘서 애서션 실패를 개선해요. |
| SAM with receiver | SAM 인터페이스가 리시버를 가진 람다(receivers)를 쓸 수 있게 해서 더 DSL 같은 문법을 가능하게 해요. |
| Serialization | 리플렉션 없이 코틀린 객체를 직렬화·역직렬화하는 코드를 생성해요. |
Google의 Android 팀이 유지보수하는 컴파일러 플러그인
Google의 Android 팀은 다음과 같은 컴파일러 플러그인을 유지보수해요.
| 플러그인 | 설명 |
|---|---|
| Compose compiler Gradle plugin | Compose 컴파일러를 Gradle과 통합해서 선언적 UI 기능과 Compose 특화 최적화를 가능하게 해요. |
| Parcelize plugin | Parcelable 구현을 자동으로 생성해서 안드로이드 컴포넌트 사이에서 코틀린 객체를 전달할 수 있게 해요. |
이 플러그인들로 해결 안 되면
이 플러그인들이 다루지 않는 방식으로 컴파일 과정을 조정해야 한다면, 먼저 KSP(Kotlin Symbol Processing) API나 Android lint 같은 외부 린터를 쓸 수 있는지 확인해 봐요. Kotlin Slack에서 살펴보거나, 여러분의 사용 사례에 대해 조언을 구해 볼 수 있어요.
그래도 필요한 걸 찾지 못하면 커스텀 컴파일러 플러그인을 만들 수 있어요. 다만 이 방법은 정말 마지막 수단으로만 쓰세요. 코틀린 컴파일러 플러그인 API는 불안정하기 때문이에요. 커스텀 컴파일러 플러그인을 만들면 매번 새 컴파일러 릴리스가 파괴적 변경(breaking changes)을 도입하므로, 유지보수에 상당한 지속적인 노력을 들여야 해요.