1. 애노테이션 프로세서 소개
- 애노테이션 프로세서는 자바 컴파일 시점에 특정 애노테이션이 붙은 요소를 검색하고 처리하는 특별한 도구입니다.
- 컴파일 시점에 동작하기 때문에 런타임 오버헤드가 없으며, 소스 코드나 바이트 코드를 분석하고 생성할 수 있습니다.
- 프로젝트 빌드 과정에서 자동으로 코드를 생성하거나 검증하는 데 주로 사용됩니다.
1.1 주요 특징과 장점
- 컴파일 타임 검증: 애노테이션 프로세서는 컴파일 단계에서 오류를 발견하여 런타임 오류를 미리 방지합니다.
- 보일러플레이트 코드 자동 생성: 반복적이고 기계적인 코드를 자동으로 생성하여 개발자 생산성을 높입니다.
- 메타프로그래밍 지원: 코드가 코드를 생성하는 메타프로그래밍 패러다임을 자바에서 구현할 수 있게 합니다.
- 타입 안전성 향상: 문자열 기반 참조 대신 컴파일러가 검증할 수 있는 형태로 코드를 생성합니다.
1.2 대표적인 활용 사례
- Lombok:
@Getter,@Setter,@Builder등의 애노테이션으로 반복적인 코드 자동 생성 - MapStruct: 객체 간 매핑을 위한 코드 자동 생성
- Dagger/Hilt: 의존성 주입을 위한 팩토리 코드 자동 생성
- QueryDSL: 타입 안전한 쿼리를 위한 Q 클래스 생성
- JPA 메타모델 생성기: JPA 정적 메타모델 클래스 생성
2. 애노테이션 프로세서 작동 원리
- 애노테이션 프로세서는 Java Compiler API(JSR 269)를 기반으로 작동합니다.
- javac 컴파일러가 소스 코드를 처리할 때 특정 라운드(round)에 걸쳐 애노테이션 프로세싱이 이루어집니다.
2.1 처리 과정
- 컴파일러는 소스 코드를 파싱하여 추상 구문 트리(AST)를 생성합니다.
- 컴파일러는 각 라운드마다 아직 처리되지 않은 애노테이션을 찾아 등록된 프로세서를 실행합니다.
- 프로세서는 애노테이션이 달린 요소(클래스, 메서드, 필드 등)에 접근하여 정보를 수집합니다.
- 필요에 따라 새로운 소스 파일을 생성하거나 오류/경고 메시지를 출력합니다.
- 새로운 소스 파일이 생성되면 다음 라운드에서 해당 파일도 처리 대상이 됩니다.
- 더 이상 처리할 애노테이션이 없거나 새로운 소스 파일이 생성되지 않으면 프로세싱이 종료됩니다.
2.2 주요 컴포넌트
javax.annotation.processing.Processor인터페이스: 모든 애노테이션 프로세서의 기본 인터페이스javax.annotation.processing.AbstractProcessor클래스: 프로세서 구현을 위한 편의 클래스javax.lang.model패키지: 언어 모델 요소 및 타입에 접근하기 위한 APIjavax.annotation.processing.Filer인터페이스: 새로운 소스/리소스 파일 생성을 위한 APIjavax.tools.Diagnostic클래스: 컴파일러 메시지(오류/경고) 출력을 위한 API
정보
Java 9부터는 javax.annotation.processing 패키지가 jakarta.annotation.processing으로 이동했으며,
모듈 시스템 도입에 따라 module-info.java에서 프로세서 사용을 위한 설정이 필요할 수 있습니다.
3. 간단한 애노테이션 프로세서 구현하기
3.1 개발 환경 설정
- 애노테이션 프로세서는 독립적인 모듈로 개발하는 것이 좋습니다.
- Maven이나 Gradle을 사용하여 프로젝트를 구성합니다.