[SPRING:이론] 4

김승수·2024년 5월 21일
0

SPRING

목록 보기
4/27

⏰ 2024. 05. 21 화

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. Entity
  2. 영속성 컨텍스트
  3. JPA의 트랜잭션
  4. 영속성 컨텍스트 기능

Entity

Entity

JPA에서 관리되는 클래스, 즉 객체를 의미하고, DB의 테이블과 매핑되어 JAP에 의해 관리된다.

Entity 클래스에 사용되는 어노테이션(@)

  • 클래스 어노테이션

    1. @Entity : JPA가 관리하는 Entity 클래스로 지정,
      속성 (name="클래스명") : 다른 "클래스명"으로 지정 가능, 기본값 클래스명
    2. @Table : 매핑할 테이블을 지정한다.
  • 필드 어노테이션

    1. @Column : 선언된 필드를 테이블의 열로 지정
      속성1 (name = "테이블의 컬럼명") : 필드와 매핑할 테이블의 컬럼을 지정, 기본값 객체의 필드명
      속성2 (nullable = 불린값) : 데이터의 null 값 허용 여부를 지정, 기본값 true
      속성3 (unique = 불린값) : 데이터의 중복 값을 허용 여부를 지정, 기본값 false
      속성4 (length = 정수값) : 데이터 값의 길이에 제약조건을 부여, 기본값 255
    2. @Id : 테이블의 기본 키를 지정
      이 기본 키는 영속성 컨텍스트에서 Entity를 구분하고 관리할 때 사용되는 식별자 역할을 수행
      => 기본 키를(@Id) 지정해 주지 않으면 오류 발생
    3. @GeneratedValue : @Id의 기본 키 지정 어노테이션의 옵션으로 기본 키 생성 권한을 DB에 위임
      대표적인 속성(stategy = GenerationType.IDENTITY)로 기본 키에 auto_increment 조건을 추가

영속성 컨텍스트

영속성(persistence) 컨텍스트

persistence (뜻 : 영속성, 지속성)
=> 객체가 생명이나 공간을 자유롭게 유지하고 이동할 수 있는 객체의 성질

영속성 컨텍스트는 Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간이다.

  • JPA는 영속성 컨텍스트에 Entity 객체들을 저장하여 관리하면서 DB와 연결되 작동
  • 영속성 컨텍스트에 접근하여 Entity 객체들을 조작하기 위해서 EntityManager가 필요

EntityManager

영속성 컨테스트에서 Entity를 관리하는 관리자로, 개발자가 EntityManager를 사용해 Entity를 저장, 조회, 수정, 삭제 가능하다.
EntityManager는 EntityManagerFactory를 통해 생성하여 사용 가능하다.

EntityManagerFactory

EntityManagerFactory는 DB하나에 하나만 생성되어 사용되고, 생성하기 위해서는 DB에 대한 정보가 필요하다.
정보 전달을 위해서 /resources/META-INF/ 위치의 persistence.xml 파일을 만들어 정보를 저장

⚡ 트랜잭션

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

  • 특징
    • 여러 개의 SQL이 하나의 트랙잭션에 포함 가능
    • 모든 SQL이 성공적으로 수행되면 DB에 영구적으로 반영
    • 여러 개의 SQL 중 단 하나라도 실패하면 모든 변경을 취소

JPA의 트랜잭션

JPA에서는 안정적으로 DB를 관리하기 위한 트랜잭션 개념을 영속성 컨텍스트를 통해 구현한다.
즉, 영속성 컨텍스트에 Entity 객체들을 저장했다고 해서 바로 반영되지 않는다.

-> DB의 트랜잭션 처럼 JPA에서도 영속성 컨텍스트로 관리하고 있는 변경이 발생한 객체들의 정보를 쓰기 지연 저장소에 전부 가지고 있다가 마지막에 SQL을 한번에 DB에 반영

영속성 컨텍스트 기능

기능 1. 1차 캐시

영속성 컨텍스트는 내부적으로 캐시 저장소를 가지고 있다.

  • 저장하는 Entity 객체들은 1차 캐시, 즉 캐시 저장소에 저장
  • 캐시 저장소는 Map 자료구조 형태
  • key에는 @Id로 매핑한 기본 키, 식별자 값을 저장
  • value에는 해당 Entity 클래스의 객체 저장
  • 영속성 컨텍스트는 캐시 저장소의 key에 저장한 식별자값을 사용하여 Entity 객체를 구분하고 관리

기능 2. Entity 저장

em.persist(객체명); 메서드로 객체명에 해당하는 객체를 캐시 저장소에 저장한다.

기능 3. Entity 조회

  1. 캐시 저장소에 id가 존재하지 않는 경우

em.find(객체의 클래스명, 기본키 값) 메서드 호출 시, 캐시 저장소에 조회하고 없으면 DB에 SELECT로 조회해서 캐시 저장소에 저장

  1. 캐시 저장소에 id가 존재하지 경우

em.find(객체의 클래스명, 기본키 값) 메서드 호출 시, 캐시 저장소에 기본키 값에 해당하면서 클레스명에 해당하는 Entity 타입인 값이 있는지 조회하고 있으면, Entity 객체를 반환

⚡ 1차 캐시 장점

  • DB 조회 횟수를 줄임
  • 1차 캐시를 사용해 DB row 1개 당 객체 1개가 사용되는 것을 보장(= 객체 동일성 보장)

기능 4. Entity 삭제

삭제할 Entity를 em.find(객체의 클래스명, 기본키 값) 메서드를 통해 조회해서 없다면 DB를 조회해서 저장하고, em.remove(객체명) 메서드를 호출해 Entity를 DELETED 상태로 만들고 트랜잭션 commit하면 DB에 Delte SQL이 요청된다.

기능 5. 쓰기 지연 저장소(ActionQueue)

트랜잭션과 마찬가지로 JPA에서는 쓰기 지연 저장소를 만들어 SQL을 모아두었다가 트랜잭션 commit하면 한번에 DB에 반영한다.

기능 6. flush() 메서드

트랜잭션 commit 전에 쓰기 지연 저장소에 있는 SQL들을 DB에 요청하는 역할을 수행

기능 7. 변경 감지(Dirty Checking)⭐

영속성 컨텍스트에서 Entity가 변경될 대마다 Update SQL을 쓰기 지연 저장소에 저장한다면 하나의 SQL로 처리할 수 있는 경우에도 여러 번의 SQL을 요청하고 되기 때문에 비효율적이다.

  • JAP는 영속성 컨텍스트에 Entity를 저장할 때, 최초 상태(LoadedState)를 저장
  • 트랜잭션이 commit 되거나 em.flush() 호출되면, Entity의 현재 상태와 저장한 최초 상태를 비교
  • 변경이 있다면 Update SQL을 생성해 쓰기 지연 저장소에 저장하고 모든 SQL을 DB에 요청

⭐ 따라서 변경하고 싶은 데이터가 있다면 먼저 데이터를 조회하고 해당 Entity 객체의 데이터를 변경하면 자동으로 Update SQL이 생성되어 DB에 반영된다.

profile
개발하는 미어캣

0개의 댓글