@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());
}
...