본문 바로가기
프로그래밍/JPA

[JPA] JPA소개와 JPA의 Persistence Context

by yonmoyonmo 2021. 5. 23.
김영한님의 책 [JPA 프로그래밍]을 읽고 요약한 내용입니다.

JPA는 무엇인가?

JPA(Java Persistence API)는 자바진영의 표준 ORM(Object-Relational Mapping) 명세(인터페이스 모음)

JPA의 명세에 맞게 구현되어 나와있는 ORM 프레임워크를 사용하여 개발을 하면 된다.
보통 하이버네이트(Hibernate)를 많이 쓴다.

JPA를 사용하면 SQL에 의존적인 개발을 그만할 수 있게 된다. SQL 매퍼(MyBatis 같은 것들)를 사용해 데이터베이스 응답 결과를 객체에 매핑하여 사용하면 사실 어느정도 편하게 백엔드 개발을 할 수가 있긴 하지만 SQL을 계속 개발자가 관리를 해야한다. 이 점이 싫은 사람들을 위해 ORM이 생긴 것 아닐까? JPA는 자바 컬렉션에 데이터를 저장하듯이 보이는 코드로 데이터베이스와 소통할 수 있게 해준다.

객체지향의 상속 같은 개념은 관계형 데이터베이스에는 존재하지 않는다. 이와 같이 객체지향과 관계형 데이터베이스 사이에는 페러다임 자체에서 오는 불일치 문제가 있다. 이런 불일치 문제를 해결하는 것들이 ORM 프레임워크이며 JPA에서는 하이버네이트 프레임워크가 가장 성숙하게 거의 모든 불일치 문제를 해결한 프레임워크라고 한다.

JPA를 사용하면 테이블과 매핑되는 객체(엔티티, Entity)의 필드에 객체를 사용할 수 있고, 이것을 데이터베이스에서 조회하여 자유롭게 객체그래프 탐색을 할 수도 있다.

JPA를 이해하고 사용하려면 SQL과 관계형 데이터베이스, 객체지향 프로그래밍를 어느정도 이해하고 있어야한다는 점이 은근히 학습곡선을 가파르게 만들기는 하지만 어차피 다 알아야할 내용이니까 상관없지 않을까? 그리고 JPA의 핵심 개념인 영속성 컨텍스트(Persistence Context)에 대한 이해도 필요하다. 오늘의 포스팅에서는 간단하게 JPA의 영속성 컨텍스트에 대해 적었다.

영속성 컨텍스트(Persistence Context)

영속성 콘텍스트를 설명하기 전에 엔티티 매니저 팩토리엔티티 매니저 기능을 알아야 한다.

어플리케이션 프로세스 당 하나(데이터 베이스 당 하나, 리소스 차지를 많이 한다고 함)의 엔티티 매니저 팩토리가 선언되고 이것은 쓰레드 간에 공유할 수 있다. 엔티티 매니저 팩토리를 이용해 엔티티 매니저를 만들어 쓸 수 있는데 엔티티 매니저는 쓰레드(요청) 간 공유를 하면 안된다. 영속성 컨텍스트가 엔티티 매니저 당 하나씩 생성되기 때문이다.

영속성 컨텍스트는 JPA의 핵심이다. 일종의 객체 저장소인데 데이터베이스에서 조회한 데이터를 엔티티와 매핑하여 저장하고 있거나, 새로 저장할 데이터를 저장하고 있다. 이 엔티티를 저장하고 있는 부분을 1차 캐시라고 한다. 1차 캐시에는 인스턴스가 엔티티의 식별값(@Id 로 매핑된 필드)을 Key로 그 객체 인스턴스를 Value로 하여 저장된다. 저장해서 어따 쓰는지를 알아보자.

데이터 조회를 예로 들면...

그림 처럼 데이터 베이스를 조회 하기 전 영속성 컨텍스트의 1차캐시에 조회할 객체 인스턴스가 있는지 식별값을 이용해 찾아본다. 있으면 있는 걸로 반환하고 없으면 데이터베이스를 조회한다. 데이터베이스를 조회해서 찾는게 있으면 갖고 와서 영속성 컨텍스트에 저장하고 저장된 인스턴스로 응답한다. 몇 가지 키워드로 영속성 콘텍스트를 좀 더 알아보자

동일성 보장

1차 캐시에 저장된 인스턴스는 엔티티에 @Id로 매핑된(테이블의 PK)값을 Key로 하고 그 key로 식별한 데이터를 객체로 매핑해 값으로 가지고 있다. key가 같으면 항상 같은 value를 가지고 같은 인스턴스를 돌려준다 -> 동일성이 보장된다.

 쓰기 지연

영속성 컨텍스트 내부에 쓰기 지연을 위한 SQL저장소가 있다. 영속성 컨텍스트에 엔티티를 저장(persist)할 때 마다 INSERT 문이 데이터베이스로 날아 가지는 않는다. 일단은 SQL저장소에 다 저장하고 있다가 트랜잭션 커밋할 때 한 방에 쏜다(플러쉬). 이것이 쓰기 지연이다.

변경 감지

영속성 컨텍스트 1차 캐시에는 스냅샷이라는 기능이 있다.  데이터베이스에서 조회한 데이터가 영속될 때의 최초 모습에 대한 정보를 유지하고 있는 것이 스냅샷이다. 플러쉬 시점에(트랜잭션 커밋) 영속성 컨텍스트에 저장된 모든 엔티티를 각 스냅샷에 저장된 정보와 비교해서 수정된 친구가 있으면 수정을 반영하는 update sql을 만들어 준다. 그래서 영속상태의 엔티티를 그냥 자바 코드로 수정하기만 해도 값 데이터 수정을 할 수 있게 된다.

지연 로딩

프록시 객체라는 것을 이용하는데 이것은 나중에 또 나온다. 아무튼 지연 로딩을 이용하여 객체 그래프를 탐색 할 때마다 참조에 필요한 데이터를 그때그때 조회하여 가져온다.

아무튼 영속성 컨텍스트가 있어야지 JPA가 돌아간다 이말이야!

 

'메모장/JPA' 카테고리의 글 목록

프로그래밍 & 일상

wonmocyberschool.tistory.com

 

댓글