[spring-boot3] ORM

yoons(이윤서)·2024년 8월 9일

스프링 부트3 백엔드 개발자 되기 (자바편) 05장 : 데이터베이스 조작이 편해지는 ORM을 공부하고 작성한 내용입니다.
출처: https://wikidocs.net/237210


DBMS

: DataBase Management System
효율적으로 데이터베이스를 관리하고 운영하는 소프트웨어
( MySQL, Oracle )

  • 관계형 DBMS (RDBMS)
    : MySQL, H2 (스프링부트가 지원하는 인메모리 관계형 데이터베이스)

ORM

: Object-relation Mapping

  • 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
  • 자바 코드를 통해 데이터베이스의 값을 객체처럼 사용
  • 복잡하고 무거운 쿼리는 ORM로 해결이 불가능한 경우가 있습니다.

JPA

: Java Persistence API

  • 자바 객체와 데이터베이스를 연결해 데이터를 관리한다.
  • 객체지향 도메인 모델과 데이터베이스의 다리 역할을 한다.
  • ORM의 한 종류로 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
  • 인터페이스이므로 실제 사용을 위해서는 ORM 프레임워크를 추가로 선택해야한다. -> 대표적으로 하이버네이트를 사용한다.

하이버네이트

: hibernate

  • JPA를 구현한 구현체(JPA의 인터페이스를 구현)이자 자바용 ORM 프레임워크
  • 내부적으로 JDBC API를 사용한다.
  • 자바 객체를 통해 데이터베이스 종류에 상관없이 데이터베이스를 자유자재로 사용할 수 있게 한다.


엔티티

: Entity

  • 데이터베이스의 테이블과 매핑되는 객체를 의미.
    본질적으로 자바 객체이므로 일반 객체와 다르지 않다.
  • 하지만 데이터베이스의 테이블과 직접 연결된다는 아주 특별한 특징이 있어 구분지어 부릅니다.

엔티티 매니저

: Entity manager

  • 엔티티를 관리해 데이터베이스와 어플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할을 합니다.
    -> 이런 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리입니다.

✅ 스프링부트에서는 직접 엔티티 매네저 팩토리를 만들어서 관리하지 않고 내부에서 엔티티 매니저 팩토리를 하나만 생성해서 관리하고 @PersistenceContext 또는 @Autowired 애너테이션을 사용해서 엔티티 매니저를 관리한다.

  • 기본적으로 빈을 하나만 생성해서 공유하므로 동시성 문제가 발생할 수 있어 실제 엔티티 매니저와 연결하는 프록시(가짜) 엔티티 매니저를 이용한다.
  • 엔티티 매니저는 Spring Data JPA에서 관리하므로 직접 생성하거나 관리할 필요가 없다.

영속성 컨텍스트

: 엔티티를 관리하는 가상의 공간. 엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장한다.

- 1차 캐시

영속성 컨텍스트는 내부에 1차 캐시를 가지고 있습니다. 이때 캐시의 키는 엔티티의 @Id 애너테이션이 달린 기본키 역할을 하는 식별자이며 값은 엔티티입니다. 엔티티를 조회하면 1차 캐시에서 데이터를 조회하고 값이 있으면 반환합니다. 값이 없으면 데이터베이스에서 조회해 1차 캐시에 저장한 다음 반환합니다. 이를 통해 캐시된 데이터를 조회할 때에는 데이터베이스를 거치치 않아도 되므로 매우 빠르게 데이터를 조회할 수 있습니다

- 쓰기 지연

쓰기 지연transactional write-behind은 트랜잭션을 커밋하기 전까지는 데이터베이스에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 모았던 쿼리를 한번에 실행하는 것을 의미합니다. 예를 들어 데이터 추가 쿼리가 3개라면 영속성 컨텍스트는 트랜잭션을 커밋하는 시점에 3개의 쿼리를 한꺼번에 쿼리를 전송합니다. 이를 통해 적당한 묶음으로 쿼리를 요청할 수 있어 데이터베이스 시스템의 부담을 줄일 수 있습니다.

- 변경 감지

트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 변경 사항을 감지해 변경된 값을 데이터베이스에 자동으로 반영합니다. 이를 통해 쓰기 지연과 마찬가지로 적당한 묶음으로 쿼리를 요청할 수 있고, 데이터베이스 시스템의 부담을 줄일 수 있습니다.

- 지연 로딩

지연 로딩lazy loading은 쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회하는 것을 의미합니다.

⬇️ 이 특징들이 갖는 공통점은 모두 데이터베이스의 접근을 최소화해 성능을 높일 수 있다는 것입니다. 캐시를 하거나, 자주 쓰지 않게 하거나, 변화를 자동 감지해서 미리 준비하거나 한다.


엔티티의 상태

분리 상태 : 영속성 컨테스트가 관리하고 있지 않은 상태
관리 상태 : 영속성 컨테스트가 관리하고 있는 상태
비영속 상태 : 영속성 컨테스트와 전혀 관계가 없는 상태
삭제된 상태 : 삭제된 상태

특정 메서드 호출로 상태 변경 가능.


✅ ORM부터 JPA, 하이버네이트, 스프링 데이터 JPA를 알아보았습니다. ORM은 관계형 데이터베이스와 프로그램 간의 통신 개념, JPA는 자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 기술 명세, 하이버네이트는 JPA의 구현체, 스프링 데이터 JPA는 JPA를 쓰기 편하게 만들어 놓은 모듈입니다.

  1. ORM은 객체와 데이터베이스를 연결하는 프로그래밍 기법입니다.

  2. JPA는 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스입니다.

  • 엔티티는 영속성을 가진 객체를 의미합니다.
  • 엔티티 매니저는 엔티티를 관리하며 조회, 삭제, 수정, 생성하는 역할을 합니다.
  • 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리입니다.
  • 엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장한다는 특징이 있습니다.
  • 엔티티의 상태는 분리, 관리, 비영속, 삭제 상태로 나뉩니다.
  1. 하이버네이트는 JPA의 대표적인 구현체로, 자바 언어를 위한 ORM 프레임워크입니다.

  2. 스프링 데이터 JPA는 JPA를 쓰기 편하게 만들어놓은 모듈입니다.

출처: https://wikidocs.net/237210

profile
개발공부하는 잠만보

0개의 댓글