Repository (persistence layer) 계층의 통합테스트 (어떻게 보면 단위테스트에 가깝겠지만..) 를 하고 있었다.
그러기 위해서는 메서드별로, 아니면 테스트하고자 하는 클래스별로 SQL문을 미리 삽입하는 과정을 거치게 된다. 물론 BeforeEach로 해도 되지만, create table을 BeforeEach에 포함시키는 것은 가독성이 떨어진다고 생각했고, SQL파일안에 create table을 넣는다면 깔끔해질 것 같아서 찾아보던중
@Sql
어노테이션을 활용하는 방법으로 진행해보았다.
참고) JPA를 사용하지 않았다. 순수 JdbcTemplate, 쿼리를 직접 작성하였으므로 JpaTest의 도움을 받지 않았다.
먼저 @Sql 어노테이션은
@Sql is used to annotate a test class or test method to configure SQL scripts() and statements() to be executed against a given database during integration tests.
라고 공식문서에 설명이 잘 나와있다. 해석을 하자면, test class/method에 붙이는 annotation으로 통합테스트를 할 때 sql script를 설정하는 것이다.
이렇게 하면, 테스트 실행 이전에 sql문을 실행할 수 있게 된다.
그러면 어디서 해당 파일을 가져오는지에 관한 설명을 읽어보자.
[공식문서 URL] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/jdbc/Sql.html
Each path will be interpreted as a Spring Resource. A plain path — for example, "schema.sql" — will be treated as a classpath resource that is relative to the package in which the test class is defined. A path starting with a slash will be treated as an absolute classpath resource, for example: "/org/example/schema.sql". A path which references a URL (e.g., a path prefixed with classpath:, file:, http:, etc.) will be loaded using the specified resource protocol.
즉, @Sql 안에 /
를 쓰지 않고 파일이름만 적게되면, test할 클래스의 같은 경로 안에있는 파일이 실행된다고 분명 써있었다.
그래서 나는 이렇게 하면 될줄 알았다.
근데 자꾸만 FileNotFoundException이 발생했다.
Cannot read SQL script from class path resource [Funssion/Inforum/domain/post/comment/repository/CommentRepository.sql]
솔직히 어이가 없었다. 아니 분명 저 경로에 존재한다고 !!!!
그래서 약 4시간의 삽질 끝에 해결을 하게 된다.
요새는 모든사람이 JPA를 사용해서인지.. 참조할만한 자료는 거의 없었다.
아무리 생각해도, 상대경로로 sql파일을 불러오지 못하는 것은 말이 되지 않다고 생각했다.
그래서 classpath로 지정하면 인식을 하나? 라는 생각을 했었다.
classpath는 사실 좀 생소한 개념이라 찾아보았다.
Intelli J에서 class path는
Intelli J의 Project Structure 설정을 통해서 볼 수 있다.
우측을 보면 Test Source Folders 가 있고, Test Resource Folder가 보인다. 즉, source code의 class path는 (생략)/src/test/java이고
resource folder의 class path는 (생략)/src/test/resources 이다.
사실 처음에 해당 프로젝트 경로에 resources폴더가 아예 없었다.
그래서 우측 class path에 Test Resource Folders의 resources가 빨간색 글씨로 되어있었다.
여기서 한가지 쎄함을 느꼈다.
아 SQL 파일이 resources라 못가져오나?
라는 생각과 함께 왜 best practice로 sql 파일은 resources 밑에 두라고 하는지 이해가 가기 시작했었다.
그래서 sql파일을 resources 밑에 두고, classpath를 포함하여 코드를 변경하였다.
그러니 인식을 잘하게 되었다!!
나에게 남은건 다른 문제일뿐..