Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

코딩 이래요래

Spring Data JPA 본문

JAVA

Spring Data JPA

강범호 2025. 5. 30. 15:26

ORM, JPA, Hibernate, Spring Data JPA 개념 정리

ORM?

ORM(Object Relational Maping) 객체지향 프로그래밍(OOP)과 관계형 데이터베이스(RDB) 사이의 불일치를 해결하기 위한 기술이다.

즉, 자바에서 사용하는 객체(Entity)를 DB의 테이블에 매핑하여, SQL 없이도 자바 코드만으로 조회, 수정, 저장 등을 할 수 있게 도와준다.

 

JPA?

JPA(Java Persistence API)는 자바 진영의 ORM 기술에 대한 표준 명세이다. 말 그대로 ORM 기능을 일관된 방법으로 사용하기 위한 스펙만 정의할 뿐, 구현체는 없다.

 

Hibernate?

JPA를 구현한 대표적인 구현체이며, JPA 스펙을 기반으로 다양한 기능을 제공하며, 자바 ORM 기술의 실질적 표준처럼 사용됨. 

 

Spring Data JPA?

JPA(Hibernate)를 더욱 쉽게 사용할 수 있도록 추상화한 Spring 기반 ORM 모듈이다.

JPA는 내부적으로 JDBC위에서 동작하지만 SQL을 자동 생성해주고, 영속성 컨텍스트를 통해 엔티티 상태를 관리한다.

 

JPA의 기본 동작 방식

https://techblog.uplus.co.kr/jpa-경험기-6e50497f56fd

1. JPA의 기본 구조

JPA는 Java 어플리케이션에서 관계형 데이터베이스를 객체처럼 다룰 수 있도록 돕는 ORM(Object Relational Mapping) 기술이다.

  • 내부적으로 JDBC API를 사용하지만, 개발자는 SQL을 직접 작성하지 않고도 데이터를 다룰 수 있다.
  • @Entity로 선언된 클래스는 테이블과 매핑되며, Java 코드로 INSERT/SELECT/UPDATE 등을 처리할 수 있다.

2. Persistence Context (영속성 컨텍스트)

@Entity 객체가 생성되고 EntityManager를 통해 관리되기 시작하면, 그 객체는 DB에 저장되기 전 '영속성 컨텍스트'에서 메모리상으로 관리된다.

✔ 주요 역할

개념 설명
1차 캐시 같은 엔티티를 조회할 때 DB를 다시 조회하지 않고 메모리에서 반환
스냅샷 엔티티 최초 상태를 저장해 변경 여부를 비교할 수 있게 함
변경 감지 트랜잭션 도중 엔티티가 수정되면, 스냅샷과 비교해 자동으로 UPDATE SQL 생성
쓰기 지연 SQL 저장소 INSERT/UPDATE SQL을 일단 모아두고 flush() 또는 commit() 시점에 실행

영속성 컨텍스트는 "작업 대기 중인 엔티티들의 메모리 창고"와 같음.

3. EntityManager와 스레드 안전성 (Thread Safety)

EntityManager

  • 영속성 컨텍스트를 관리하는 핵심 객체
  • persist(), find(), remove() 등 모든 엔티티 작업은 EntityManager를 통해 이루어짐

스레드 안전성 문제

  • EntityManager는 스레드-안전(Thread-Safe) 하지 않다.
  • 여러 스레드에서 하나의 EntityManager를 공유하면 동시성 문제, 데이터 정합성 깨짐 등의 이슈가 발생할 수 있다.

해결 방법: 스코프 전략

전략 설명
Request Scope HTTP 요청마다 독립적인 EntityManager 할당 → Web 환경에서 안전
OSIV(Open Session In View) 뷰 렌더링 직전까지 EntityManager를 열어두는 전략 (성능 저하 우려로 프로덕션에서는 false로 비활성화하는 경우 많음)
 

4. 영속성 컨텍스트(Persistence Context)가 엔티티를 관리하는 원리

 

1. 1차 캐시

  • 영속성 컨텍스트 내부에 존재하는 Map<@Id, Entity>구조
  • 같은 트랜잭션 내에서 find()나 getReference()로 동일한 엔티티를 조회하면 DB에 접근하지 않고 1차 캐시에서 반환
    • 조회 성능 향상, 객체 동일성을 보장함.
  • 해당 캐시는 트랜잭션 범위 내에서만 유효함.

2. 스냅샷(Snapshot)과 변경감지(Dirty Checking)

  • 영속성 컨텍스트에 엔티티가 저장되면, 최초의 상태의 스냅샷을 저장함.
  • 트랜잭션 동안 엔티티가 변경되면, 현재 값과 스냅샷을 비교하여 변경 여부를 감지함.
  • 변경이 감지되면 SQL UPDATE 쿼리를 생성하여 쓰기 지연 SQL 저장소에 쌓임.
    • 단, 비영속 상태나 준영속 상태(detached)인 객체는 변경 감지가 일어나지 않는다.

3. Flush (쓰기 지연 SQL 실행)

  • flush()가 호출되거나, 트랜잭션이 commit() 되기 전 JPA는 내부적으로 flush를 수행함.
  • 이 시점에 쌓인 INSERT/UPDATE/DELETE 쿼리가 DB에 전송됨.
    • 이를 통해 여러 개의 쿼리를 하나의 트랜잭션 안에서 일괄 처리할 수 있고, DB에 접근하는 횟수를 줄일 수 있다.

4. Commit (트랜잭션 커밋)

  • 실제로 DB에 반영되는 시점
  • flush된 SQL이 정상적으로 실행되면 트랜잭션 커밋

'JAVA' 카테고리의 다른 글

Spring Boot + Prometheus + Grafana 대시보드 만들기  (3) 2025.06.17
Spring Framework 핵심 개념  (0) 2025.04.29
자료구조 - Tree, Binary Tree  (0) 2025.04.16
자료구조 - Stack, Queue, Deque  (0) 2025.04.13
자료구조 - List  (0) 2025.04.13