JPA에서 가장 중요한 2가지가 있습니다.
1. 객체와 관계형 데이터베이스를 어떻게 매핑할 것인지
2. JPA의 매커니즘 (영속성 콘텍스트)
오늘은 위 2가지 중 JPA의 메커니즘에 대해서 간단하게 정리를 하고자 합니다.
JPA의 메커니즘의 Key Point는 영속성(Persistence)입니다.
영속성이란?
영속성(Persistence)은 컴퓨터 공학에서 프로세스가 생성했지만 별개로 유지되는 상태의 특징 중 한 가지이며, 별도의 기억 장치에 데이터를 보존하는 것을 목적으로 한다.
출처 : 위키 (https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%84%B1)
영속성은 "데이터를 보존하는 것을 목적으로 한다."라고 되어 있습니다.
JPA의 영속성은 단순히 저장의 목적으로 보존하는 것이 아니라 신뢰할 수 있는 데이터로 보존, 동일성을 보장하는 데이터로 보존하기 위해 중요한 개념이라고 생각합니다.
JP(Persistence)A에서 영속성은 이름에도 있을 만큼 굉장히 중요한데 이 것을 설명하기 위해서 논리적인 개념 영속성 콘텍스트가 필요합니다.
영속성 콘텍스트는 가상의 공간(캐시 메모리 느낌)이라고 이해하면 되는데 트랙잭션 단위로 Entity를 영구적으로 저장하고 EntityManager* 를 통해 접근이 가능합니다.
1. 한 작업 단위(트랜잭션) 내에서 캐시 메모리처럼 활용이 가능하고
2. Flush*로 동일성(identity)을 보장하고
3. 쓰기 지연을 지원하고
4. 변경 감지와 지연 로딩을 지원합니다.
영속 상태
1. 비영속 상태 (New)
- 단순 객체만 생성한 상태
MemberVO member = new MemberVO();
2. 영속 상태 (Managed)
- 객체가 영속성 컨텍스트에 관리되는 상태
/* 영속성 컨텍스트에 저장 */
em.persist(member);
3. 준영속 상태 (Detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
/* 영속성 컨텍스트에서 분리된 상태 */
em.detach(member);
4. 삭제 (removed)
- 삭제된 상태
*Flush는 영속성 콘테스트의 변경내용을 DB에 반영합니다.
Flush 하는 방법은
1). flush() 직접 호출
2) commit 시 자동 호출
3) JPQL 실행 시 자동 호출
총 3가지가 있습니다.
*EntityManager는 스레드 마다 EntityMangerFactory에서 생성되고 DB Connection Pool로 DB에 연결합니다.
Reference
'Spring > JPA' 카테고리의 다른 글
[JPA] 점멸(Flash) 말고 Flush (feat. LoL) (0) | 2021.10.17 |
---|---|
[JPA] JPQL (Java Persistence Query Language) 객체 지향 쿼리 (1) | 2021.10.12 |
[JPA] 패러다임의 불일치 와 해결책 (feat. JPA) (2) | 2021.10.07 |