스프링(Spring) 및 자바(JAVA)

스프링 부트 개념 정리 - 이론06

Dev.99_tale 2025. 3. 8. 17:19

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