테스트에서의 @Transaction

Hyun·2023년 7월 11일
0

@Transaction 이 없을때
회원가입 TEST 메서드를 한 번 실행하고 나면 'spring' 이라는 name 값을 가진 데이터가 db에 들어가게 된다. 따라서 해당 메서드를 다시 실행했을때 동일한 name 값을 가진 데이터가 이미 db에 있기 때문에 에러가 발생한다.

@Transaction 이 있을때
@Transaction 을 TEST 케이스에 달면, TEST 메서드를 실행할때 먼저 transaction 을 걸고 쿼리를 수행한 다음, 메서드가 끝나면 다시 롤백(아예 반영을 X)한다.

따라서 다음 테스트에 영향을 주지 않기 때문에 매번 DB를 다시 지우는 코드가 필요 없게 된다. transaction 은 테스트 메서드마다 일일이 동작한다.

*@Transaction 의 해당 기능은 TEST 케이스에 사용될 때로 한정된다.

MemberServiceIntegrationTest.java

@SpringBootTest// 스프링 컨테이너와 테스트를 함께 실행
@Transactional 
class MemberServiceIntegrationTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    //보통 테스트용 DB를 따로 구축함
    @Test//given when then 패턴 활용
    void 회원가입(){
        //given
        Member member = new Member();
        member.setName("spring");
        //when
        Long saveId = memberService.join(member);
        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }
	...
profile
better than yesterday

0개의 댓글