JPA.

[Spring] JPA 동작 방식

PI.314 2022. 2. 2. 19:36

JPA 동작방식

 

엔티티란 데이터베이스의 테이블에 대응하는 클래스라고 생각하시면 됩니다. @Entity가 붙은 클래스는 JPA에서 관리하며 엔티티라고 합니다. 데이터베이스에 item 테이블을 만들고, 이에 대응되 Item.java 클래스를 만들어서 @Entity 어노테이션을 붙이면 클래스가 엔티티가 되는 것입니 다. 클래스 자체나 생성한 인스턴스도 엔티티라고 부릅니다. 엔티티 클래스를 설계하는 방법은 예제 를 진행하면서 알아보겠습니다.

엔티티 매니저 팩토리엔티티 매니저 인스턴스를 관리하는 주체입니다. 애플리케이션 실행 한 개만 만들어지며 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성합니다.

엔티티 매니저영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공 합니다. 내부적으로 데이터베이스 커넥션을 사용해서 데이터베이스에 접근합니다. 엔티티 매니저의 몇 가지 메소드를 살펴보겠습니다.

1. find() 메소드: 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾아 영속성 컨텍스트에 저장합니다.

2. persist() 메소드: 엔티티를 영속성 컨텍스트에 저장합니다.
3. remove() 메소드: 엔티티 클래스를 영속성 컨텍스트에서 삭제합니다.
4. flush() 메소드: 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영합니다.

 

영속성 컨텍스트

JPA를 이해하기 위해서는 영속성 컨텍스트를 이해하는 것이 가장 중요합니다. 엔티티를 영구 저장하는 환경으로 엔티티 매니저를 통해 영속성 컨텍스트에 접근합니다.

 

엔티티 생명주기

위 설명만 보고는 어떻게 동작하는지 알기 어려우므로 상품 엔티티를 만들어서 영속성 컨텍스트에 저장 후 데이터베이스에 반영하는 코드를 살펴보겠습니다.

1. 영속성 컨텍스트에 저장할 상품 엔티티를 하나 생성합니다. new 키워드를 통해 생성했으므로 영속성 컨텍스트와 관련이 없는 상태입니다.

2. 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성합니다.
3. 엔티티 매니저는 데이터 변경 시 데이터의 무결성을 위해 반드시 트랜잭션을 시작해야 합니다. 여기서의 트랜잭션

도 데이터베이스의 트랜잭션과 같은 의미로 생각하면 됩니다.

4. 생성한 상품 엔티티가 영속성 컨텍스트에 저장된 상태입니다. 여기까지는 데이터베이스에 INSERT SQL을 보내지 않은 단계입니다.

5. 트랜잭션을 데이터베이스에 반영합니다. 이때 영속성 컨텍스트에 저장된 상품 정보가 데이터베이스 INSERT 되면 반영됩니다.

6, 7 엔티티 매니저와 엔티티 매니저 팩토리의 close() 메소드를 호출해 사용한 자원을 반환합니다.

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

JPA이렇게 영속성 컨텍스트를 사용하는 것일까요? 바로 애플리케이션과 데이터베이스 사이에 영속성 컨텍스트라는 중간 계층을 만들었기 때문입니다. 이렇게 중간 계층을 만들면 버퍼링, 캐싱 을 할수 있는 장점이 있습니다.

영속성 컨텍스트 1차 캐시 구조

1차 캐시
영속성 컨텍스트에는 1차 캐시가 존재하며 MapKEY,VALUE로 저장됩니다. entityManager. find() 메소드 호출 시 영속성 컨텍스트의 1차 캐시를 조회합니다. 엔티티가 존재할 경우 해당 엔티티 를 반환하고. 엔티티가 없으면 데이터베이스에서 조회 1 차 캐시에 저장 반환합니다.

동일성 보장

하나의 트랜잭션에서 같은 키값으로 영속성 컨텍스트에 저장된 엔티티 조회 같은 엔티티 조회를 보장합니다. 바로 1차 캐시에 저장된 엔티티를 조회하기 때문에 가능합니다.

 

트랜잭션을 지원하는 쓰기 지연

영속성 컨텍스트 쓰기 지연 SQL 저장소

영속성 컨텍스트에는 쓰기 지연 SQL 저장소가 존재합니다. entityManager.persist()를 호출하면 1캐시에 저장되는 것과 동시에 쓰기 지연 SQL 저장소에 SQL문이 저장됩니다. 이렇게 SQL을 쌓 아두고 트랜잭션을 커밋하는 시점에 저장된 SQL문들이 flush되면서 데이터베이스에 반영됩니다. 이 렇게 모아서 보내기 때문에 성능에서 이점을 볼 수 있습니다.

변경 감지

JPA1차 캐시에 데이터베이스에서 처음 불러온 엔티티의 스냅샷 값을 갖고 있습니다. 그리고 1캐시에 저장된 엔티티와 스냅샷을 비교 후 변경 내용이 있다면 UPDATE SQL문을 쓰기 지연 SQL 저장소에 담아둡니다. 그리고 데이터베이스에 커밋 시점에 변경 내용을 자동으로 반영합니다. , 따 로 update문을 호출할 필요가 없습니다.

참고 : https://book.naver.com/bookdb/book_detail.naver?bid=20883049 

 

백견불여일타 스프링 부트 쇼핑몰 프로젝트 with JPA

스프링 부트와 JPA를 활용하여 실제 이커머스 업계에서 활용되는 쇼핑몰 기술들을 직접 구현해볼 수 있게 구성하였다. JPA와 THYMELEAF에 대한 간단한 예제로 기본 개념과 사용법을 익히고 그 후 쇼

book.naver.com