--- tags: jpa, test, junit --- JPA Junit 에서 JPA 테스트 할때 @Transactional 유의사항 === ## @Transactional 이 있으면 insert, update 쿼리를 볼수 없다. > 자동키 생성 전략이 IDENTITY 가 아닐경우에 해당한다. Spring 은 테스트 시, @Transactional 이 있으면 커밋을 롤백 시켜준다. DB 에 영향을 주지 말라는 배려 이다. JPA 특징 중엔 rollback 이 발생하면 flush가 발생하지 않는점이 있는데, 이러한 특징 때문에 아래 테스트로는 insert 쿼리를 확인할 수 없다. > flush 란? `엔티티 스냅샷` 을 이용해서 변경 되는 엔티티들을 감지하고 있다가, 변경사항을 영속화 하기위한 sql들을 임시 저장한다. > 그러다 커밋 시점에 flush가 동작 하면서 모아둔 sql을 한번에 날린다. ```java= @Slf4j @RunWith(SpringRunner.class) @DataJpaTest public class MemberTest { @PersistenceContext private EntityManager em; @Test public void 테스트(){ Member member1 = new Member("member1"); Member member2 = new Member("member2"); Team team = new Team("team1"); team.addMember(member1, member2); em.persist(team); // 쿼리 미발생 } } ``` 앞서 얘기 했지만 이런 특징은 IDENTITY 에서는 해당 하지 않는다. IDENTITY 설정 에서는 insert 쿼리 3개를 전부 확인 할 수 있다. 영속성 관리를 위해 ID 부여 해야 하는데, AI 특성상 저장하기 전에는 ID 를 발급 받을수 없기 때문이다.