스프링 영속성 컨텍스트는 트랜젝션과 관련이 있다
먼저 영속석 컨텍스트와 트랜젝션의 개념과 연관성에 대해 알아보자
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 |
---|