카테고리 없음

[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: