1. ORM (Object Relational Mapping)
객체와 관계형 DB 간의 불일치 문제를 해결하기 위한 도구
코드의 반복을 줄이고 객체 중심의 설계에 집중해서 개발할 수 있다.
2. Spring Data JPA
JPA - 관계형 DB 매핑이 대상으로 NoSQL 지원하지 않는다.
Spring Data - Spring Data의 추상화된 인터페이스를 통해 NoSQL, RDBMS 등 다양한 저장소를 활용 가능하다.
Spring Data JPA - Spring Data 프로젝트의 하위 프로젝트로 Spring 환경에 적용이 쉽고 추상화가 잘 되어있다.
3. Spirng Data JPA Repository 구조
ORM 사용 시에는 EntityManager로 영속성 콘텍스트를 제어 한다.
Repository : No method, base역할
CrudRepository (extends Repository) : save, find, delete같은 DB 조작 method 선언
PagingAndSortingRepository (extends CrudRepository) : paging 처리 할 수 있도록 find method의 파라미터에 sort 객체와 pageable 객체 추가
JPA Repository (extends PagingAndSortingRepository) : DB와 Object 동기화 할 수 있는 save, saveAndFlush Method를 추가한 인터페이스
3-1. EntityManager
JPA는 한 스레드 당(요청마다) Entity Manager Factory에서 EntityManager를 생성한다.
(EntityManagerFactory는 서로 다른 스레드 간 공유,동시 접근 가능하나 EntityManager는 공유 불가하고, 동시 접근 시 동시성 문제가 발생한다.)
EntityManager는 내부적으로 DB커넥션 풀을 사용해 DB에 붙는다.
3-2. 영속성 콘텍스트
엔티티를 영구히 저장하는 환경
Application과 DB 사이에서 객체를 보관하는 가상의 DB와 같은 역할
Java Object와 DB 간 데이터 통신/동기화 제어를 수행한다.
3-3. EntityManager.persist(entity)
DB에 객체를 저장하는 기능.
디테일하게는 영속성 컨테스트를 통해 엔티티를 영속화한다.
persist() 시점에는 영속화 컨텍스트에 저장하고 이후에 DB에 저장한다.
이런 기능을 사용하는 이유는 ?
1. EntityManager 내부에 1차 캐시 존재
- 반복 가능한 읽기 등급의 트랜젝션 수준을 DB가 아닌 Application 차원에서 제공한다. (1차 캐시 덕분에 어떤 객체를 두번 조회해도 다른 객체가 아닌 같은 레퍼런스로 확인할 수 있다. = 비교시 true)
2. 영속 Entity의 동일성을 보장한다.
3. 쓰기 지연 (flush())
- persist() 시에 엔티티들을 1차 캐시에 저장하고 논리적으로 쓰기 지연 SQL 저장소에 INSERT 쿼리들을 쌓는다. commit() 시점에 쿼리를 날리는데 이 동작이 flush()이다. flush()로 DB에 쿼리를 날려 1차 캐시와 DB 싱크를 맞춘다. 실제 쿼리를 보내고 나서 commit()한다.
- flush가 결국 영속성 컨텍스트 변경사항 DB 싱크 맞추는 작업 (영속성 컨텍스트(1차 캐시)를 비우는 작업이 아님)
- 트랜젝션 commit시 혹은 JPQL 실행 시 flush 자동 호출
4. Dirty Checking (Entity 수정 감지)
Entity 수정 시 update()나 persist() 동작 없이 Entity만 수정하면 트랜젝션 커밋 시에 업데이트 쿼리가 나간다.
*reference
https://learnandstudy.tistory.com/9
ORM의 활용 - Spring Data JPA
ORM(Object Relational Mapping)이란? Object(객체)와 Relation(관계형 데이터베이스)간의 불일치 문제를 해결하기 위한 도구 자바는 데이터베이스 서버에 접속해서 쿼리를 수행하고, 그 결과를 프로그램 상
learnandstudy.tistory.com
https://ict-nroo.tistory.com/130
[JPA] 영속성 컨텍스트와 플러시 이해하기
영속성 컨텍스트 JPA를 공부할 때 가장 중요한게 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과 영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자.
ict-nroo.tistory.com
'Tech > Worklog' 카테고리의 다른 글
[JPA] insert 시 DB Default 값 적용 (@ DynamicInsert, @ ColumnDefault) (0) | 2022.07.17 |
---|---|
Spring boot h2 연동 (0) | 2021.09.14 |
SQL/NoSQL (0) | 2021.03.15 |