1. Java에서의 Lombok
Lombok은 Java 개발에서 생산성을 높이기 위해 사용되는 라이브러리로, 번거로운 보일러플레이트 코드를 줄이는 데 탁월합니다. Lombok은 컴파일 타임 애노테이션 프로세싱을 통해 getter/setter, equals, hashCode, toString 등과 같은 메서드를 자동으로 생성합니다. 대표적인 Lombok 애노테이션은 다음과 같습니다:
- @Getter / @Setter: 클래스 필드에 대한 getter와 setter 메서드를 생성.
- @ToString: 객체의 toString 메서드를 자동으로 생성.
- @EqualsAndHashCode: equals 및 hashCode 메서드 생성.
- @Builder: 빌더 패턴 생성.
- @Data: @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 한 번에 적용.
- @NonNull: null 체크 코드를 자동으로 추가.
Java에서 Lombok의 장점
- 코드 간결화: 보일러플레이트 코드 제거.
- 생산성 향상: getter/setter를 수동으로 작성할 필요가 없어짐.
- 가독성 증가: 클래스 본문이 간결하게 유지됨.
- 안전성: 런타임 동작이 아닌 컴파일 타임에 코드를 생성하므로 성능에 영향을 주지 않음.
2. Kotlin과 Lombok
Kotlin은 자체적으로 보일러플레이트 코드를 줄이는 데 강력한 언어적 특성을 가지고 있습니다. 대표적으로:
- 데이터 클래스 (data class): Kotlin의 data class는 Lombok의 @Getter, @Setter, @ToString, @EqualsAndHashCode 등을 대체.
- 기본값 매개변수: Lombok의 @Builder를 Kotlin의 기본값 매개변수로 대체 가능.
- Null-Safety: Kotlin의 타입 시스템은 Lombok의 @NonNull보다 강력한 null-safety를 제공합니다.
Kotlin에서 Lombok 사용
Kotlin에서 Lombok을 사용할 수 있지만, Kotlin의 기능이 대부분 Lombok의 기능을 대체할 수 있어 필요성이 적습니다. 또한, Lombok의 애노테이션은 Java 코드에서 작동하도록 설계되었기 때문에 Kotlin과의 호환성 문제를 야기할 수 있습니다.
3. Java와 Kotlin을 함께 사용할 때 Lombok의 문제점
Java와 Kotlin을 함께 사용하는 프로젝트에서 Lombok을 사용하는 경우 다음과 같은 문제가 발생할 수 있습니다:
Java의 Lombok을 Kotlin에서 인식하지 못하는 문제가 발생합니다.
- Lombok은 컴파일 타임에 Java 바이트코드로 메서드를 생성합니다.
- 이 과정은 Java 컴파일러(javac)에서 동작하지만, Kotlin Compiler는 Lombok이 생성한 코드를 자동으로 인식하지 못할 수 있습니다.
- Java 파일을 .class파일로 컴파일 할 때 Lombok 어노테이션을 프로세싱하여 코드를 생성하는데 컴파일 될 때는 Lombok 어노테이션에 해당하는 메소드나 기능이 존재하지 않습니다.
- 이로 인해 코틀린 코드가 존재하지 않는 메소드를 사용하는 것으로 인식하기 때문에 에러가 발생합니다.
4. 해결 방법은? Lombok이 적용된 Java 클래스를 Kotlin 클래스로 변환 !
Lombok이 적용된 Java 클래스를 Kotlin 클래스로 변환하는 것을 추천합니다.
이 경우에는 간결한 코드를 사용하면서 동시에 호환성을 유지할 수 있다는 장점이 있습니다.
data class Season(
val sportsCode: Long?,
val leagueCode: Long?,
val startDate: String?,
val endDate: String?
)
물론 @ToString, @EqualsAndHashCode 이 필요한 경우 수동으로 작성해야 합니다.
자바와 코틀린이 100% 호환된다고는 하지만 자바 기반의 모든 부분을 완벽하게 호환하지 않는 부분들이 있습니다.
따라서 자바프로젝트를 코틀린으로 마이그레이션 할 때는 일부가 아닌 전부를 진행하는게 더 추천되며, 향후 개발이나 유지보수에도 문제가 없을 것으로 판단됩니다.
Lombok의 예를 들면, Java와 Kotlin 코드를 함께 사용하는 경우, 기존 Java 코드에 Lombok을 유지하면서 Kotlin 코드에서는 Lombok을 대체하는 전략을 사용할 수 있습니다.
마이그레이션 전략은 충분한 협의를 통해 진행하는게 바람직하다고 생각합니다.