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