일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Split
- TCP/IP
- port
- frontPattern
- IO bound
- Queue
- java
- reflection
- annotation
- stack
- 문자열 내마음대로 정렬하기
- Spring
- process
- green thread
- deque
- 프로그래머스
- 코딩테스트
- 2차원 배열 출력
- 십진수 이진수 전환
- CPU
- URL
- 문자열
- springMVC
- 크기가 작은 부분 문자열
- http
- CPU bound
- dns
- 동시성문제
- DICTIONARY
- 가장 가까운 단어
- Today
- Total
아무나개발하자
영속성 관리 본문
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 |
---|