Spring/Spring boot

영속성 컨텍스트란? - JPA 트랜젝션

S_N_Y 2024. 1. 25. 10:32

스프링 영속성 컨텍스트는 트랜젝션과 관련이 있다

먼저 영속석 컨텍스트와 트랜젝션의 개념과 연관성에 대해 알아보자

 

1. 영속성 컨텍스트

Persistence(직역:영속성, 지속성)를 객체의 관점으로 해석해 보자면 ‘객체가 생명(객체가 유지되는 시간)이나 공간(객체의 위치)을 자유롭게 유지하고 이동할수 있는 객체의 성질’을 의미이다

=> 쉽게 말해 Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간

=> 직접 sql을 개발하지 않아도 JPA를 사용해서 DB에서 데이터 CRUD가 가능하다

 

영속성 컨텍스트에 접근하여 Entity 객체들을 조작하기 위해서는 EntityManager가 필요하다.

(EntityManager : Entity를 관리하는 관리자)

개발자들은 EntityManager를 사용해서 Entity를 저장하고 조회하고 수정하고 삭제할 수 있다

그리고 EntityManager는 EntityManagerFactory를 통해 생성하여 사용할 수 있다

 

EntityManagerFactory는 일반적으로 DB 하나에 하나만 생성되어 애플리케이션이 동작하는 동안 사용

EntityManagerFactory를 만들기 위해서는 DB에 대한 정보를 전달해야 한다

-> persistence.xml 파일을 만들어 정보를 넣어두기

// test에 넣어두기
EntityManagerFactory emf = Persistence.createEntityManagerFactory("memo");
EntityManager em = emf.createEntityManager();

이를 토대로 EntityManagerFactory와 EntityManager를 생성할 수 있다.

 

2. 트랜젝션

트랜잭션은 DB 데이터들의 무결성과 정합성을 유지하기 위한 하나의 논리적 개념이다

=> DB의 데이터들을 안전하게 관리하기 위해서 생겨난 개념

가장 큰 특징은 여러 개의 SQL이 하나의 트랜잭션에 포함될 수 있다는 점인데 이때, 모든 SQL이 성공적으로 수행이 되면 DB에 영구적으로 변경을 반영하지만 SQL 중 단 하나라도 실패한다면 모든 변경을 되돌리는 특성이 있다

// sql
START TRANSACTION; # 트랜잭션을 시작

INSERT INTO memo (id, username, contents) VALUES (1, 'Robbie', 'Robbie Memo');
INSERT INTO memo (id, username, contents) VALUES (2, 'Robbert', 'Robbert Memo');
SELECT * FROM memo; # 여기까지 DB에 반영 안된다

COMMIT; # 트랜잭션을 커밋 - 커밋해야 한꺼번에 반영된다

SELECT * FROM memo;
 # 즉, 영속성 컨텍스트에 Entity 객체들을 저장했다고 해서 DB에 바로 반영 되지는 않습니다

영속성 컨텍스트는 트랜젝션의 훌륭한 기능들을 가지고 와서 반영한다

이렇게 DB에서 하나의 트랜잭션에 여러 개의 SQL을 포함하고 있다가 마지막에 영구적으로 변경을 반영하는 것 처럼 JPA에서도 영속성 컨텍스트로 관리하고 있는 변경이 발생한 객체들의 정보를 쓰기 지연 저장소에 전부 가지고 있다가 마지막에 SQL을 한번에 DB에 요청해 변경을 반영한다.

=> 트랜젝션 개념 도입으로 관리를 끝까지 하고 있다가 문제 없으면 한 번에 반영하는게 훨씬 효율적으로 관리돼서 도입

'Spring > Spring boot' 카테고리의 다른 글

intellij ultimate spring 기본 환경 세팅  (0) 2024.01.17