일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- SpringMVC
- 필터의 정의
- @Controller
- abap value in field Data Class error
- optional
- spring MVC
- n+1
- BindingResult
- 김영한
- jpa
- 세션의 정의
- application-properties
- controller
- spring
- java.lang.AssertionError
- Testcode
- 세션vs쿠키
- 쿠키란
- filter vs interceptor
- MVC
- 인터셉터의 정의
- .orelseThrow
- 구글 보안 api 활용
- 필터vs인터셉터
- Validation
- 쿠키의 정의
- 유연한 컨트롤러1 - v5
- 401오류
- springSecurityFilterChain 오류
- 세션이란
- Today
- Total
ABAP DUMP ERROR 24시
JPA 정리_영속성 컨텍스트 본문
-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강의를 기초로 내가 알기 쉽게 작성한 글입니다. 잘못된 부분이 있으면 알려주세요!
'[WEB]Back-end > JPA' 카테고리의 다른 글
JPA Proxy가 뭐야? 왜 사용해? (0) | 2022.01.13 |
---|---|
다양한 연관관계 매핑 (0) | 2022.01.10 |
@Inheritance(strategy = Inheritance.Type.JOINED) 전략 (0) | 2022.01.08 |
@joinColumn, @mappedby, 양방향 Mapping시 주의해야할점 (0) | 2022.01.07 |
@Table과 @Column 의 차이 (0) | 2022.01.04 |