<TIL> 119. Spring Data JPA?

YUJIN LEE·2023년 5월 25일
0

개발log

목록 보기
109/149

Spring Data JPA?

JPA란 자바 어플리케이션에서 관계형 데이터베이스 사용하는 방식을 정의한 인터페이스

Spring Data JPA는 Spring에서 제공하는 모듈 중 하나,
개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다.
-> JPA를 한 단계 추상화시킨 Repository 인터페이스 제공
ctrl shift b로 확인해보자..

build.gradle 의존성 추가 및 인터페이스만 정의해주게 되면 JPA CRUD를 바로 사용 가능

단, 영속성 컨텍스트 및 Dirty Checking 개념을 잘 이해하고 사용하지 않으면 데이터 손실 및 성능 이슈가 있을 수 있다.

JPA의 모든 데이터 변경은 트랜잭션 안에서 실행!

즉, 트랜잭션 밖에서 데이터 변경은 반영X

Spring Data JPA 구현코드를 살펴보면,
변경이 일어나는 코드는 @Transactional이 이미 추가 되어있다.

즉, 구현코드를 정확히 이해하지 않고 사용시 문제가 발생할 수 있다.

영속성 컨텍스트?

영속성 컨텍스트는 entity를 저장하고 관리하는 저장소.

어플리케이션과 데이터베이스 사이에 entity를 보관하는 가상의 데이터베이스 같은 역할

Spring Data JPA에서 제공하는 save 메소드 구현 코드를 보면 em.persist를 통해 영속성 컨텍스트에 저장.
-> 이때 , entity는 영속상태

이미 영속상태인 경우 merge를 통해 덮어 쓴다.

영속성 컨텍스트를 왜 사용할까?

  • Database와 어플리케이션 사이의 중간 계층에 있으면서 여러가지 이점이 있다.
  • 영속성 컨텍스트 내에 1차 캐시
  • 영속성 컨텍스트 내에 쓰기 지연 SQL 저장소
  • 엔티티 수정(Dirty Checking)

영속성 컨텍스트 - 1차 캐시

  • 영속성 컨텍스트 내부에 1차 캐시를 가짐
  • persist를 하는 순간 pk값(id), 타입과 객체를 맵핑하여 1차 캐시에 가지고 있음
  • 한 트랜잭션 내에 1차 캐시에 이미 있는 값을 조회하는 경우 DB를 조회하지 않고 1차 캐시에 있는 내용을 그대로 가져온다.
  • 단, 1차 캐시는 어플리케이션 전체 공유가 아닌 한 트랜잭션 내에서만 공유
  • 반면, 조회 했을 때 1차 캐시에 없다면 DB에서 가져와 1차 캐시에 저장 후 반환

영속성 컨텍스트 - 쓰기 지연 SQL

  • memberA를 persist 하는 순간,
    1차 캐시에 넣고 쓰기 지연 SQL 저장소에 쿼리를 만들어 쌓음.

  • memberB도 persist 하는 순간 동일한 과정,
    commit 하는 순간 flush가 되며 DB에 반영

  • flush란 영속성 컨텍스트의 변경 내용을 DB에 반영하며, 1차 캐시를 지우지는 않음.

JPA Dirty Checking

  • Dirty? 상태의 변화가 생긴 정도.

  • Dirty Checking이란, entity 상태 변경 검사

JPA에서 트랜잭션이 끝나는 시점에 변화가 있는 모든 entity 객체를 데이터 베이스에 자동으로 반영함

Dirty Checking의 내부 구조

  • JPA는 commit 하는 순간 내부적으로 flush가 호출되고, 이때 엔티티와 스냅샷을 비교.
  • 1차 캐시에는 처음 들어온 상태인 엔티티 스냅샷을 넣어두고 commit 하는 순간 변경된 값이 있는지 비교해 변경된 값이 있으면 update 쿼리를 쓰기 지연 SQL에 넣어둔다.

Dirty Checking 주의사항

  • 영속성 컨텍스트가 관리하는 entity에만 적용.
  • 영속성 컨텍스트에 처음 저장된 순간 스냅샷 저장, 트랜잭션이 끝나는 시점에 비교해 변경된 부분을 쿼리로 생성하여 데이터 베이스로 반영
  • 즉, 영속 상태가 아닐 시 값을 변경해도 DB에 반영 X
  • 트랜잭션 없이 데이터 반영 X

JPA Auditing 사용 이유

  • 엔티티마다 공통적으로 필요한 값(등록일, 수정일) 등은 유지보수에 있어 반드시 필요한 값

@MappedSuperclass // 엔티티의 공통 매핑 정보
@EntityListeners // 해당 클래스에 auditing 기능 포함
@CreatedDate // Entity가 생성되어 저장될 때 시간 자동 저장
@LastModifiedDate / Entity 값을 변경할 때 시간 Update

profile
인정받는 개발자가 되고싶습니다.

0개의 댓글