컴파일러 플러그인

컴파일러 플러그인 (Compiler plugins)

컴파일러 플러그인은 컴파일러 자체를 수정하지 않으면서, 코드가 컴파일되는 동안 그 코드를 분석하거나 변경하기 위해 컴파일 과정에 끼어드는(hook) 도구예요. 예를 들어 코드에 애너테이션을 달거나, 다른 프레임워크·API와 호환되도록 새 코드를 생성할 수 있어요.

이 페이지에서는 사용할 수 있는 코틀린 컴파일러 플러그인들과, 그중 어느 것도 여러분의 사용 사례에 맞지 않을 때 할 수 있는 일을 설명할게요.

출처: 공식문서 - Compiler plugins

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)을 도입하므로, 유지보수에 상당한 지속적인 노력을 들여야 해요.

더 알아보기 (Learn more)