Springboot와 ORM, JPA

도람·2025년 7월 9일
post-thumbnail

데이터베이스, DBMS

DBMS(Database management system)

: 데이터베이스를 관리하기 위한 SW.

  • DB는 많은 사람들이 공유할 수 있어야 하기 때문에 동시 접근이 가능해야 한다.

  • 또한 많은 요구사항이 있는데 이 요구사항을 만족하면서도 효율적으로 DB를 운영.

    DBMS 종류

    : 관리 특징에 따라 객체-관계형, 도큐먼트형, 비관계형으로 분류한다.

    관계형 DBMS(= relational DBMS): RDBMS라고도 부른다. 테이블 형태로 이루어진 데이터 저장소이다.
    ex) H2, MySQL
    H2: 자바로 작성되어 있는 RDBMS이자 스프링 부트가 지원하는 인메모리 관계형 데이터베이스.
    ( 데이터를 다른 공간에 따로 보관하는 것이 아니라, 애플리케이션 자체 내부에 데이터를 저장한다.
    -> 애플리케이션을 다시 실행하면 데이터는 초기화된다. )

    ID | email      | age
    ----------------------
     1  | a@test.com | 10
    ----------------------
     2  | b@test.com | 20

    도큐먼트형 DBMS : JSON과 유사한 형식의 문서를 저장, 사용할 수 있는 NoSQL데이터베이스 유형.
    AWS 공식문서 : 도큐먼트 데이터베이스란?


ORM

  • ORM(=Object Relational Mapping) : 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법.
    ex) age, name 컬럼에 각각 '20', '스프링'이 들어있다고 하면 보통 SQL을 통해 데이터를 SELECT ......구문 사용.
    -> ORM을 통해 데이터베이스를 객체처럼 사용 ㅇ
    = ORM은 객체와 데이터베이스를 연결해 자바 언어로만 데이터베이스를 다루도록 함.

ORM의 장점과 단점

  • 장점:
    • SQL을 직접 작성 X, 사용하는 언어로 DB 접근 가능.
    • 객체지향적으로 코드 작성 ㅇ -> 비즈니스 로직에만 집중 가능.
    • DB 시스템이 추상화되어 있기 때문에, DBMS를 전환(MySQL -> PostgreSQL)해도 추가적으로 드는 작업이 거의 없다. (데이터베이스 시스템에 대한 종속성이 줄어든다.)
  • 단점:
    • 프로젝트 복잡성이 커질수록 사용 난이도가 올라간다.
    • 복잡하고 무거운 쿼리는 ORM으로 해결 불가능한 경우가 생긴다.

JPA, 하이버네이트

  • ORM에도 여러 종류가 있는데, JAVA에서는 JPA(=java persistencd API)를 표준으로 사용한다.
  • JPA는 자바에서 관게형 데이터베이스를 사요하는 벙식을 정의한 인터페이스.
    (인터페이스이므로, 실제 사용을 위해서는 ORM 프레임워크를 추가적으로 선택할 필요 ㅇ)
    • 대표적으로는 하이버네이트(hibernate)를 주로 사용.
    • 하이버네이트는 JPA 인터페이스를 구현한 구현체이자, 자바용 ORM 프레임워크이다.
    • 내부적으로는 JDBC API 를 사용.
      ( 하이버네이트는 자바객체를 통해 데이터베이스 종류와 관계없이 데이터베이스를 자유롭게 사용하게 해준다.)


엔티티, 엔티티 매니저

엔티티(entity)

  • 데이터베이스의 테이블과 매핑되는 객체를 의미.
  • 본질적으로는 객체기 때문에 일반 객체와 다르지 않지만, DB 테이블과 직접 연결된다는 특징이 있어 구분지어 부른다.

엔티티 매니저(entity manager)

  • 엔티티 매니저는 엔티티를 관리해 DB와 애플리케이션 사이에서 객체를 CRUD 하는 등의 역할을 한다.
    -> 이러한 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리.
    ex) 회원 1과 2, 총 2명이 동시에 회원가입 하는 경우, 회원 1에 가입 처리를 할 엔티티 매니저를 엔티티 매니저 팩토리가 생성하면, 이를 통해 가입처리하여 DB에 회원 정보 저장.
    회원 2도 만찬가지.
    이 과정에서 회원 1, 2를 위해 엔티티매니저는 필요한 시점에 데이터베이스를 연결한 뒤, 쿼리한다.

ex) 스프링부트가 엔티티 매니저를 사용하는 예시

@PersistenceContext
EntityManager em;

스프링부트는 기본적으로 빈을 하나만 생성하여 공유하므로 동시성 문제가 생길 수 있다.
따라서, 실제로는 엔티티 매니저가 아닌, 실제 엔티티 매니저와 연결하는 프록시(가짜) 엔티티 매니저를 사용한다. 필요할때에만 데이터베이스 트랜잭션과 관련된 실제 엔티티 매니저를 호출한다.


해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
신선영, ⌜스프링 부트 3 벡엔드 개발자 되기 - 자바 편⌟, 골든래빗(주), 2023, 384쪽

profile
정도를 걷는 엔지니어

0개의 댓글