본문 바로가기

TIL

[Spring][JPA][Persistence Context]

728x90

학습 목표

  • JPA가 무엇인지 이해할 수 있다.

JPA(Java Peristence API)란 Java에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 명세 이다. 표준 명세라는 의미는 Java의 인터페이스로 사양이 정의되어 있기 때문에 JPA라는 표준 사양을 구현한 구현체는 따로 있다는 것을 의미한다.

Hibernate ORM

JPA 표준 사양을 구현한 구현체로는 Hibernate ORM, EclipseLink, DataNucleus 등이 있다.

Hibernate ORM은 JPA에서 정의해둔 인터페이스를 구현한 구현체로써 JPA에서 지원하는 기능 이외에 Hibernate자체적으로 사용할 수 잇는 API역시 지원하고있다.

 

데이터 액세스 계층에서의 JPA 위치

데이터 액세스 계층에서의 JPA 위치

 데이터 저장, 조회 등의 작업은 JPA를 거쳐 JPA의 구현체인 Hibernate ORM을 통해서 이루어지며 Hibernate ORM은 내부적으로 JDBC API를 이용해서 데이터베이스에 접근하게 된다.

JPA에서 Persistence의 의미

Persistence는 영속성, 지속성이라는 뜻으로, 즉 무언가를 금방 사라지지 않고 오래 지속되게 한다라는 것이 Persistence의 목적이다.

영속성 컨텍스트(Persistence Context)

JPA에서 오래 지속되게하는 건 ? 

ORM은 객체(Obeject)와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술이다.

JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(Persistence Context)라는 곳에 보관해서 애플리케이션 내에서 오래 지속되도록한다 이렇게 보관된 엔티티 정보는 데이터베이스 테이블에 데이터를 저장,수정,조회,삭제 하는데 사용된다.

그림으로 표현한 영속성 컨텍스트(Persistence Context)
tx.commit()전의 영속성 컨텍스트(Persistence Context) 상태
tx.commit()후의 영속성 컨텍스트(Persistence Context) 상태

영속성 컨텍스트에는 1차캐시 라는 영역과 쓰기 지연 SQL저장소 라는 영역이 있다.JPA API 중에서 엔티티 정보를 영속성 컨텍스트에 저장(persist)하는 API를 사용하면 영속성 컨텍스트의 1차 캐시에 엔티티 정보가 저장된다.

  • em.persist()를 호출하면 영속성 컨텍스트의 1차 캐시에 엔티티 클래스의 객체가 저장되고, 쓰기 지연 SQL 저장소에 INSERT 쿼리가 등록된다.
  • tx.commit()을 하는 순간 쓰기 지연 SQL 저장소에 등록된 INSERT 쿼리가 실행되고, 실행된 INSERT 쿼리는 쓰기 지연 SQL 저장소에서 제거된다.
  • em.find()를 호출하면 먼저 1차 캐시에서 해당 객체가 있는지 조회하고, 없으면 테이블에 SELECT 쿼리를 전송해서 조회한다.

 

Point

 

  • JPA(Java Persistence API)는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(또는 명세, Specification)이다.
  • Hibernate ORM은 JPA에서 정의해둔 인터페이스를 구현한 구현체로써 JPA에서 지원하는 기능 이외에 Hibernate 자체적으로 사용할 수 있는 API 역시 지원하고있다.
  • JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(Persistence Context)에 보관해서 애플리케이션 내에서 오래 지속 되도록 한다.
  • 영속성 컨텍스트 관련 JPA API
    • em.persist()를 사용해서 엔티티 객체를 영속성 컨텍스트에 저장할 수 있다.
    • 엔티티 객체의 setter 메서드를 사용해서 영속성 컨텍스트에 저장된 엔티티 객체의 정보를 업데이트 할 수 있다.
    • em.remove()를 사용해서 엔티티 객체를 영속성 컨텍스트에서 제거할 수 있다.
    • em.flush()를 사용해서 영속성 컨텍스트의 변경 사항을 테이블에 반영할 수 있다.
    • tx.commit()을 호출하면 내부적으로 em.flush()가 호출된다.
728x90

'TIL' 카테고리의 다른 글

[Java][Interface]  (1) 2022.11.02
[Spring][JPA][EntityMapping]  (0) 2022.11.01
[SpringMVC][Rest Client]  (0) 2022.10.31
[SpringMVC][HTTP헤더]  (0) 2022.10.30
[Spring Data JDBC][DDD]  (0) 2022.10.28