@Transactional
결론: 메소드가 아닌 클래스 레벨에서 정의해줘야 한다.
Repository에 붙여줘도 되는데 ( rollback 처리 후 )
테스트
해당 서비스 클래스에 Alt+Enter
해서 테스트 코드를 작성하자.
AssertJ 의 AssertThat을 사용하려면
import org.assertj.core.api.Assertions;
//...
Assertions.assertThat(member).isEqualTo(memberService.findOne(savedId));
@SpringBootTest
@Transactional
class MemberServiceTest {
@Autowired
MemberRepository memberRepository;
@Autowired MemberService memberService;
@Test
// @Rollback(false) // 하면 insert 쿼리가 보일 것이다.
public void 화원가입()throws Exception{
Member member = new Member();
member.setName("kim");
// insert 쿼리(persist)가 나가지 않는다
// 테스트에서 @Transactional은 컷밋 되지않고 롤벡한다.
// 중복 유저 검사하면서 jpql은 실행즉시 쿼리를 실행된다. (영속성 컨택스트 X)
Long savedId = memberService.join(member);
// 먼저 영속성 컨텍스트를 뒤지기에 DB를 조회할 필요가 없다.
// IDENTITY 전략을 사용하면 DB에 저장해야지 ID를 가져올 수 있기에 insert 쿼리가 발생한다.
Assertions.assertThat(member).isEqualTo(memberService.findOne(savedId));
}
}