• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@SpringBootTest 여러 개 사용 시 데이터 남아있는지 여부 문의

24.04.30 15:48 작성 24.04.30 16:12 수정 조회수 70

1

안녕하세요.
프로젝트 내에서 통합 테스트를 위해서 @SpringBootTest를 사용한 여러 테스트 코드를 작성하였습니다.

예를 들어 아래와 같이 별개의 2개 테스트 코드에는 각각 school table의 값을 생성 및 조회하는 코드가 들어있습니다.

@SpringBootTest
@Transactional
class aTest {
   // JPA 사용해서 school Table의 data 생성/조회
   
}

---------------------
@SpringBootTest
@Transactional
class bTest {
   // JPA 사용해서 school Table의 data 생성/조회
}

 

위와 같이 테스트 코드를 작성하고 aTest.java 에서 school table에 3개의 데이터를 넣은 경우, bTest.java 에서 school 테이블의 값을 읽었을 때, aTest.java에서 넣은 값은 지워지는 것인지요? 아니면 그대로 남아 bTest.java 에서 조회가 가능한 것인지요?

@Transactional이 들어가 있는 경우 데이터가 rollback 되는 것으로 알고 있어서, bTest.java에서 읽었을 때는 빈 테이블이 있을 것으로 예상했는데, 테스트를 해보면 School table의 id 값(자동 증가하는 값)이 bTest.java에서 처음 읽었을 때 4로 보이는 현상이 있어서 질문을 드립니다.

 

답변 2

·

답변을 작성해보세요.

1

안녕하세요, korn79 님!

AI 인턴이 저보다 먼저 답을 잘 해주었네요. ㅎㅎ
데이터는 롤백되는 것이 맞지만, DB 레벨에서 제공하는 ID의 자동증가 값은 트랜잭션 롤백과 무관하게 계속 증가됩니다.
따라서 이런 테스트를 작성할 때에는, ID의 값이 얼마다(ex. id가 1이다)라고 검증하기 보다는 그 외 비즈니스 키(해당 객체를 식별할 수 있는 키)로 내가 조회한 데이터가 예상한 데이터가 맞는지 검증하는 것이 좋습니다.

도움이 되셨기를 바랍니다.
감사합니다. 🙂

korn79님의 프로필

korn79

질문자

2024.05.08

딥변 감사합니다.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.02

안녕하세요, 인프런 AI 인턴입니다.

@Transactional 어노테이션을 사용하면, 테스트가 종료된 후에 데이터 변경 사항을 롤백시키는 것으로 알려져 있습니다. 그런데, 여러분이 질문하신 현상은 자동 증가하는 id 값이 연속적으로 증가하는 것과 관련이 있습니다.

질문하신 내용에 따르면, @SpringBootTest를 사용하여 별도의 테스트 클래스에서 테스트를 진행할 때 @Transactional 어노테이션이 각 테스트의 데이터 변경 사항을 롤백시킵니다. 하지만, 테스트 간에 데이터베이스의 자동 증가 필드(예: AUTO_INCREMENT in MySQL, SERIAL in PostgreSQL) 값은 초기화되지 않습니다. 이는 데이터베이스의 자동 증가 카운터가 트랜잭션 롤백의 영향을 받지 않기 때문입니다.

따라서, aTest.java에서 school 테이블에 데이터를 삽입 후 테스트가 롤백되어도, bTest.java에서 처음 데이터를 삽입할 때의 id 값은 aTest.java에서의 마지막 id 값 이후가 됩니다. 이는 각 테스트 진행 후 데이터는 사라지지만, id 카운터는 리셋되지 않아서 발생하는 현상입니다.

테스트 환경에서 id 값의 연속성이 중요하지 않다면 이 현상은 일반적으로 큰 문제가 되지 않습니다. 하지만 테스트에서 id 값에 의존하는 특정 로직이 있을 경우, 테스트가 서로에게 영향을 주지 않도록 각 테스트 메서드나 클래스에서 필요한 초기화 코드를 명시적으로 작성해야 할 수도 있습니다.

이러한 상황을 제어하고 싶다면, @DirtiesContext 어노테이션을 사용하여 스프링 컨텍스트를 각 테스트 후에 재설정할 수 있습니다. 하지만 이 방법은 매우 비용이 많이 들기 때문에 신중하게 사용하는 것이 좋습니다.