개발

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

kdozlo 2024. 2. 24. 23:52

문제 상황 

  • 코틀린을 이용한 스프링 프로젝트에서 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 파일을 찾을 수 있다.