Spring/JPA

[JPA] 영속성(Persistence) JPA에서 가장 중요한 2가지 中 첫 번째 (feat. Flush)

Pazery는ENFJ 2021. 10. 17. 17:10
반응형

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

https://www.inflearn.com/course/ORM-JPA-Basic/

반응형