-
Notifications
You must be signed in to change notification settings - Fork 8
Lombok Annotation Processor 의존성을 추가한 이유
레벨 3 해커톤 중 에러를 마주쳤습니다.
잘만 동작하던 코드였는데, 갑자기 컴파일에 실패했습니다. @Getter
를 사용한 코드들에서 메서드를 찾을 수 없다는 에러였는데요.
해당 에러를 해결하기 위해서는 Lombok Annotation Processor
에 대한 의존성을 추가했습니다.
이 의존성은 무엇이고 왜 추가해야 하는지 알아봅시다!
Lombok Annotation Processor에 대해 알기 전에 Annotation Processor에 대해 알아보아야 할 것 같은데요.
Annotation Processor는 Java 소스 코드나 컴파일된 클래스에서 말 그대로, 애노테이션을 처리하는 도구입니다.
컴파일러는 소스 코드에서 애노테이션을 발견하면 해당 애노테이션을 처리할 Annotation Processor를 찾아 활성화합니다.
자바에서는 Java 6부터 도입된 Annotation Processing API를 통해 Annotation Processor를 제공합니다.
Processor 인터페이스를 보면, 애노테이션 프로세서를 위한 인터페이스로 컴파일 시 애노테이션을 처리하는 역할을 합니다.
Processor는 어노테이션을 여러 라운드에 걸쳐 다음과 같이 처리합니다.
- 각 라운드에서 애노테이션 프로세서가 실행되고, 그 과정에서 새로운 소스 파일을 생성할 수 있습니다.
- 새로운 소스 파일이 생성되면 다음 라운드가 시작됩니다.
- 더 이상 새로운 소스 파일이 생성되지 않으면 처리가 종료됩니다.
- 자바 Annotation Processing API 사용방법
내가 직접 생성한 Annotation을 다른 방식으로 처리하고 싶다라면 AbstractProcessor 클래스를 상속하여 Annotation Processor를 직접 구현하면 됩니다.
다시 롬복으로 돌아와서, Lombok은 다들 아시다 싶이 반복적인 보일러 플레이트 코드 (ex. getter)를 Annotation 형태로 사용할 수 있게 해주는 라이브러리인데요.
앞의 내용을 토대로 Lombok Annotation Processor가 무엇인지 유추할 수 있습니다. 바로 Lombok 어노테이션에 대한 Annotation Processor 라는 것인데요.
Annotation Processor를 주입해줘야 하는만큼 Lombok의 Annotation Processor은 보통의 자바 Annotation Processor과 조금 다르게 동작합니다.
그래서 의존성을 굳이 추가해주어야 하는 것이죠!
그러면 추가한 Lombok의 Annotation Processor이 무슨 일을 해주는지 알기 전에 여기서 알아야 할 하나의 개념이 또 있습니다 !
바로 Abstract syntax tree인데요.
Syntax tree는 Parse Tree라고도 불리는데요.
Parse Tree 즉, 구문 분석 트리는 프로그래밍 언어나 자연어의 문장 구조를 나타내는 트리 구조입니다. 주로 컴파일러 설계와 자연어 처리에서 사용되며 소스 코드의 모든 구문적 세부 사항을 포함합니다.
AST는 즉, abstract syntax tree란 위의 syntax tree를 추상화한 트리입니다.
AST는 Parse Tree보다 추상화된 형태로, 불필요한 구문적 세부사항을 제거합니다.
때문에 코드의 구조를 더 명확하게 표현하며, 코드 분석과 변환에 용이합니다.
다시 돌아와서, Lombok Annotation Processor는 AST를 조작하는 방식으로 작동합니다.
전체 과정을 살펴보면 다음과 같습니다.
- Lombok Processor는 AST를 순회하며 롬복 애노테이션(@Getter, @Setter 등)을 찾습니다.
- 각 애노테이션에 대응하는 핸들러를 호출합니다. 각 핸들러는 AST를 분석하고 필요한 코드를 생성합니다.
- 예를 들어, @Getter 애노테이션을 만나면 GetterHandler가 getter 메서드에 해당하는 AST 노드를 생성합니다.
- 생성된 AST 노드를 기존 AST에 주입합니다.
- 이때 롬복은 자바 컴파일러의 내부 API를 사용하여 AST를 직접 수정합니다.
- 수정된 AST 컴파일
- 롬복에 의해 수정된 AST를 기반으로 자바 컴파일러가 바이트코드를 생성합니다.
- 컴파일된 클래스 파일에는 롬복이 생성한 메서드가 포함됩니다. 원본 소스 코드는 변경되지 않지만, 컴파일된 결과물에는 추가된 코드가 반영됩니다.
이렇게 롬복이 어떻게 동작하는지 알아보았습니다.
정리하면, Lombok 어노테이션을 사용할 때, 해당 어노테이션 처리를 해주는 Lombok Annotation Processor가 필요하고 그 Processor는 AST를 조작하여 컴파일 전에 개발자가 작성하지 않는 코드를 추가시켜준다라고 아시면 좋을 것 같습니다 !
- 백엔드 코드 컨벤션
- 백엔드 기술 스택 및 선정 이유
- 각종 인스턴스 설정 파일 및 구성 위치 가이드
- ERD (24.09.27)
- 백엔드 CI CD 동작 프로세스
- 로컬 DB 환경 설정
- 백엔드 로깅 전략
- 백엔드 로그 모니터링 구성도
- 스프링 메트릭 모니터링 구성도
- Flyway 로 스키마 관리
- 코드잽 서버 구성도
- Git Submodule 사용 메뉴얼
- 프론트엔드 코드 컨벤션
- 프론트엔드 기술 스택 및 선정 이유
- 프론트엔드 서비스 타겟 환경 및 브라우저 지원 범위 선정
- 프론트엔드 모니터링 및 디버깅 환경 구축
- 프론트엔드 테스트 목록
- 프론트엔드 라이브러리 기술 검토
- 프론트엔드 개발서버, 운영서버 빌드 및 배포 환경 구분
- 목표했던 타겟 환경과 디바이스에서 서비스 핵심 기능 동작 확인
- 프론트엔드 접근성 개선 보고서
- EC2 로그 확인 방법
- VSCode를 통한 EC2 인스턴스 SSH 연결 방법
- 터미널을 통한 EC2 인스턴스 SSH 연결 방법
- NGINX 설정 파일 접근 및 적용 방법
- DB 접속 및 백업 방법
- [QA] 배포 전 체크리스트
- CI 파이프라인 구축
- CD 파이프라인 구축
- 백엔드 CI CD 트러블슈팅
- Lombok Annotation Processor 의존성을 추가한 이유
- 2차 스프린트 기준 ERD
- DTO 검증하기
- ProblemDetail
- Fork된 레포지토리 PR에서 CI Secrets 접근 문제 해결
- AWS CloudWatch 모니터링
- 스프링 메트릭 모니터링 구축 방법
- 로깅과 Logback에 대해 알아보아요.
- 백엔드 CD 파이프라인 Ver.2
- 요청, 응답 로그에 correlationId 를 추가하자!
- 3차 스프린트 기준 ERD
- 더미데이터 생성하고 실행하기
- 쿼리 성능 개선 결과
- 테이블별 인덱스 설정 목록
- 사용자 증가 시 발생할 수 있는 문제 상황과 개선 방안
- k6를 사용한 서버 부하 테스트
- 6차 스프린트 기준 ERD
- Query Performance Improvement Results
- 테스트 전략 및 CI 설정
- CI CD 구조
- 배포 전, 로컬에서 로그인 기능 포함 테스트해보는 법
- stylelint 적용기
- 내 작업 브랜치 중간에 Merge된 동료의 작업물을 넣고 싶다면 pull vs rebase
- [TS] Webpack config
- [TS] Webpack 환경에서 MSW v2 이슈
- [TS] webpack에서 react‐router‐dom 적용 안됨
- 2024.07.28 새 기획 회의
- 2024.07.26 2차 데모데이 후 회의
- 2024.07.11 백엔드 논의 좀 할게요
- 2024.07.11 백엔드 ERD 회의
- 2024.07.09 깃 브랜치 전략, PR 템플릿 회의
- 2024.07.03 주제 선정 회의
- 2023.07.03 팀빌딩데이 킥오프 회의
- 2023.08.07 3차 스프린트 중간회고