1 minute read

Updated:

Spring Data JPA란?

  • JPA란 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
  • Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 해준다.
  • JPA를 한 단계 추상화시킨 Repository 인터페이스 제공
  • build.gradle 의존성 추가 및 인터페이스만 정의해주게 되면 JPA의 CRUD를 바로 사용 가능!
//build.gradle에 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//Repository 인터페이스 생성
public interface PharmacyRepository extends JpaRepository<Pharmacy, Long> {
}
  • 단, 영속성 컨텍스트 및 Dirty Checking 개념을 잘 이해하고 사용하지 않으면 데이터 손실 및 성능 이슈가 발생할 수 있다.
    • 영속성 : 데이터를 생성한 프로그램이 없어지더라도 사라지지 않는 데이터의 특성

출처 : 자바 ORM 표준 JPA 프로그래밍

출처 : 자바 ORM 표준 JPA 프로그래밍

Spring Data JPA 사용시 주의사항

  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다. 트랜잭션 밖에서 데이터 변경은 반영되지 않는다.
    • 트랜잭션 : 트랜잭션은 데이터베이스에서 실행되는 작업들의 논리적인 그룹으로서, 한 번에 모두 수행되어야 하며, 전체 작업이 성공적으로 완료되거나 전혀 수행되지 않아야 한다. 원자성, 일관성, 격리성, 지속성(ACID) 원칙에 따라 구현된다.
  • Spring Data JPA 구현 코드를 보면 변경이 일어나는 코드는 @Transaction이 이미 추가돼있다.

영속성 컨텍스트

  • 영속성 컨텍스트는 entity를 저장하고 관리하는 저장소이며, 어플리케이션과 데이터베이스 사이에 entity를 보관하는 가상의 데이터베이스 역할을 한다.
  • SimpleJpaRepository 내 save 메소드 구현 코드를 보면 em.persist를 통해 영속성 컨텍스트에 저장한다.
@Transactional
	@Override
	public <S extends T> S save(S entity) {

		Assert.notNull(entity, "Entity must not be null.");

		if (entityInformation.isNew(entity)) {
			em.persist(entity);
			return entity;
		} else {
			return em.merge(entity);
		}
	}

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

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

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

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

출처 : 자바 ORM 표준 JPA 프로그래밍

출처 : 자바 ORM 표준 JPA 프로그래밍

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

  • memeberA를 persist하는 순간 1차 캐시에 넣고 쓰기 지연 SQL 저장소에 쿼리를 만들어 쌓는다.
  • memberB도 persist하는 순간 동일 과정을 거치며 commit하는 순간 flush 되면서 DB에 반영된다.
  • flush란 영속성 컨텍스트의 변경 내용을 DB에 반영하며 1차 캐시를 지우지는 않는다.

출처 : 자바 ORM 표준 JPA 프로그래밍

출처 : 프로그래머스 (10개 프로젝트로 완성하는 백엔드 웹개발 - 약국 길찾기 서비스)

Tags:

Categories:

Updated: