---
# System prepended metadata

title: JPA Junit 에서 JPA 테스트 할때 @Transactional 유의사항
tags: [' test', jpa, ' junit']

---

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

