ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kotlin과 Lombok 컴파일 에러 해결
    프로젝트/자프링 -> 코프링 마이그레이션 2022. 11. 30. 00:01
    728x90

    Java 코드를 코틀린으로 변경하던 중 컴파일 에러가 발생했습니다.

    fun toBoardResponseDTO(): BoardResponseDTO {
            return BoardResponseDTO.builder()
                .id(id)
                .title(title)
                .content(content)
                .writer(writer)
                .hits(hits)
                .build()
        }

    위의 코드를 호출할때 발생하였는데 에러 로그는 다음과 같습니다.

     

    Unresolved reference: builder

    BoardResponseDTO는 Lombok을 사용하여 @Builder를 사용합니다.

     

     

    원인

    문제의 원인을 이해하려면 Java 코드와 Kotlin 코드가 섞여 있는 프로젝트의 빌드 과정을 알아야 합니다.

    https://d2.naver.com/helloworld/6685007

    1. Kotlin 컴파일러가 Kotlin을 컴파일 해 .class 파일을 생성한다.

    2. Java 컴파일러가 Java코드를 컴파일 해 .class 파일을 생성합니다.

     

    이때 Kotlin 코드가 컴파일된 이후에 Java의 Lombok이 생성한 코드를 사용할 수 없게 됩니다.

     

    해결방법

    결론적으로는 Lombok을 제거하는 방법을 선택했습니다.

     

    빌드 순서 조정

    Kotlin 코드보다 Java코드를 먼저 컴파일하도록 빌드 순서를 조정하면 됩니다.

    하지만 Java 코드에서 Kotlin 코드를 호출할 수 없게 됩니다.

     

    Java와 Kotlin을 별도 모듈로 분리

    모듈 간 의존성 방향에 따라 Java코드에서 Kotlin코드를 호출하거나 Kotlin 코드에서 Java 코드를 호출하는 것이 불가능해집니다.

     

    빌드 전처리 과정에 Delombok 실행

    Delombok을 실행하여 Lombok이 코드를 미리 생성하도록 합니다.

    하지만 공식 플러그인으로 gradle이 지원하지 않아 복잡해집니다.

     

    Lombok이 적용된 코드를 Kotlin으로 변환

    data class로 변환하여 constructor, getter, setter, eqauls(), hashCode(), toString() 메서드 등을 별도로 구현하지 않아도 손쉽게 사용할 수 있습니다.

     

     

    Lombok 제거

    프로젝트의 규모가 작지만 일괄 제거를 하지 않고 점진적으로 변환하려고 합니다.

     

    롬복을 제거하고 다음과 같이 data class를 사용하였습니다.

    data class BoardResponseDTO(
        val id : Long,
        val title : String,
        val content : String,
        val writer : String,
        val hits : Long,
    )

     

    fun toBoardResponseDTO(): BoardResponseDTO {
        return BoardResponseDTO(
            id = this.id,
            title = this.title,
            content = this.content,
            writer = this.writer,
            hits = this.hits,
        )
    }

     

     

    참고자료

    https://d2.naver.com/helloworld/6685007

     

    댓글

Designed by Tistory.