[스프링 부트 3 백엔드 개발자 되기] 5-1. 데이터베이스와 ORM

2025. 7. 31. 14:45·Backend

Object-Relational Mapping

ORM은 객체 지향 프로그래밍 언어를 사용하여 객체와 데이터베이스를 연결하는 프로그래밍 기법이다. 

데이터베이스를 객체 지향 언어로 쉽게 다루기 위해 고안되었다. 클래스의 메소드를 활용하여 데이터베이스 연결, 데이터 쿼리 조작, 트랜잭션 관리를 할 수 있다. 

쉽게 말해 데이터베이스나 테이블을 객체로 두어 다루겠다는 소리다. 이렇게 다룬다면 코드의 가독성이 훨씬 좋아진다. (예를 들어 객체를 생성하면 자동으로 데이터베이스가 연결되고, 객체에 내장 메소드를 활용해 데이터를 기록할 수 있을 것이다.)

 

장점

  • SQL을 직접 활용하지 않고 사용하는 언어로 데이터베이스를 조작할 수 있다.
  • 객체 지향적으로 코드를 작성할 수 있어 비즈니스 로직과 분리할 수 있다.
  • 데이터베이스 시스템이 추상화 되어 있기 때문에 다른 데이터베이스 시스템으로 마이그레이션이 가능하다.
  • 매핑하는 정보가 명확하기 때문에 ERD에 대한 의존도를 낮출 수 있다.

단점

  • 프로젝트가 커질 수록 사용 난이도도 올라간다.
  • 복잡하고 무거운 쿼리는 ORM으로 해결이 불가능한 경우가 있다.

http://xn--f-lab-og6u.kr/insight/understanding-orm

 

 

JDBC

JDBC는 자바 코드에서 데이터베이스를 연결하고 쿼리하기 위해 고안된 표준 API다. ORM과 직접적이 관련은 없지만 ORM 개념의 구현체인 Hibernate는 JDBC를 활용해 구현된다. 

 

 

 

Java Hibernate

Hibernate는 ORM 개념을 프레임워크로 구현한 것이다. 내부에서 JDBC API를 하위로 사용한다. 하이버네이트의 목표는 자바 객체를 통해 데이터베이스 종류에 상관없이 데이터베이스를 사용할 수 있게 하는데 있다.

JDBC만 사용하면 객체 지향 프로그래밍과 상관없이 자바에서 데이터베이스를 연결할 수 있다. 물론 구현하는데 문제는 없겠지만 객체 지향이 아니기에 코드의 유지보수가 힘들 것이다.

데이터베이스를 자바에서 객체처럼 활용하고자 ORM 개념이 나온 것이고, 이걸 구현한게 Hibernate다. 사실 Hibernate도 단독으로 쓰이지 않고 JPA, Spring Data JPA의 구현체로 활용된다. 

 

https://stackoverflow.com/questions/3500128/what-is-hibernate-in-simple-language

 

What is hibernate in simple language?

I'm a newbie. I keep seeing questions on hibernate on this site. I know how DBMS works and how to make an application talk to it. Help me understand what hibernate is.

stackoverflow.com

https://stackoverflow.com/questions/9881611/whats-the-difference-between-jpa-and-hibernate

 

What's the difference between JPA and Hibernate?

I understand that JPA 2 is a specification and Hibernate is a tool for ORM. Also, I understand that Hibernate has more features than JPA 2. But from a practical point of view, what really is the

stackoverflow.com

 

 

JPA (Java Persistence API)

자바에서 객체와 데이터베이스를 연결하는데 사용하는 표준화된 API이다. Hibernate로 구현되고 JDBC보다 더 높은 추상화를 제공한다. 직접 연결 코드를 작성해야하는 JDBC와는 달리 인터페이스를 이용하면 객체와 데이터베이스를 자동으로 연결해준다.

 

💡 Key Terminologies in JPA

- Entity
- EntityManager
- Persistence Context
- Criteria API
- JPQL (Java Persistence Query Language)
- Persistence Unit

 

