카테고리 없음
[Spring] 트러블 슈팅 - @Sql 작동 에러와 트랜잭션
도도새 도
2024. 3. 6. 22:12
문제 발생 시나리오
@SQL 어노테이션을 사용하여 sql파일의 쿼리를 작동시키는 테스트 케이스를 만들고 있었으나, SQL이 작동하지 않는 문제가 발생하였다.
문제 1.
통합 테스트는 아래와 같이 작성되었다.
@SpringBootTest(classes = MyrecipeApplication.class)
@Transactional
@AutoConfigureMockMvc
public class RecipeTest_Ig {
즉, 개발 기간이 길어짐에 따라 @Transactional 어노테이션을 붙인 것을 잊고 있었다. 즉, 정상적으로 Sql이 작동한 후 롤백 되었던 것이다.
문제 2.
유닛 테스트는 처음에 아래와 같이 작성하였다.
public class RecipeTest {
@Autowired
RecipeService recipeService;
@Test
@Sql("/TestQuery/TestDeleteQuery.sql")
void When_InputSearchingCondition_Expect_Recipe(){
(...)
}
여기서 @Sql 어노테이션이 작동하지 않았다.
문제 해결 시도
문서에 이와 같은 설명이 있었다.
@Sql is used to annotate a test class or test method to configure SQL [scripts()] to be executed against a given database during integration tests.
이는 이 어노테이션이 통합 테스트 환경에서 작동한다는 것을 암시하였다. 따라서 컨텍스트 로드가 필요할 것이라고 판단, @SpringBootTest를 붙여주었다.
@SpringBootTest(classes = MyrecipeApplication.class)
public class RecipeTest {
@Autowired
RecipeService recipeService;
@Test
@Sql("/TestQuery/TestDeleteQuery.sql")
void When_InputSearchingCondition_Expect_Recipe(){
SpringBootTest는 아래의 역할을 한다
- SpirngBootContextLoader를 디폴트로 사용한다.(@ContextConfiguration을 사용하지 않은 경우)
- @SpringBootConfiguration을 서칭하여 적용한다.(@Configuration을 사용하지 않은 경우)
- 테스트를 위해 TestRestTemplate 그리고/혹은 WebTestClient 빈을 사용한다.
결과 및 결론
@Sql어노테이션으로 sql파일을 읽어 정상적으로 적용하였다. 또한 @Transactional을 통한 롤백 역시 정상임을 확인하였다.
reference: