- 영속성-컨텍스트? entity-manager?2025년 01월 08일
- BE_규원
- 작성자
- 2025.01.08.오전00:40
이 둘을 왜 공부해야 할까?
JPA 의 핵심 개념이기 때문이다.
이해하지 못하고 사용하면 JPA 의 이점을 100% 활용할 수 없게 된다.
영속성 컨텍스트에 대한 이해가 부족하다면,
동일한 데이터를 반복적으로 조회하는 SQL 을 실행하는 등
SQL 을 직접 사용해 개발하는 것보다 안 좋은 상황이 벌어질 수 있게 된다.
JPA 는 자바 표준 ORM 기술이다.
ORM?
Object Relational Mapping 의 약자로, 객체를 DB Table 과 매핑해주는 기술이라고 한다.
간단하게 기존 odbc, jdbc 를 한 번 더 wrapping 한 기술로, db 연결을 더 쉽게 해주는 기술이라고 생각하면 된다.
JPA 의 요소
Entity
DB 에 mapping 될 객체
Entity Manager
Entity 를 관리하는 객체
Entity Manager Factory
Entity Manager 를 생성하는 객체
Persistence Context (영속성 컨텍스트)
Entity 를 관리하는 공간
Persistence Unit
DB 연결을 위한 설정 (application.yml)
영속성 컨텍스트
Entity 클래스의 instance 를 효율적으로 관리하는 공간
1차 캐시
Entity 와 식별자(id) 가 Map 형태로 저장되어 있는 캐시이다.
1차 캐시에 Entity 가 있다면, DB 접근 없이 연산을 수행할 수 있다.
쓰기 지연 (Write-behind)
Entity 클래스의 instance 에 대한 쿼리를 DB 에 바로 전송하지 않고 1차 캐시에만 반영한다.
쿼리는 쓰기 지연 저장소에 쌓아두게 되는데,
들어온 쿼리들을 전부 쌓아두는 게 아니라 중간 과정을 생략한 결과 쿼리만을 저장한다.
그리고 flush 할 때 쓰기 지연 저장소에 있는 쿼리를 DB 에 전송한다.
이를 통해 쿼리의 수가 줄어, DB 접근 횟수가 줄어들게 되고 DB 부하를 줄일 수 있게 된다.
변경 감지 (Dirty-checking)
Entity 클래스의 instance 가 영속성 컨텍스트에 처음 들어오면
JPA 는 그 상태를 깊은 복사 형태로 스냅샷을 만들어 저장해둔다.
flush 를 하기 전에, 스냅샷과 현재 상태를 비교해서 다르다면
UPDATE 쿼리를 쓰기 지연 저장소에 추가해 넣고 전송한다.
영속성 컨텍스트를 통해 DB 접근을 줄여 효율적인 ORM 을 할 수 있다.
영속성 컨텍스트의 세 가지 특징을 배웠는데,
이들을 이해하고 사용해야만 DB 접근을 최소화 할 수 있게 된다.
위와 같은 이유에서 우리는 이 개념을 학습해야 한다.
Entity States
Entity 는 영속성 컨텍스트를 기준으로 네 가지 상태를 가진다.
Transient State (비영속)
객체가 생성되었지만, 영속성 컨텍스트에서 관리되지 않는 상태
DB 나 JPA 와 아무런 상관이 없는 자바 객체
Persistent State (영속)
Entity 가 영속성 컨텍스트에 저장되어 관리되고 있는 상태
1차 캐시, 쓰기 지연, 변경 감지의 대상
Detached State (준영속)
이전에는 영속 상태였으나 영속성 컨텍스트에서 분리된 상태
영속성 컨텍스트가 닫히면 그 안에 있던 영속 객체는 준영속 상태가 된다.
Removed State (삭제)
영속성 컨텍스트에서 관리되고 있으나 삭제하기로 표시된 상태
다음 flush 작업 때 DELETE 쿼리를 쓰기 지연 저장소에 추가해 넣고 전송한다.
Entity Manager
영속성 컨텍스트에 대한 작업을 수행함(= Entity 의 상태를 바꿈)으로써,
자바 프로그램과 데이터베이스 사이를 연결한다.
Entity Manager 는
메서드를 통해 영속성 컨텍스트와 소통하면서
Entity 의 상태를 바꾼다.
@Transactional 이 붙은 메서드가 종료되면
쓰기 지연 저장소에 쌓인 쿼리문을 DB 로 보내고,
영속성 컨텍스트가 닫히고,
영속 객체가 준영속 객체가 된다.
그렇게 되면 당연하겠지만,
JPA 가 더 이상 변경을 추적하지 않게 되며
추가적인 SQL 을 실행하지도 않게 된다.
'back-end' 카테고리의 다른 글
collection-복사 (0) 2025.01.11 tomcat-netty (1) 2025.01.04 effective-java-4 (0) 2025.01.01 effective-java-3 (0) 2025.01.01 effective-java-2 (0) 2025.01.01 다음글이전글이전 글이 없습니다.댓글