JPA에는 두 가지 특징이 있다.

 

1️⃣ 엔티티 매니저

엔티티는 데이터베이스의 테이블과 매핑되는 객체다. 엔티티는 본질적으로 자바 객체다. 대신 데이터베이스에 쿼리를 실행하는 특별한 객체이기에 엔티티라고 따로 부른다.

 

엔티티 매니저는 엔티티를 관리해 데이터베이스와 앱 사이에 객체를 생성, 수정, 삭제하는 역할을 한다. 자바 애플리케이션을 활용해 여러 명이 데이터베이스 접속한다면 사용자에게 각각 엔티티 매니저를 할당해야한다. 엔티티 매니저를 관리하는게 엔티티 매니저 팩토리다. Spring JPA는 엔티티 매니저 팩토리를 관리해 코드 상 엔티티 매니저가 필요한 순간에 매니저를 배치한다.

 

SpringBoot는 빈에 하나의 객체만을 놓는다. 그렇다면 코드 상에서 빈에 있는 객체를 여러 번 동시에 사용하는 경우는 어떻게 대처할까?

Spring JPA에 엔티티 매니저 팩토리가 있고 엔티티 매니저를 여러개 사용해야 하는 상황이라면 어떻게 대처할까?

Spring JPA에 진짜 엔티티 매니저 놓고 코드 상에는 가짜(프록시)를 띄워 놓는다. 사용할 때 진짜 매니저를 호출한다.

 

 

 

2️⃣ 영속성 컨테스트

영속성 컨테스트는 JPA에서 엔티티를 관리하는 가상의 공간이다. 다음과 같은 특징이 있다.

 

  • 1차 캐시

영속성 컨테스트는 내부에 캐시를 가지고 있다. 캐시의 키는 엔티티를 식별할 수 있는 값(@Id 어노테이션으로 지정된 식별자값)이다. 캐시의 값은 엔티티 인스턴스 값이다.

 

 

 

엔티티를 조회할 때 1차 캐시에 값이 있으면 캐시에서 빠르게 가져온다.

 

  • 쓰기 지연

WAS와 데이터베이스는 네트워크 상에서 통신한다. WAS가 엔티티를 자주 호출할 경우 데이터베이스 서버 성능을 저하시킬 수 있다.

이걸 막기 위한 방법이 쓰기 지연이다. 트랜잭션을 커밋하기 전까지 쿼리들을 모아놓았다가 한번에 보낸다.

 

  • 변경 감지

트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티 값과 현재 엔티티 값을 비교해서 변경된 값이 있다면 변경 사항을 감지해 변경된 값을 데이터베이스에 자동으로 반영한다.

 

.find()와 같은 메소드를 통해 자바 애플리케이션에서 데이터베이스를 조회할 때, Spring Data JPA는 자동으로 조회한 데이터베이스의 상태를 스냅샷으로 저장한다. (이때는 데이터베이스가 변경되기 전이다.)

자바 애플리케이션 내부에서 JPA를 이용해 데이터베이스를 변경할 때, JPA는 모든 변경 사항을 확인하고 자동으로 UPDATE 문을 생성해 쓰기 지연 저장소에 추가한다.

사용자는 따로 쿼리를 작성할 필요 없이 자바 애플리케이션 실행을 통해 데이터베이스를 조작하는 것이다. JPA를 사용하면 개발자는 객체 중심의 프로그래밍에 집중할 수 있다. 엔티티(Entity) 객체의 상태를 변경하는 것만으로도, JPA가 트랜잭션 종료 시점에 변경 사항을 감지하고 자동으로 데이터베이스에 반영해 다.

 

 

  • 지연 로딩

쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회한다. 

JPA에서 연관 관계에 있는 엔티티를 실제로 사용하는 시점에 데이터를 로딩하는 방식이다. 데이터베이스를 조회하는 횟수를 줄여 데이터베이스의 성능을 높인다.

 

