본문 바로가기

Programming/과거포스팅

[JPA] - 영속성 컨텍스트(persistence context)의 특징

 영속성 컨텍스트(persistence context)의 특징


1. 1차캐시

영속성 컨텍스트는 내부에 가지고 있는 캐시. 영속 상태의 엔티티가 저장되는 곳이다.

em.persist(member)

위의 코드를 실행하여 엔티티를 저장하면 1차캐시에 엔티티를 저장한다.

em.find(Member.class, id);

위의 코드와 같이 엔티티를 조회해도 1차 캐시에 저장된다. 데이터 베이스를 조회할 때 1차 캐시를 먼저 조회하고 1차 캐시에 없으면 데이터베이스에서 조회를 한다.


2. 동일성


Member findMember = em.find(Member.class, id);

Member findMember2 = em.find(Member.class, id);

System.out.print(findMember == findMember2)


위의 코드를 시행하면 true가 출력이 된다. 이 말은 한번 호출해서 1차 캐시에 저장된 엔티티는 다시 호출해도 영속성 컨텍스트에 있는 동일한 인스턴스를 리턴해 준다는 말이다.


3. 쓰기지연(transactional write-behind)

엔티티매니저는 em.persist(member);  를 실행할 경우 바로 데이터베이스에 저장하지 않는다. 트랜잭션이 커밋되는 순간 모아둔 쿼리를 데이터베이스에 보내는데 이것을 쓰기 지연이라고 한다. 쓰기 지연의 장점은 실시간으로 쿼리를 데이터베이스에 보내더라도 트랜잭션 커밋을 하지 않으면 데이터는 저장되지 않는다. 그렇기 때문에 쓰기 지연은 가능한 것이고 트랜잭션 시점에 쿼리를 보내도 결과는 동일하다. 오히려 오류등으로 인해서 트랜잭션이 중단될 경우는 쿼리 자체를 데이터베이스에 보내지 않기 때문에 성능을 최적화 할 수 있다.



4. 변경감지(dirty checking)

쓰기나 삭제 같은경우는 em.persist()와 같이 명시적으로 특정 메서드를 호출한다. 하지만 수정 같은 경우는 특정 메소드를 호출하지 않은데 이것은 JPA에서 자동으로 엔티티 변경사항을 데이터베이스에 자동으로 반영해주기 때문이다. 이것을 변경감지라고 한다.