⏰ 2024. 05. 21 화
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
Entity
JPA에서 관리되는 클래스, 즉 객체를 의미하고, DB의 테이블과 매핑되어 JAP에 의해 관리된다.
클래스 어노테이션
@Entity
: JPA가 관리하는 Entity 클래스로 지정,@Table
: 매핑할 테이블을 지정한다.필드 어노테이션
영속성 컨텍스트
persistence (뜻 : 영속성, 지속성)
=> 객체가 생명이나 공간을 자유롭게 유지하고 이동할 수 있는 객체의 성질
영속성 컨텍스트는 Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간이다.
EntityManager
가 필요영속성 컨테스트에서 Entity를 관리하는 관리자로, 개발자가 EntityManager를 사용해 Entity를 저장, 조회, 수정, 삭제 가능하다.
EntityManager는 EntityManagerFactory
를 통해 생성하여 사용 가능하다.
EntityManagerFactory는 DB하나에 하나만 생성되어 사용되고, 생성하기 위해서는 DB에 대한 정보가 필요하다.
정보 전달을 위해서 /resources/META-INF/
위치의 persistence.xml
파일을 만들어 정보를 저장
트랜잭션은 DB에서 데이터들의 무결성과 정합성을 유지하기 위한 논리적 개념이다.
JPA에서는 안정적으로 DB를 관리하기 위한 트랜잭션 개념을 영속성 컨텍스트
를 통해 구현한다.
즉, 영속성 컨텍스트에 Entity 객체들을 저장했다고 해서 바로 반영되지 않는다.
-> DB의 트랜잭션 처럼 JPA에서도 영속성 컨텍스트로 관리하고 있는 변경이 발생한 객체들의 정보를 쓰기 지연 저장소
에 전부 가지고 있다가 마지막에 SQL을 한번에 DB에 반영
영속성 컨텍스트는 내부적으로 캐시 저장소를 가지고 있다.
em.persist(객체명);
메서드로 객체명에 해당하는 객체를 캐시 저장소에 저장한다.
em.find(객체의 클래스명, 기본키 값)
메서드 호출 시, 캐시 저장소에 조회하고 없으면 DB에 SELECT로 조회해서 캐시 저장소에 저장
em.find(객체의 클래스명, 기본키 값)
메서드 호출 시, 캐시 저장소에 기본키 값에 해당하면서 클레스명에 해당하는 Entity 타입인 값이 있는지 조회하고 있으면, Entity 객체를 반환
⚡ 1차 캐시 장점
삭제할 Entity를 em.find(객체의 클래스명, 기본키 값)
메서드를 통해 조회해서 없다면 DB를 조회해서 저장하고, em.remove(객체명)
메서드를 호출해 Entity를 DELETED
상태로 만들고 트랜잭션 commit하면 DB에 Delte SQL이 요청된다.
트랜잭션과 마찬가지로 JPA에서는 쓰기 지연 저장소
를 만들어 SQL을 모아두었다가 트랜잭션 commit하면 한번에 DB에 반영한다.
트랜잭션 commit 전에 쓰기 지연 저장소에 있는 SQL들을 DB에 요청하는 역할을 수행
영속성 컨텍스트에서 Entity가 변경될 대마다 Update SQL을 쓰기 지연 저장소에 저장한다면 하나의 SQL로 처리할 수 있는 경우에도 여러 번의 SQL을 요청하고 되기 때문에 비효율적이다.
최초 상태(LoadedState)
를 저장⭐ 따라서 변경하고 싶은 데이터가 있다면 먼저 데이터를 조회하고 해당 Entity 객체의 데이터를 변경하면 자동으로 Update SQL이 생성되어 DB에 반영된다.