JPA (Java Persistence API)
- 자바 ORM 기술에 대한 표준 API
- 대표적 구현체 : Hibernate, EclipseLink, DataNucleus, OpenJpa, TopLink 등
*ORM (Object Relational Mapping) : 객체와 관계형 데이터베이스를 매핑해주는 것
- 장점
- 특정 데이터베이스에 종속되지 않음
- 객체지향적 프로그래밍 - 직관적이고 비즈니스 로직에 집중할 수있음
- 생산성 향상
- 단점
- 복잡한 쿼리 처리
- 성능 저하 위험
- 관계형 데이터베이스에 대한 이해필요
■ JPA 구성 및 동작방식
- Entity Manager Factory 엔티티 매니저 팩토리
- Entity Manager를 관리하는 주체
- 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성함
- Entity Manager 엔티티 매니저
- 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공
- 데이터베이스 커넥션을 사용하여 데이터베이스에 접근
- find(), persist(), remove(), flush()
- Persistence Context 영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- Entity 엔티티
- 데이터베이스의 테이블에 대응하는 클래스
- 클래스에 @Entity 어노테이션 붙임
■ 엔티티 생명주기
- 비영속(new)
- 엔티티 객체만 생성한 상태
- 영속성 컨텍스트에 저장되지 않은 상태
- 영속(managed)
- 영속성 컨텍스트에 저장된 상태
- DB에 바로 저장되지 않고 커밋 시점에 저장됨
- 준영속 상태(detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
- 식별자 값만 가지고 있고 영속성 컨텍스트의 기능을 쓸수 없음
- 삭제상태(removed)
- 엔티티 작동방식 예시
Item item = new Item(); // 엔티티 생성. 영속성 컨텍스트와 관련없음
item.setItemNm("테스트 상품");
EntityManager em = entityManagerFactory.createEntityManager();
// 엔티티 매니저 팩토리로부터 엔티티 매니저 생성
EntityTransaction transaction = em.getTransaction();
// 엔티티 매니저는 데이터 변경시 무결성을 위해 반드시 트랜잭션을 시작해야함
// 여기서의 트랜잭션 = DB의 트랜잭션
transition.begin();
em.persiste(item); // 엔티티가 영속성 컨텍스트에 저장된 상태. 아직 insert 하기 전
transition.commit(); // 트랜잭션을 DB에 반영. insert됨
// 엔티티 매니저와 매니저 팩토리의 자원반환
em.close();
emf.close();
■ Persistence Context 영속성 컨텍스트
- 영속성 컨텍스트란
- 엔티티를 영구 저장하는 환경
- 애플리케이션과 DB사이에서 객체를 보관하는 가상의 DB같은 역할
- 엔티티를 식별자 값(@id)로 구분
- 영속 상태는 식별자 값이 반드시 있어야하고 없을 경우 예외 발생
- 장점
- 1차 캐시 (Cache)
· Map<KEY, VALUE> 로 저장
· find() 메소드 호출시 영속성 컨텍스트 1차 캐시 조회
· 엔티티 존재시 해당값 반환, 없으면 데이터베이스에서 조회 후 1차 캐시에 저장 및 반환
- 동일성(Identity) 보장
· 하나의 트랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회시 같은 엔티티 조회를 보장
(1차 캐시에 저장된 엔티티를 조회하기 때문에 가능함)
- 트랜잭션을 지원하는 쓰기 지연 (transactional write behind)
· persist()를 호출하면 1차 캐시에 저장되는 것과 동시에 쓰기 지연 저장소에 SQL문이 저장됨
· 저장된 SQL문은 트랜잭션을 커밋하는 시점에 저장된 SQL문을 flush되면서 DB에 반영됨
· 성능이 좋아짐
- 변경감지 (Dirty Checking)
· JPA는 처음 불러온 엔티티의 스냅샷 값을 갖고 있음
· 1차 캐시에 저장된 엔티티와 스냅샷을 비교 후 변경내용이 있다면 쓰기 지연 SQL 저장소에 보관
· 커밋 시점에 DB에 변경내용을 자동으로 반영 (update문을 따로 부를 필요가 없음)
'Spring > Spring Data JPA' 카테고리의 다른 글
[Spring Data JPA] 영속성 전이 / 고아 객체 (0) | 2023.02.06 |
---|---|
[Spring Data JPA] Page / Pageable / PageRequest (0) | 2023.01.26 |
[Spring Data JPA] Repository (0) | 2023.01.20 |
[Spring Data JPA] Entity (0) | 2023.01.19 |