문제 상황
- 코틀린을 이용한 스프링 프로젝트에서
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 파일을 찾을 수 있다.
'개발' 카테고리의 다른 글
예외 처리시 원하는 예외 응답값이 안오는 경우 (4) | 2024.04.29 |
---|---|
@ColumnDefault 동작 안함(사실 동작함. 단지 적용이 안됐을 뿐.) (4) | 2024.04.15 |
스프링부트 프로젝트를 도커를 이용하여 배포해 보자! (1) | 2023.12.29 |
에러 - Unknown return value type: java.lang.Integer (0) | 2023.05.14 |
3장 - 스프링 부트에서 JPA로 데이터베이스 다뤄보자 (1) | 2023.04.17 |