---
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 를 발급 받을수 없기 때문이다.