-
JPA 영속성(persistence)란?JPA 2024. 4. 2. 15:31
영속성이란?
데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성을 말한다.
영속성을 갖지 않으면 데이터는 메로리에서만 존재하게 되고 프로그램이 종료되면 해당 데이터는 모두 사라지게 된다.
그래서 우리는 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여한다.
JPA에서의 영속성
JPA의 핵심 내용은 엔티티가 영속성 컨텍스트에 포함되어 있냐 아니냐로 갈린다.
JPA의 엔티티 매니저가 활성화된 상태로 트랙잭션 안에서 DB에 데이터를 가져오면 이 데이터는 영속성 컨텐스트가 유지된 상태이다.
이 상태에서 해당 데이터 값을 변경하면 트랙잭션이 끝나는 시점에서 해당 테이블 변경 내용을 반영하게 된다.
따라서 우리는 엔티티 객체의 필드 값만 변경해주면 별도로 update() 쿼리를 날릴 필요가 없게 된다.
이 개념을 더티 체킹이라고 한다.
영속성 컨텍스트란?
영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻
EntityManager를 이용해 Entity를 저장하거나 조회할 때 EntityManager는 영속성 컨텍스트에 Entity를 보관하고 관리합니다.
EntityManager 객체를 실행하면 영속성 컨텍스트가 Entity를 관리하게 됩니다.
영속성 컨텍스트는 Entity를 식별자 값으로 구분합니다.
Entity에서 @ID 어노테이션을 통해 지정한 맴버변수가 영속성 컨텍스트에 식별자 값으로 저장됩니다.
JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 Entity를 데이터베이스에 반영합니다.
1차 캐시를 이용합니다.
영속성 컨텍스트 내부에 존재하는 캐시(Map)를 1차 캐시라 합니다.
영속성 상태의 Entiry는 모두 이곳에 저장되며 키는 @ID로 패밍한 식별자이며 값은 Entity 인스턴스입니다.
find 메소드를 호출하면 먼저 1차 캐시에서 Entity를 찾고, 만약 찾는 Entity가 1차 캐시에 없으면 데이터베이스에서 조회한 후 1차 캐시에 저장하고 영속 상태인 해당 객체를 반환합니다.
Entiry의 동일성을 보장합니다.
트랜잭션을 지원하는 쓰기 지연을 수행합니다.
엔티티 매니저는 트랙잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 영속성 켄텍스트 내부에 SQL 저장소에 생성 쿼리를 저장해둡니다.
이후 커밋을 하게 되면 자장해두었던 쿼리를 데이터베이스에 보냅니다.
이것을 트랙잭션을 지원하는 쓰기 지연이라고 합니다.
트랙잭션을 커밋하면 앤티티 매니저는 영속성 컨텍스트를 flush 합니다.
컨텍스트의 변경 내용을 데이터베이스에 동기화하는 작업으로 등록, 수정, 삭제한 엔티티를 데이터베이스에 반영합니다.
즉, 쓰기 지연 SQL 저장서에 모인 쿼리를 데이터베이스에 보냅니다. 이러한 동기화 작업을 거친 후 실제 데이터베이스 트랙잭션을 commit 합니다.
변경을 감지합니다.
영속성 컨텍스트는 이전 flush 때의 엔티티 상태를 복사해서 저장해둔 스냅샷이 존재합니다.
JPA는 flush 시점에 스냅샷과 엔티티를 비교해 변경된 엔티티를 찾습니다.
만약 있다면 각각의 객체애 대한 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 저장한 후 한꺼번에 데이터베이스를 보내고 데이터베이스 트랜잭션 commit을 합니다.
지연 로딩을 수행합니다.
지연 로딩이란 실제 객체 대신 프록시 객체를 로딩해두고 해당 객체를 실제 사용할 때 셩속성 컨텍스트를 통해 데이터를 불러오는 방법입니다.
'JPA' 카테고리의 다른 글
03. 영속성 관리 (0) 2021.01.31 02. JPA 시작 (0) 2021.01.17 01-3. JPA란 무엇인가? (0) 2021.01.14 01-2. JPA 소개 (2) 2020.12.29 01-1. JPA 소개 (0) 2020.12.01