아무나개발하자

영속성 관리 본문

JPA

영속성 관리

개발천재나천재 2022. 8. 4. 17:20

JPA에서 가장 중요한 2가지

- JPA에서 가장 중요한 내용 2가지에 대해 소개하겠다. 첫번째는 객체와 관계형 데이터베이스와의 매핑, 이 내용은 뒤부분에서 다루겠다. 두번째는 영속성 컨텍스트, 이번에 중심적으로 소개할 내용이 영속성 컨텍스트이다. 이름과 뜻이 먼가 와닿지 않아서 처음에는 어려울 수 있지만 차근히 설명해 보겠다.

 

영속성 컨텍스트

- 영속성 컨텍스트 라는것은 "엔티티를 영구 저장하는 환경" 이라는 뜻이다. 논리적인 개념으로 감이 오지 않을 것이다. 그냥 일단 엔티티를 저장하는 환경으로 생각하자 

 

- 그럼 이러한 영구 저장 환경인 영속성 컨텍스트를 어떻게 접근하는지 궁금할 것이다. 바로 "EntityManager.persist(entity);" 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다. 그러면 간단하게 엔티티 매니저 팩토리와 엔티티 매니저의 내부 동작에 대해 설명하고 넘어 가겠다

 

- 웹어플리케이션이 실행되면 엔티티 매니저 팩토리 객체가 한번 호출된다. 그러면 이 객체를 이용해 엔티티 매니저를 생성하게 되는데, 엔티티 매니저는 요청이 생길때마다 생성되서 요청이 끝나면 사라지는 일회성이다. 그래서 이러한 엔티티 매니저를 통해 영속성 컨텍스트에 접근이 가능하고 db에 접근을 한다.

- 객체가 영속성 컨텍스트에서 관리를 받고 있는 상태에 따라 엔티티의 생명주기가 나눠진다. 밑에서 엔티티의 생명주기에 대해 소개하겠다.

 

 

엔티티의 생명주기

 

1. 비영속 

- 영속성 컨텍스트와 전혀 관계가 없는 상태이다. 위에 코드를 보면 그냥 단순히 객체를 생성한 상태이다.

 

2. 영속

 

- 영속성 컨텍스트에 의해 관리를 받고 있는 상태를 영속 상태라고한다. em.persist(member); 코드를 통해 member객체를 영속 상태로 만들었다.

 

3. 준영속, 삭제

- 준영속(detached)은 영속성 컨텍스트에 저장되었다가 분리된 상태인데 지금 설명해도 감이 잘 오지 않을 것이다. 나중에 실무 코드를 통해 더욱더 자세하게 설명하겠다. 간단하게만 얘기하자면 db에 저장된 객체를 다시 가져와 수정할때, 준영속 상태가 될 때가 있다. 나중에 배우겠지만 이렇게 준영속 상태를 만들어 코드를 작성하는것 보다 영속 상태에서 변경감지를 이용해 수정기능을 작성하는것도 자세하게 배우자!

- 삭제 (removed) 삭제된 상태

 

 

 

영속성 컨텍스트의 이점

 

1. 1차 캐시

- 1차 캐시를 이용할 수 있다는 것이다. 이를 이용해 나중에 em.find를 할때, 캐시에 저장 되어 있는 객체는 DB까지 확인하지 않고 가져온다. 캐시에 없으면 DB에서 찾아서 캐시에 저장하고 가져온다~

 

 

2. 동일성 보장

 

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");

System.out.println(a == b); //동일성 비교 true

 

 

3. 트랜잭션을 지원하는 쓰기 지연

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋

 

- persist()를 하게 되면 바로 쿼리가 나와서 DB에 들어가는 것이 아니라 쓰기 지연 SQL 저장소에 INSERT쿼리가 저장된다. 그리고 commit()를 하게되면 저장소에 저장된 쿼리를 이용해 DB에 저장이 되게 된다.

 

 

4. 변경감지

- JPA는 아주 특별한 기능이 있다. 바로 변경감지라는 기능인데, 영속성 컨텍스트에 올라간 객체는 JPA에서 관리하여 변경이 되거나 하면,  쓰기 지연 SQL 저장소에 UPDATE 쿼리가 자동을 생성되서 저장된다.

 

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // [트랜잭션] 시작
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);

위에 그림을 보게 되면 "memberA"는 영속성 컨텍스트에서 관리하고 있는 객체이다. 그런데 이 객체의 이름과 나이를 변경하고 왠지모르게 update(memberA)를 해야될 거 같지만!!!,,,,영속성 컨텍스트에서 관리하고 있는 객체가 수정되면 JPA는 알아서 UPDATE 쿼리를 저장소에 저장한다.

 

 

플러시

- 플러시는 영속성 컨텍스트에 변경내용을 데이터베이스에 반영해서 동기화 하는 것을 말한다.

 

 

출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

'JPA' 카테고리의 다른 글

영속성 (Persistence)  (0) 2023.01.16