[section 3] Spring MVC - JPA 기반 데이터 액세스 계층(1)

수경·2022년 12월 27일
0

코드스테이츠

목록 보기
43/57

JPA란?

Java Persistence API
Java 진영에서 사용하는 ORM(Object Realation Mapping) 기술의 표준
Jakarta Persistence 라고도 함

기술 표준 ➡️ 인터페이스로 정의 ➡️ JPA 구현체는 따로 있음❗️

JPA 구현체 : Hibernate ORM, EclipseLink, DataNucleus 등


데이터 액세스 계층에서 JPA

  • JPA는 데이터 액세스 계층의 상단에 위치
  • 데이터 저장, 조회, 수정, 삭제 작업은 JPA의 구현체인 Hibernate ORM을 통해 이루어짐
  • Hibernate ORM 내부적으로 JDBC API를 이용해서 DB에 접근

JPA의 Persistence

Persistence : 영속성, 지속성
➡️ JPA에서 테이블과 매핑되는 엔티티 객체 정보를 애플리케이션 내에서 오래 지속되게 하기 위해서 Persistence Context 에 저장
➡️ 저장, 수정, 조회, 삭제 등에서 사용

영속성 컨텍스트의 구조

✔️ 1차 캐시 : 엔티티 저장
✔️ 쓰기 지연 SQL 저장소 : SQL 쿼리문 저장
✔️ 스냅샷 : 엔티티를 저장할 때, 컬렉션으로 또 다른 복사본을 저장하는 것. 후에 1차 캐시 엔티티와 비교하여 변경사항 UPDATE

엔티티의 생명 주기


JPA의 사용

  • @Entity ➡️ JPA에서 엔티티 클래스로 인식
  • @Id : 테이블의 PK
  • @GeneratedValue : PK 값을 위한 자동 생성 전략 명시

Entity Manager

JPA의 영속성 컨텍스트를 관리하는 클래스

  • void persist(Object entity)
    ✔️ 영속성 컨텍스트의 1차 캐시에 엔티티 객체 저장
    ✔️ 쓰기 지연 SQL 저장소에 INSERT 쿼리 등록

  • <T> T merge(T)
    ✔️ 엔티티를 영속성 컨텍스트로 merge

  • void remove(Object entity)
    ✔️ 엔티티 삭제
    ✔️ 쓰기 지연 SQL 저장소에 DELETE 쿼리 등록

  • <T>T find(Class<T> entityClass, Object PK)
    ✔️ PK로 1차 캐시에서 조회, 없으면 테이블에서 SELECT 쿼리 로 조회

  • void flush()
    ✔️ 영속성 컨텍스트의 변경사항을 테이블에 반영

  • boolean contains(Object entity)
    ✔️ 인자로 들어온 엔티티가 현재 영속성 컨텍스트에서 관리되는 엔티티인지 체크

Entity Transaction

JPA 트랜잭션

  • void begin() : 트랜잭션 시작

  • void commit() : 쓰기 지연 SQL 저장소에 있는 쿼리 실행 후 제거
    ✔️ 내부적으로 EntitiyManager.flush() 메소드 호출, DB에 반영

  • void rollback()

  • boolean getRollbackOnly()

  • boolean isActive()

예시 코드

private EntityManager em;
private EntityTransaction tx;


tx.begin();
// 영속성 컨텍스트의 1차 캐시에 엔티티 저장, 쓰기 지연 SQL 저장소에 INSERT 쿼리 저장
em.persist(new Member());
// 쓰기 지연 SQL 저장소에 있는 쿼리문 실행 -> INSERT 쿼리 실행
tx.commit();

tx.begin();
// 영속성 컨텍스트의 1차 캐시에서 1L을 갖는 Member.class 타입 객체 검색
Member member = em.find(Member.class, 1L);
// 영속성 컨텍스트의 1차 캐시에 있는 엔티티 제거, 쓰기 지연 SQL 저장소에 DELETE 쿼리문 저장
em.remove(member);
// 쓰기 지연 SQL 저장소에 있는 쿼리문 실행 -> DELETE 쿼리 실행
tx.commit();
profile
어쩌다보니 tmi뿐인 블로그😎

0개의 댓글