JPA의 개요(개념과 동작 원리)를 알아보도록 하자.
JPA 정의
JPA에 대해서 알아보기 전에, ORM이 뭔지 짚고 넘어가야 한다.
ORM(Object-Relational Mapping)이란 객체(Object)와 관계형 데이터베이스(RDB)에서 사용되는 데이터를 자동으로 매핑하여 변환하는 기술이다.
ORM을 사용하는 이유는 객체와 관계형 데이터베이스 간의 패러다임이 일치하지 않기 때문이다.
객체는 상속과 참조를 사용하는 반면, 관계형 데이터베이스는 외래키를 사용하기 때문이다.
JPA는 이러한 ORM을 사용하여 객체와 관계형 데이터베이스 간의 패러다임 불일치를 해결하고,
객체 지향적인 설계에 집중할 수 있게 해주는 표준 인터페이스를 의미한다!
JPA를 사용하면, find(조회) / merge(삽입) / remove(삭제) 등의 메소드를 통해,
객체의 상태 변화를 데이터베이스에 자동으로 반영할 수 있다.
기존 JDBC, Spring JDBC와의 차이점(예제)
기존의 JDBC, Spring JDBC는 데이터베이스에 접근하기 위해 쿼리를 자바 코드에 작성해야 했다.
2026.01.25 - [Spring] - [Spring] JDBC / Spring JDBC >> 참고
하지만 JPA는 객체(엔티티)를 설계한 뒤, 언급했던 find(), merge() 등과 같은 메소드를 호출함으로써
데이터베이스 조회와 저장, 수정 작업을 수행할 수 있다.
예제로 직접 살펴보자.
@Repository
@Transactional
public class MemberJpaRepository {
@PersistenceContext
private EntityManager entityManager;
// 행 삽입
public void insert(Member member) {
entityManager.merge(member);
}
// 행 조회
public Member findById(long id) {
return entityManager.find(Member.class, id);
}
// 행 삭제
public void deleteById(long id) {
Member member = entityManager.find(Member.class, id);
if (member != null) {
entityManager.remove(member);
}
}
}
- .find(): 데이터베이스의 기본키(id)를 이용해 특정 멤버 한 명을 찾는 메소드
- .merge(): 전달받은 member 객체를 데이터베이스에 저장하는 메소드
- .remove(): 특정 멤버를 id로 찾아 삭제하는 메소드
직접 쿼리를 작성했던 JDBC, Spring JDBC보다 데이터베이스 접근이 훨씬 수월해졌음을 알 수 있다.
JPA 핵심 용어
예제에서 사용했던 EntityManager는 무엇일까? 또한 JPA의 Persistence는 무엇을 의미하는 것일까?
JPA를 사용하면서 알아야 할 핵심 용어들에 대해 살펴보자.
Entity / EntityManager
먼저 Entity와 EntityManager에 대해 알아보도록 하자.
Entity
Entity(엔티티)는 데이터베이스 테이블과 1:1로 매칭되는 자바 객체를 의미한다.
위 예제에 있는 Member 클래스가 바로 Entity 클래스를 의미한다!
@Entity
public class Member {
@Id
private Long id;
private String name;
}
Member 엔티티에서 기본키 역할을 맡은 id는 @Id 어노테이션을, Member 클래스는 @Entity 어노테이션을 붙여주어야 한다.
EntityManager
EntityManager는 Entity의 생명 주기를 관리해주는 객체를 의미한다.
Entity의 생명주기는 4가지 상태로 나뉜다.

- Transient(비영속, New): DB와 연결되지 않은 순수한 객체 상태(ex: member 객체)
- Persistent(영속, Managed): EntityManager가 관리하고 DB와 동기화되는 객체 상태
- persist(): 비영속 상태에서 영속 상태로 변환하는 메소드
- merge(): 준영속 상태에서 영속 상태로 변환하는 메소드
- Detached(준영속): EntityManager가 관리하지 않는 상태
- detach(): 영속 상태에서 준영속 상태로 변환하는 메소드
- Removed(삭제 예정): DB에서 데이터를 삭제하려는 상태
→ 트랜잭션이 커밋될 때 DELETE 쿼리로 레코드들을 삭제하도록 예약된 상태
Persistence Context(영속성 콘텍스트)
EntityManager는 영속(Persistent) 상태인 엔티티를 Persistence Context라는 저장소에 넣어 놓는다.
Persistence Context에서 EntityManager는 다음과 같은 역할을 수행한다.
1. 1차 캐시
- 이미 조회했던 데이터를 다시 조회할 때는, DB가 아닌 메모리에서 반환하는 것을 의미한다.
즉, 영속성 콘텍스트 내부에 존재하는 캐시를 의미한다. - 만약, 1차 캐시에 엔티티가 존재하지 않으면 DB에서 조회한 후 1차 캐시에 저장한다.
- 1차 캐시는 자바의 Map 형태로 구현되어 있다.
- key: @Id로 매핑된 식별자(PK)
- value: 엔티티 인스턴스
2. Dirty Checking
영속 상태인 엔티티 값을 변경하면, 트랜잭션이 끝날 때 JPA가 자동으로 UPDATE SQL을 실행해주는 것을 Dirty Cheking이라고 한다.
Dirty Checking의 동작 원리는 다음과 같다.
- Persistence Context에 처음 들어온 엔티티, 즉 영속 상태인 엔티티의 초기 상태를 복사하여 스냅샷(SnapShot)으로 저장해둔다.
- 트랜잭션이 커밋되기 직전, JPA는 초기 스냅샷과 영속 상태인 엔티티를 대조한다.
- 영속 상태인 현재 엔티티 값이 최초 스냅샷과 달라진 점이 있다면, UPDATE SQL을 쓰기 지연 저장소에 넣는다.
- 이후 flush 시점에 저장소 내에 있는 UPDATE 등의 쿼리들을 실행하여 실제 데이터를 변경한다.
(※ flush: 영속성 콘텍스트의 변경 내용을 데이터베이스에 동기화 하는 작업)
즉, Dirty Checking은 변경 사항을 모아두었다가 트랜잭션이 끝날 때 한꺼번에 DB에 동기화하는 작업을 의미한다!
지금까지 JPA의 정의와 구성된 요소들에 대해서 알아보았다!
하지만 코드 레벨에서 알아볼 개념들이 많으니.. 차차 살펴보도록 하자 :)
👏
참고
'Development > 개발 공부' 카테고리의 다른 글
| [JPA] JPA 쿼리 (3) (0) | 2026.03.17 |
|---|---|
| [JPA] 엔티티(Entity) 매핑 (2) (0) | 2026.03.11 |
| [Git] 깃 브랜치 전략(Git Flow, Github Flow)(+TBD) (0) | 2025.12.14 |
| AOP(Aspect Oriented Programming, 관점 지향 프로그래밍) (0) | 2025.11.10 |
| [NoSQL] Redis란? (0) | 2025.10.17 |