Search

왜 코틀린과 자바를 같이 쓸 때 롬복이 문제가 되나?

태그
면접질문
Java
Kotlin
CS
작성 상태
작성 완료
작성일
2024/11/16
참고 링크
참고 링크 2
면접 진행 과정에서 코틀린에 대해 아는 것이 있냐는 질문을 받았다. 코틀린은 전에 다른 기업 사전과제가 코틀린으로 작성해야 했기 때문에 문법을 살짝 공부한 적 있었다. 그 과정에서 느낀 현대적인 언어인 코틀린이 주는 편안함이 있었다고 말했다. 그런데 그 과정에서 코틀린과 자바를 함께 사용하는 환경에서 롬복을 사용하는데 문제가 있다는 글을 봤다는 이야기를 했다. 그리고 그 이유를 물어보셨다. 모르겠다고 하니 자바 컴파일 과정을 살펴보면 이유를 알 수 있을것이라 하셨다. 그래서 이 글을 쓴다.

자바 컴파일 과정과 롬복

자바 컴파일 과정을 한발 더 깊게 들어가면 다음과 같이 설명할 수 있다.
AST 생성 → 어노테이션 프로세싱 → AST로부터 .class 파일 생성

AST(Abstract Syntax Tree, 추상 구문 트리)

컴파일러는 본격적인 컴파일 과정 전에 소스 코드에 문법적으로, 의미적으로 문제가 없는지 확인해야 한다. 그리고 이를 위해 소스 코드를 분해해 트리 형태로 만든다. 이를 AST(Abstract Syntax Tree, 추상 구문 트리)라고 부른다. 왜 이런 자료구조를 만드는지는 컴파일러를 다루는 전문 서적이나 강의를 찾아보는 것이 좋을 듯 하다.
아무튼 핵심은 코드를 컴파일하는 과정에서 AST를 만들고 이를 활용해 실제 실행 가능한 명령어 형태로 바꾸는 것이다. 따라서, AST를 조작한다면 컴파일 과정에서 소스코드에는 없는 명령어를 추가하도록 유도할 수 있다.

어노테이션 프로세서와 롬복

자바에서 어노테이션을 컴파일 타임에 인식해 새로운 파일을 만들 수 있게 하는 공식 API다. javax.annotation.processing 패키지를 통해 제공되고, Processor 인터페이스를 구현하면 되나AbstractProcessor 추상 클래스를 상속하여 구현하는 것이 권장된다. 이 API를 통해 여러가지를 할 수 있다. Java 소스 코드를 생성하도록 할 수 있고, 필요하다면 다른 형태의 파일이 생성되게 할 수 있다.
어노테이션 프로세서는 기본적으로 존재하는 파일을 덮어쓰는 것을 허용하지 않는다.
그럼에도 불구하고, Lombok은 Java 컴파일러 내부에서 사용하는 API를 사용해 이런 제한을 넘어서 AST를 수정하는 방식으로 동작한다.

코틀린과 자바를 같이 쓸 때 컴파일 과정

코틀린과 자바를 같이 사용하는 환경에선 컴파일 과정이 조금 복잡해진다.
코틀린 코드 → 코틀린 컴파일러 → .class 파일 생성 → java 코드 컴파일 과정 진행
코틀린과 자바 컴파일 과정 출처 : https://d2.naver.com/helloworld/6685007
즉, 코틀린이 먼저 .class 파일로 컴파일되고(코틀린이 참조하는 자바 코드는 코틀린 컴파일러가 이 시점에 알아서 처리해준다), 그 경로를 class-path에 추가하여 java 코드에서 코틀린 코드를 사용할 수 있는 것이다.
그런데, 롬복은 자바 컴파일 과정에서 코드를 추가하므로 코틀린 컴파일러가 이를 인식하지 못하는 것이다.

해결법

코틀린 1.7.20 버전 미만에서는 롬복을 제거하는 것이 사실상 유일한 해법이었으나, 롬복이 코틀린을 지원하게 되고 나선 문제없이 사용할 수 있게되었다.
그런데, 자바와 코틀린을 함께 사용하는 환경은 결국 코틀린으로 변경하는 과정이라는 의미다. 그리고 코틀린은 언어 차원에서 롬복이 제공하는 여러 편의 기능을 제공해준다. 따라서, 코틀린 단독 사용환경에선 롬복을 사용했을 때 얻는 가치가 크게 떨어지기 때문에 결국은 롬복을 제거하는 방향으로 나아가는 것이 더 나을 것이라 생각한다.