공부하다죽어라
article thumbnail
Published 2021. 5. 14. 18:32
[JPA] 영속성 컨텍스트 개발/JAVA
영속성 컨텍스트

엔터티를 영구저장할 수 있는 환경을 의미한다.

 

JPA를 이해하는데 가장 중요한 용어로서 영속성 컨텍스트를 통해 JPA의 내부 구조 방식을 이해할 수 있다.

영속성 컨텍스트는 논리적인 개념이다. 이에 접근하기 위해서 우리는 엔터티 매니저를 이용해야한다.

엔터티 매니저와 엔터티 팩토리

영속성 컨텍스트를 활용함으로서 다음과 같은 이점을 얻을 수 있다.

 

1차 캐시

//엔티티를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//엔티티를 영속
em.persist(member);

EntityManager내부의 persist 매서드를 사용함으로서 엔터티를 영속할 수 있다.

JPA는 우선적으로 member를 찾을 때 DB로 바로가서 데이터를 탐색하지 않는다.

조회하는 함수를 사용하게 되면 1차 캐시 목록으로 가서 데이터가 존재하는지 확인한 뒤, 데이터가 없다면 그 때 DB에 접근하여 데이터를 탐색한다.

 

엔터티 매니저 팩토리는 '한번만'

엔터티 매니저는 트랜잭션을 처리하고 종료한다.

 

동일성(identity) 보장

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true

반복적인 읽기의 트랜잭션 격리 처리를 데이터베이스에서 하는 것이 아닌 JPA를 통해 애플리케이션 레벨에서 제공한다.

 

트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

transaction.begin();
em.persist(memberA);
em.persist(memberB);

transaction.commit();

멤버변수를 persist한다고 Insert쿼리문이 전달되지 않는다.

persist는 단지 객체를 영속한다는 의미인 것이지 곧바로 DB에 반영되는 것이 아니다.

영속 상태는 다시말하면 '1차캐시에 올라간 상태'를 말한다.

transaction.commit(); 를 통해 트랜잭션 커밋을 하는 순간 INSERT 쿼리문이 전달된다.

 


변경 감지 (Dirty Checking)

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();

Member memberA = em.find(Member.class, "memberA");
memberA.setUsername("hi");
memberA.setAge(10);

transaction.commit(); 

위 코드에서 member변수를 수정하고 그 이후로는 Update를 한 코드가 보이지 않는다.

그 이유는 JPA의 변경감지 기능 때문인데, JPA의 핵심은 객체와 RDB를 맵핑하여 애플리케이션 레벨에서 객체를 다루는 것 처럼 사용하기 위한 것이 궁극적인 목표인데 이러한 JPA의 특성 때문에 1차 캐시에서 가져온 멤버 변수는 변화가 감지되면 자동적으로 쓰기 지연 SQL 저장소에 Update문으로 저장되고 트랜잭션이 마무리될 때 자동적으로 DB에 수정된다.

 

 

엔터티의 생명주기

 

'개발 > JAVA' 카테고리의 다른 글

[JPA] QueryDsl Maven 설정  (0) 2021.06.10
profile

공부하다죽어라

@슥혁

감사합니다 👍🏻