21.06.27 TIL JPA - ORM, JPA, HIBERNATE, 영속성 관리

김정훈·2021년 6월 27일
post-thumbnail

📌 JPA - 영속성 관리, Entity매핑

<출처. 자바 ORM 표준 JPA 프로그래밍 - 기본편 : 김영한 강사님>

https://www.inflearn.com/course/ORM-JPA-Basic


🧏🏻‍♂️ ORM, JPA, HIBERNATE


ORM(Object-Relational Mapping)이란?
관계형디비 테이블을 객체지향적으로 사용하기 위한 기술이다.
RDB는 상속, 다형성 레퍼런스, 오브젝트 등으로 접근이 쉽지가 않다.
→ ORM을 사용해 오브젝트와 RDB사이에 객체지향적으로 다루기 위한 기술이다.

JPA(Java Persistence Api)란? [자바 진영의 ORM 기술 표준]

JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하지 않아도 된다.
JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를 자동으로 Mapping 해준다.
JPA의 장점

  • JPA는 내부적으로 JDBC API를 활용하는데, 개발자가 직접 JDBC API를 활용하면 패러다임 불일치, SQL 의존성 등으로 인해 효율성이 떨어진다.
  • 이 때, JPA를 활용한다면 모든 SQL에 대해 개발자 대신 JPA가 자동으로 해결해 준다는 점에서 생산성을 크게 높인다.
    출처 : https://velog.io/@jwkim/JPA-JPA%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

🔥 JPA의 주의할 점

  • 장점을 극대화시키기 위해서 알아야 할 것이 많으며, 어렵다.
  • 잘 이해하지 않고 사용하면 독이 될 수도 있고, 성능상의 이슈를 발생시킬 가능성도 있다.

Hibernate란?

  • 자바 언어를 위한 객체 관계 매핑 프레임워크이다.
  • 객체 지향 도메인 모델을 관계형 데이터베이스로 매핑하기 위한 프레임워크를 제공한다.
  • 애플리케이션에서 사용되는 데이터베이스를 변경시키고자 한다면 설정파일의 dialect 프로퍼티를 수정함으로서 쉽게 처리할 수 있습니다.

🌐 영속성 컨텍스트 - PersistenceContext

엔티티를 영구 저장하는 환경이라는 뜻
영속성 컨텍스트는 논리적 개념이고, 눈에 보이지 않는다.
EntityManager를 통해서 영속성 컨텍스트에 접근한다.
애플리케이션과 데이터베이스 사이의 중간 계층이다.

영속성 컨텍스트의 이점
: 1차 캐시
: 동일성 보장
: ⚡️ 트랜잭션을 지원하는 쓰기 지연 SQL 저장소
: ⚡️ 변경 감지 - Dirty Checking
: ⚡️ 지연 로딩 - Lazy Loading(지연 SQL 저장소)

지연 로딩과 관련된 Maven의 옵션
: hibernate.jdbc.batch.size_size 메이븐에서 설정하는 hibernate의 옵션인데
한 번에 DB로 보낼 수 있는 값을 설정한다.

Entity조회
1차 캐시 : DB까지 가지 않고 영속 컨텍스트에서 찾아서 사용한다.

2번째 조회부터는 1차 캐시에서 가져온다.
JPA는 Entity에서 가져오는 것을 영속성 컨텍스트에 올린다.


Entity의 생명 주기
1. 비영속
: 영속성 컨텍스트와 전혀 관계가 없는 상태
2. 영속
: 영속성 컨텍스트에 관리되는 상태
3. 준영속(detached)
: 영속성 컨텍스트에 저장되었다가 분리된 상태
4. 삭제
: 삭제된 상태


🌟 Flush(플러시) X Dirty Checking(변경 감지)

Flush : 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것
(영속성 컨텍스트를 비우는 것이 아니다.)
→ 영속성 컨텍스트의 변경 사항들과 DB의 상태를 맞추는 작업이다.
: Flush 사용방법

  • em.flush() - 직접 호출
  • 트랜잭션 커밋 - 플러시 자동 호출 + JPQL 쿼리 실행 : 플러시 자동 호출

커밋을 하면 플러시가 일어난다
엔티티와 스냅샷을 비교한다.
스냅샷 : 내가 값을 읽어온 최초 시점에 값을 떠놓은 것
스냅샷과 다르다? → Dirty Checking

업데이트 쿼리를 쓰기 지연 SQL에 등록한다.

Dirty Checking
수정된 엔티티 쓰기 지연 SQL 저장소에 등록
쓰기 지연 SQL 저장소의 쿼리를 DB에 전송


⟴ 그저 CRUD를 편하게 할 수 있어서 신기했던 JPA에 대해서 원리를 공부하기 시작했다. 생각보다 단순하지 않고, 잘 모르고 사용한다면 독이 될 수도 있다는 것을 알았다. 영속성 관리 부분도 처음에는 그냥 쉽게 이해했다고 생각했는데, 역시 정리할 때 애매한 부분이 많았던 것 같다.

profile
WebDeveloper

0개의 댓글