ABAP DUMP ERROR 24시

JPA 정리_영속성 컨텍스트 본문

[WEB]Back-end/JPA

JPA 정리_영속성 컨텍스트

이운형 2022. 1. 1. 21:26
반응형

-JPA 왜 쓸까? = 식당의 주방과 같은 역할

내 생각 : DB 와 JAVA의 연결다리.

즉. 자바 컬렉션에 저장하고 매핑하고  SQL문으로 따로 DB에 저장했던 귀찮은 과정JPA가 해결해준다.

 

 

 

-JPA 핵심 기술

1. 객체 + DB mapping

2. 영속성 컨텍스트 => "엔티티를 영구 저장하는 환경"

 

 

 

-영속성 컨텍스트 장점

*엔티티 = 음식

 

1. 1차 캐시 => 냉장고 역할

 

음식은 재료가 오면 냉장고에 저장했다가 요리가 되어 손님에게 나간다.

개발은 JAVA요청이 오면 JPA에 잠시 저장했다가 DB에 저장이된다.

 

즉 냉장고 역할을 한다.

 

 

 

2. 엔티티의 동일성 보장 => 냉장고 속 칸별 어떤 음식이 있는지 알고있다.

의미 : 1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭 션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공. <김영한 개발자의 자바 ORM 표준 JPA 프로그래밍 - 기본편 참조>

 

냉장고에 고기를 보관하는 칸에는 고기만 보관하듯, JPA도 1차 캐시속에서 같은 엔티티를 구별할수 있다.

 

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

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

System.out.println(a == b); // TRUE

 

 

 

3. 트랜잭션을 지원하는 쓰기 지연 => 서빙전 쉐프의 검수작업장

 

JAVA의 동시성 문제는 시험 단골 문제이다.

요약하면, 코드를 A가 읽는 도중 B가 들어와서 실행하면 동시성 오류가 난다.(쓰레드의 문맥교환)

그래서 A가 코드를 다 읽을때까지 간섭받지 못하게 하는 방법을 atomic operation 즉 트랜잭션이라고 한다.

 

JPA는 똑똑해서 트랜잭션이 대부분 처리를 해준다.

EntityManager em = emf.createEntityManager();

EntityTransaction et = em.getTransaction(); //엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.

et.begin();

 

em.persist(memberA);

em.persist(memberB);

 

//em.persist하면 INSERT 쿼리를 영속 컨텍스트 내 쓰기 지연 SQL 저장소에 보낸다.

=> DB에 반영하기 전에 임시 저장소에 저장! == 손님에게 음식이 나가기 전에 쉐프가 음식 검수하겠다!

 

et.commit(); // //커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다. => 음식 합격! 서빙해!

 

***꼭 commit을 해야 DB에 저장이 된다.

 

 

4. 변경감지(dirty checking) => 수정된 부분은 알아서 조리해서  손님께 나갈준비해!

 

1차 캐시에 원하는 값이 없으면 DB에서 불러와서 1차캐시에 저장후 출력한다.1차 캐시에 원하는 값이 있으면 1차 캐시에서 불러와서 출력해준다.

 

***찾아온 값을 변경하면 알아서 1차캐시에 수정해주고 sql을 날릴 준비까지 해준다.

 

 

Member memberA = em.find(Member.class, "memberA"); // 영속 엔티티 데이터 수정 memberA.setUsername("hi");

memberA.setAge(10);

 

//em.update(member) 이런 코드가 있어야 하지 않을까? NO! => java의 collection 과 list처럼 자동으로

수정가능해!

 

transaction.commit(); #DB에 저장해! => 음식 합격 서빙해!

 

-그 밖의 기능

em.flush => 영속성 컨텍스트에 저장된 내용들을 JPA가 자동으로 SQL을 생성하여 DB에 반영해준다.=>서빙해!( 대신 기록은 남겨)

em.clear => 영속성 컨텍스트의 내용들을 모두 초기화 시킨다. => 기록 다 지워

em.detach(entity) => 특정 엔티티만 준영속 상태로 전환해 => 이 음식 잠시 보류 

 

 

 

#김영한의 JPA강의를 기초로 내가 알기 쉽게 작성한 글입니다. 잘못된 부분이 있으면 알려주세요!

 

 

 

 

 

 

 

반응형
Comments