영속성 컨텍스트?? JPA를 공부하면서 가장 많이 듣는 단어이다. 또한 JPA에서 ORM(객체와 RDB와 매핑)하는 것과 동시에 매우 중요한 개념이다. 따라서 영속성 컨텍스트에 대해서 공부하고 포스팅하려 한다.
User user = new User("user1");
User user = new User("user1");
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
em.persist(user);
User user = new User("user1");
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
em.persist(user);
em.detach(user);
User user = new User("user1");
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
em.remove(user);
1. 1차 캐시
em.persist(user); // 영속성 컨텍스트(1차 캐시)에 저장
User findUser = em.find(User.class, 1L); // DB 접근없이 1차 캐시에서 조회
2. 동일성 보장
em.persist(user); // 영속성 컨텍스트(1차 캐시)에 저장
User findUser1 = em.find(User.class, 1L); // DB 접근없이 1차 캐시에서 조회
User findUser2 = em.find(User.class, 1L); // DB 접근없이 1차 캐시에서 조회
findUser1 == findUser2 // true
3. 트랜잭션을 지원하는 쓰기 지연
4. 변경 감지
em.persist(user); // 영속성 컨텍스트(1차 캐시)에 저장
User findUser1 = em.find(User.class, 1L); // DB 접근없이 1차 캐시에서 조회
findUser1.setName("user2"); // 영속 엔티티 수정
commit! // 커밋시 쓰기 지연 SQL 저장소의 쿼리문 실행
5. 지연 로딩