Backend/Trouble Shooting

Java + Kotlin 프로젝트 QueryDSL QFile을 찾지 못하는 이슈(소스 세트 구성 오류)

지미닝 2024. 3. 29. 17:26

도입

 최근 내가 스타트업에서 하고 있는 프로젝트는 기존에 Php 라라벨로 작성되었다가 Java Spring으로 넘어와 지금은 Kotlin+Spring으로 짜여져있다. 이미 자바로 중요한 비지니스 로직이 짜여져있다보니 한 번에 모든 코드를 Kotlin으로 마이그레이션 하는 것은 비용적인 면에서 좋지 않기 때문에, 도메인 단위로 쪼개어서 필요하다면 마이그레이션을 진행하고 있는 상황이었다.

 

 다행이도 Java와 Kotlin은 같은 JVM언어로 서로 호환이 매우 잘 되는 편이지만(물론, 아직 경험이 그다지 많지 않아서 확실하진 않지만 대체로 그런 것 같다.) 외부 오픈소스 프로젝트를 사용하게 된다면 가끔 언어가 다르다는 이유로 Build할 때 예상하지 못한 문제를 겪기도 한다. 

 

 비교적 최근에 겪었던 문제인데, 만약 조금 더 열심히 보지 않았더라면 해결하지 못했을 수도 있겠다는 생각을 했다. 

 

사건의 전말...

 사건은 다음과 같다.

 

 코틀린으로 짜인 도메인과 Java로 짜인 도메인을 QueryDSL을 사용하기 위해 Build설정을 하고 QFile을 생성했다. 분명히 아래와 같이 빌드파일이 정상적으로 생겼으며, 자바 클래스도 코틀린 클래스도 둘 다 매우 정상적으로 빌드되었다.

 

그런데!! 자꾸 자꾸만 프로젝트에서 QFile이 import되지 않는 것이다!!  이런 문제를 소스세트 구성을 잘못해서 발생했다고 해서 소스 세트 구성 오류라고 부른다.

 

해결책

솔직히 해결책이라고 하기도 민망한 방법인데, 

sourceSets {
    val main by getting {
        java.srcDirs("src/main/java", "src/main/kotlin", "build/generated")
        kotlin.srcDirs("src/main/java", "src/main/kotlin", "build/generated")
    }
}

 

소스 세트 구성을 조금 다르게 정의했다. 기본적으로 Gradle은 src/main/java와 src/tset/java 디렉터리를 순수 Java 코드와 테스트코드의 기본위치로 사용한다. 

 

 java.srcDirs을 통해 Java 소스 파일을 찾을 디렉터리 목록을 지정했는데 이때 java,kotlin,generated디렉터리를 Java 소스 디렉터리로 지정하였다. 즉 Java와 Kotlin 소스 코드가 함께 사용될 수 있도록 하였으며 빌드 과정 중 생성되는 소스파일도 포함하였다. 코틀린도 마찬가지로 설정해주었다.

 

위 설정을 통해서 Gradle 빌드 시스템에서 Java와 Kotlin 소스파일 모두를 컴파일 대상으로 포함시켰다. 이런 설정은 꼭 QueryDSL뿐 아니라 Java + Koltin과 같이 여러 언어로 개발하는 경우에 다른 코드생성 라이브러리를 사용할 때 또는 프레임워크에 의해 생성된 소스 코드를 컴파일 프로세스에 포함시켜야하는 상황에서 필요할 수 있다.