본문 바로가기
spring

코틀린을 사용한 스프링 프로젝트에서 자바를 사용 할 때 자바 파일을 못 찾는 오류

by kdozlo 2024. 2. 24.

코틀린을 사용한 스프링 프로젝트에서 자바를 사용 할 때 자바 파일을 못 찾는 오류


문제 상황

  • 코틀린을 이용한 스프링 프로젝트에서 BalanceController 를 자바로 작성 했을때, postman으로 api 테스트 시 해당 컨트롤러 내의 url를 찾지 못했다.

      @RestController
      @RequestMapping("/account")
      public class BalanceController {
    
          private final Database db;
    
              public BalanceController(Database db) {
              this.db = db;
          }
    
          @GetMapping("{id}/balance")
          public Account balance(@PathVariable long id) {
              return db.balance(id);
          }
      }
    • 오류
  • 코틀린을 이용한 스프링 프로젝트에서 BalanceController 를 자바로 작성 했을때, 테스트 코드(
    AccountApplicationTests)에서 해당 컨트롤러의 path를 찾지 못한다.

      @SpringBootTest
      class AccountApplicationTests {
          @Autowired
          lateinit var controller: BalanceController
          private val log = LoggerFactory.getLogger(this.javaClass)!!
    
          @Test
          fun contextLoads() {
              log.info("calling get balance")
              val balance = controller.balance(1)
              assertEquals(balance, 0)
              assertEquals(10000, controller.deposit(1, 10000))
              assertEquals(5000, controller.withdraw(1, 5000))
          }
      }
    • 오류

문제 원인

  • 기본적으로 Gradle은 src/main/java 디렉토리를 Java 소스 디렉토리로 간주한다. 하지만 현재 프로젝트는 코틀린으로 작성하여 src/main/kotlin 으로 되어 있다. 따라서 자바 파일을 찾아서 스프링 컨테이너에 등록을 해줘야 하는데 자바 파일을 못 찾기 때문에 스프링 컨테이너에 등록하지 못한 것이 문제였다.

해결 방안

  • Gradle에서 자바 파일을 찾을 수 있도록 build.gradle.kts에 설정해 주어야 한다. 방법은 sourceSets를 이용하여 Java 소스 디렉토리(=자바 파일을 찾을 위치)를 명시적으로 지정한다.

      sourceSets {
          main {
              java {
                  srcDirs("src/main/kotlin") //자바 파일을 찾을 위치 지정
              }
          }
      }
  • 참고 : Java 소스 디렉토리를 새롭게 지정해 주어도 기본 디렉토리인 src/main/java 에서도 여전히 java 파일을 찾을 수 있다.