[01] JPA

Veloger·2022년 12월 10일
0

ShopWeb_Project

목록 보기
1/7

1.1 JPA란?

자바를 사용할 때, SQL의 문제점

  1. 자바 객체를 SQL로 DB를 관리하고, DB를 다시 SQL을 통해 자바 객체로 반환하는 과정이 귀찮음.
  2. 객체와 RDBMS 간의 패러다임의 불일치

RDBMS와 객체지향 간의 중간에서 2개를 매핑하는 역할ORM이라고 한다.
JPA는 이런 ORM의 표준 명세로 자바에서 제공하는 API이다.
JPA는 인터페이스이고, 이를 구현한 구현체가 대표적으로 Hibernate 등이 있다.

[ JPA 장점 ]

1. 특정 DB에 종속되지 않음
- 설정 파일에서 사용할 DB 변경 가능

2. 객체지향 프로그래밍

3. 생산성 향상
- DB에 새로운 칼럼 추가 시, DTO 클래스의 필드도 모두 변경해야 함.
- JPA는 매핑 클래스에 필드만 추가하면 끝!
( DAO : DB의 data에 접근하기 위한 객체 )
( DTO : 계층 간 데이터 교환을 하기 위한 객체 )

[ JPA 단점 ]

1. 복잡한 쿼리 처리
- 복잡하면 SQL 사용 권장
- 이를 보완한 JPQL이 존재

2. 성능 저하 위험

3. 학습 시간


1.2 JPA 동작 방식

JPA 동작 방식


Entity

  • 데이터베이스의 테이블에 대응하는 클래스
  • DB에 item 테이블 만들고, Item.java에 @Entity 붙이면 해당 클래스가 엔티티가 됨.

Entity Manager Factory

  • Entity Manager 인스턴스를 관리하는 주체
  • 실행시, 한 개만 만들어짐.

Entity Manager

  • 영속성 컨텍스트에 접근하여 Entity에 대한 DB 작업을 제공
  • DB에 접근하기 위한 메소드를 제공
메소드내용
find()영속성 컨텍스트에 Entity 검색 후, 없으면 DB에서 해당 데이터 찾아 영속성 컨텍스트에 저장
persist()Entity를 영속성 컨텍스트에 저장
remove()Entity 클래스를 영속성 컨텍스트에서 삭제
flush()영속성 컨텍스트에 저장된 내용을 DB에 반영

Persistence Context

엔티티 생명 주기


[ 생명주기 용어 설명 ]

생명주기내용
newPC와 관련 없는 상태
managedEntity가 PC에 저장되어 관리되는 상태 / 커밋 시점에 DB 반영
detachedPC에 저장되었다가 분리된 상태
removedPC와 DB에서 삭제된 상태

예시

Item item = new Item(); // PC와 관련없음
item.setItemNm("테스트 상품");

EntityManager em = entityManagerFactory.createEntityManager();
// EntityManager 생성


EntityTransaction transaction = em.getTransaction();
// 데이터 변경 시, 무결성 위해 트랜잭션 필수!

em.persist(item);
// PC에 저장된 상태. 아직 SQL X

transaction.commit(); // 트랜잭션을 DB에 반영

em.close(); // 자원 반환
emf.close();

영속성 컨텍스트 사용 시 이점

  1. 1차 캐시
    영속성 컨텍스트 1차 캐시 구조
  • 위 사진 처럼, find() 시 1차 캐시를 조회함
  1. 동일성 보장
  • 1차 캐시를 조회하기 때문에 하나의 트랜잭션에서 같은 키값으로 조회 가능
  1. 트랜잭션을 지원하는 쓰기 지연
    쓰기 지연 SQL 저장소
  • persist() 시, 쓰기 지연 저장소에도 SQL을 쌓아 커밋시점에 SQL문들을 flush 하면서 DB에 반영됨.
  • 이 때문에 성능면에서 좋음.
  1. 변경 감지
  • 1차 캐시에 처음 DB에서 불러온 Entity의 스냅샷을 가짐.
  • 1차 캐시 저장된 Entity와 스냅샷 사이에 변경이 있으면 UPDATE쓰기 지연 저장소에 보관함.
  • 그리고 커밋 시점에 해당 변경을 자동으로 반영

다음 챕터에선 본격적으로 프로젝트를 만들어보자

0개의 댓글

관련 채용 정보