JPA의 영속성 컨텍스트(Persistence Context)와 ORM 개념 잡기
이번 글에서는 JPA의 핵심 개념인 영속성 컨텍스트와 DB와 OOP(Object-Oriented Programming)의 불일치성을 해결하는 ORM(Object-Relational Mapping) 에 대해 쉽게 정리하겠습니다.
✅ JPA는 영속성 컨텍스트를 가지고 있다
"영속성 컨텍스트는 엔티티(Entity)를 관리하는 JPA의 핵심 기능이다!"
📌 영속성(Persistence)
- 데이터를 영구적으로 저장하는 특성
📌 컨텍스트(Context )
- 특정 대상에 대한 모든 정보를 가지고 있는 환경
🔹 영속성 컨텍스트란?
- JPA에서 영속성 컨텍스트(Persistence Context) 는 자바 객체(Entity)와 데이터베이스 사이의 중간 저장소 역할을 한다.
- 자바에서 데이터를 직접 DB에 저장하는 것이 아니라, JPA의 영속성 컨텍스트를 거쳐서 저장된다.
- 즉, JPA가 엔티티의 상태를 관리하고, DB와 동기화를 도와준다.
📌 "JPA는 영속성 컨텍스트를 통해 데이터의 변경을 감지하고 자동으로 반영한다!"
✅ 영속성 컨텍스트의 동작 원리
"JPA는 데이터를 바로 DB에 저장하지 않고, 영속성 컨텍스트를 통해 관리한다!"
🔹 영속성 컨텍스트를 통한 데이터 흐름
1️⃣ 자바 객체(Entity)를 생성
2️⃣ 영속성 컨텍스트에 객체를 저장 (persist)
3️⃣ 필요 시 DB에 저장 (commit 발생 시 반영됨)
4️⃣ 객체의 변경이 감지되면 자동으로 DB에 업데이트
📌 "영속성 컨텍스트는 DB와 동기화되며, 객체의 변경을 자동으로 감지해 업데이트한다!"
✅ 영속성 컨텍스트 예제 코드
📌 "JPA를 사용하면 직접 SQL을 작성하지 않아도 데이터를 자동으로 저장하고 관리할 수 있다!"
@Entity
public class Animal {
@Id @GeneratedValue
private Long id;
private String name;
}
@Transactional
public void saveAnimal() {
Animal animal = new Animal();
animal.setName("Tiger");
entityManager.persist(animal); // 영속성 컨텍스트에 저장
entityManager.flush(); // DB 반영
}
📌 persist() → 객체를 영속성 컨텍스트에 저장
📌 flush() → 영속성 컨텍스트의 데이터를 DB에 반영
✅ 영속성 컨텍스트의 주요 기능
| 기능 | 설명 |
| 1차 캐시 | 영속성 컨텍스트에서 조회하면, 같은 트랜잭션 내에서는 DB에 가지 않고 캐시에서 가져옴 |
| 변경 감지(Dirty Checking) | 엔티티의 값이 변경되면 자동으로 UPDATE 실행 |
| 쓰기 지연(Write-Behind) | 여러 INSERT 문을 모아서 한 번에 실행 |
| 트랜잭션을 통한 자동 반영 | 트랜잭션이 commit 될 때 변경 사항 자동 적용 |
📌 "영속성 컨텍스트 덕분에 JPA는 성능 최적화와 데이터 변경 감지를 자동으로 처리할 수 있다!"
✅ JPA는 DB와 OOP의 불일치성을 해결하는 방법을 제공한다
"DB는 객체를 저장할 수 없지만, JPA가 자동으로 매핑을 수행하여 이를 해결한다!"
📌 문제점
- DB 테이블과 자바 객체는 구조가 다름
- DB는 기본 자료형(Int, Varchar 등)만 저장 가능하지만,
자바는 객체(Object) 저장 가능
📌 해결책 - ORM(Object-Relational Mapping)
- JPA는 ORM 기술을 사용하여 DB 테이블과 자바 객체를 자동으로 매핑
- SQL 없이 자바 코드만으로 데이터 저장 & 조회 가능
✅ OOP(객체 지향 프로그래밍)란?
"OOP(Object-Oriented Programming)는 현실 세계를 객체(Object)로 표현하여 개발하는 프로그래밍 패러다임!"
✅ OOP의 핵심 개념
OOP는 데이터(객체)와 해당 객체의 동작(메서드)을 하나로 묶어 프로그램을 설계하는 방식입니다.
즉, 현실 세계의 개념을 프로그래밍 코드로 표현하는 것이 목표입니다.
📌 "OOP를 사용하면 코드의 재사용성이 높아지고, 유지보수가 쉬워진다!"
✅ OOP의 4대 특징
| 개념 | 설명 |
| 1. 캡슐화(Encapsulation) | 데이터와 메서드를 하나의 객체로 묶고, 외부에서 직접 접근하지 못하도록 보호 |
| 2. 상속(Inheritance) | 기존 클래스(부모)의 기능을 새로운 클래스(자식)에서 재사용 |
| 3. 다형성(Polymorphism) | 같은 메서드가 다른 객체에서 다르게 동작 |
| 4. 추상화(Abstraction) | 불필요한 부분은 숨기고, 중요한 기능만 노출 |
📌 "OOP를 활용하면 코드가 직관적이고 유지보수가 편리하다!"
✅ OOP 예제 코드 (자바)
// 부모 클래스 (Animal)
class Animal {
String name;
void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 자식 클래스 (Dog)
class Dog extends Animal {
void makeSound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.makeSound(); // 출력: 멍멍!
}
}
📌 "OOP를 사용하면 같은 makeSound() 메서드가 객체에 따라 다르게 동작할 수 있다!"
🔥 OOP의 장점
✅ 코드 재사용성 – 상속을 통해 기존 코드를 재사용 가능
✅ 유지보수성 향상 – 코드가 모듈화되어 수정이 용이
✅ 확장성 높음 – 새로운 기능 추가가 쉬움
✅ 가독성 향상 – 객체 중심의 설계로 직관적인 코드 작성
📌 "OOP는 유지보수성과 확장성을 높여주는 강력한 프로그래밍 방식이다!"
🔹 DB 테이블 vs 자바 객체
| DB 테이블(DB Table) | 자바 객체(Java Object) |
| id INT | int id; |
| name VARCHAR | String name; |
| team_id INT (외래키) | Team team; (객체) |
📌 "DB는 기본 자료형만 저장 가능하지만, JPA를 사용하면 객체 저장이 가능하다!"
✅ JPA를 활용한 객체 관계 매핑 예제
📌 "DB에서 관리하는 외래키를, JPA에서는 객체로 저장할 수 있다!"
🔹 DB 테이블
| Team 테이블 | Player 테이블 |
| id (PK) | id (PK) |
| name | name |
| year | team_id (FK) |
🔹 JPA 엔티티 매핑
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
private String year;
}
@Entity
public class Player {
@Id @GeneratedValue
private Long id;
private String name;
@ManyToOne // 🔹 외래키(FK) 매핑
@JoinColumn(name = "team_id")
private Team team;
}
📌 "JPA를 사용하면 DB의 외래키를 객체 관계로 매핑할 수 있다!"
✅ JPA가 ORM을 통해 해결하는 문제점
| 문제 | JPA의 해결 방법 |
| SQL을 직접 작성해야 함 | JPA가 SQL을 자동 생성 |
| DB 테이블 중심 개발 | 객체(Entity) 중심 개발 |
| DB와 코드 불일치 | JPA가 자동 매핑하여 해결 |
| 데이터 변경 시 SQL 수정 필요 | JPA가 변경 감지 후 자동 업데이트 |
📌 "JPA를 사용하면 개발자는 객체(Entity) 중심으로 개발하고, JPA가 자동으로 DB와 매핑을 처리한다!"
🔥 핵심 정리
| 개념 | 설명 |
| 영속성 컨텍스트 | 엔티티(Entity)를 관리하고, DB와 동기화하는 JPA의 핵심 기능 |
| 1차 캐시 | 같은 트랜잭션 내에서는 DB 조회 없이 캐시에서 데이터 제공 |
| 변경 감지 | 객체의 변경 사항을 자동으로 감지하여 UPDATE 실행 |
| 쓰기 지연 | 여러 쿼리를 모아 한 번에 실행 |
| DB vs OOP 불일치 | DB는 객체 저장 불가능하지만, JPA가 ORM을 통해 해결 |
| ORM | 객체와 DB를 자동으로 매핑하는 기술 |
📢 마무리
JPA는 영속성 컨텍스트를 통해 객체(Entity)를 관리하고, ORM을 활용하여 DB와 OOP의 불일치성을 해결합니다.
이제 JPA 덕분에 SQL 없이 객체 중심으로 개발할 수 있으며, 데이터 변경도 자동으로 감지하여 반영됩니다.
https://getinthere.tistory.com/9
스프링부트 with JPA 1강 - 스프링이란!
1. 스프링이란? 스프링은 프레임워크이다. 스프링은 오픈소스이다. 스프링은 IoC 컨테이너를 가진다. 스프링은 DI 를 지원한다. 스프링은 엄청나게 많은 필터를 가지고 있다. 스프링은 엄청나게
getinthere.tistory.com
'스프링(Spring) 및 자바(JAVA)' 카테고리의 다른 글
| 스프링 부트 개념 정리 - 이론08 (0) | 2025.03.09 |
|---|---|
| 스프링 부트 개념 정리 - 이론07 (0) | 2025.03.08 |
| 스프링 부트 개념 정리 - 이론05 (0) | 2025.03.08 |
| 스프링 부트 개념 정리 - 이론04 (1) | 2025.03.07 |
| 스프링 부트 개념 정리 - 이론03 (0) | 2025.03.07 |