이 특징들이 갖는 공통점은 모두 데이터베이스의 접근을 최소화해 데이터베이스의 성능을 높이는 것이다.

 

https://www.ibm.com/docs/en/was-liberty/nd?topic=liberty-java-persistence-api-jpa

 

Java Persistence API (JPA)

Data Persistence is a means for an application to persist and retrieve information from a non-volatile storage system. The Java™ Persistence API (JPA) provides a mechanism for managing persistence and object-relational mapping and functions since the EJB

www.ibm.com

https://www.geeksforgeeks.org/java/jpa-introduction/

 

JPA - Introduction - GeeksforGeeks

Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.

www.geeksforgeeks.org

 

 

Spring Data JPA

JPA의 기능을 클래스로 추상화 해 Spring에서 사용할 수 있도록 사용자에게 제공된게 Spring Data다. 이 인터페이스에는 CRUD를 포함한 여러 메서드가 있고 알아서 쿼리를 만들어 준다. 페이지 처리와 자동 쿼리 빌딩 기능 등 많은 기능을 제공한다.

데이터베이스 별로 기능 확장하는 기술도 제공한다. 

 

 

 

🔑 총정리

  1. ORM은 객체와 데이터베이스를 연결하는 프로그래밍 기법이다.
  2. JPA는 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
    • 엔티티는 영속성을 가진 객체이다.
    • 엔티티 매니저는 엔티티를 관리하며 생성, 조회, 수정, 삭제하는 역할을 한다.
    • 엔티티 매니저는 만드는 곳이 엔티티 매니저 팩토리이다.
    • 엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장하는 특징이 있다.
    • 영속성 컨테스트는 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩의 특징을 가지고 있다.
    • 엔티티의 상태는 분리, 관리, 비영속, 삭제 상태로 나뉜다.
  3. 하이버네이트는 JPA의 대표적인 구현체로, 자바 언어를 위한 ORM 프레임워크이다.
  4. 스프링 데이터 JPA는 JPA를 편하게 쓰기 위해 만든 모듈이다.

 

단순 코드로 자바 코드와 데이터베이스를 연결하는 건 JDBC다. 단순 코드로 유지보수가 힘들기 때문에 데이터베이스 테이블과 객체를 연결해 객체 지향 개념을 사용할 수 있게한 개념이 ORM이고 코드로 구현한게 Hibernate다. Hibernate를 API로 만들어 정형화된 틀을 제공한게 JPA다. 이걸 Spring에서 사용하게끔 더 가공한게 Spring Data JPA다.

'Backend' 카테고리의 다른 글

[스프링 부트 3 백엔드 개발자 되기] 6. 블로그 기획 및 API 만들기  (1) 2025.08.26
[스프링 부트 3 백엔드 개발자 되기] 4. 스프링 부트의 구조  (0) 2025.08.18
'Backend' 카테고리의 다른 글
  • [스프링 부트 3 백엔드 개발자 되기] 6. 블로그 기획 및 API 만들기
  • [스프링 부트 3 백엔드 개발자 되기] 4. 스프링 부트의 구조
BestTomaTo
BestTomaTo
  • BestTomaTo
    기록보관소
    BestTomaTo
  • 전체
    오늘
    어제
    • 분류 전체보기 (36) N
      • Algorithm (8)
      • Computer Science (3)
      • Backend (3)
      • DevOps (4)
        • Kubernetes (3)
        • Docker (0)
      • Data Engineering (8)
      • Cloud (2)
      • AI (1)
      • Security (3) N
        • SK Shieldus Rookies (3) N
      • Reference (2)
      • Project (1)
      • Experience (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    해커톤 후기
    SQLD
    홈 서버
    langchain memory
    3단계 모델링
    AWS
    sql 개발자
    airlfow
    동기 프로그래밍
    langsmith
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
BestTomaTo
[스프링 부트 3 백엔드 개발자 되기] 5-1. 데이터베이스와 ORM
상단으로

티스토리툴바