Spring Boot - ORM

진경천·2024년 11월 18일

ORM이란?

Object Relational Mappig
어플리케이션 객체와 관계형 데이터 베이스의 데이터를 매핑해주는 도구
Hiberante, JPA 등 존재

  • DB에 프로그래밍 언어의 관점에서 접근
  • 객체간의 관계를 바탕으로 SQL을 자동 생성하여 객체 모델과 관계형 모델간의 불일치를 해결
    • 프로그래밍은 클래스를, DB는 테이블을 이용하는 것에 대한 불일치

장점

  • 직관적인 코드로 데이터 조작 가능
    • 부수적인 코드가 줄어 단순해지고 가독성 향상
  • 재사용 및 유지보수 편리
    • ORM은 독립적으로 작성되어 있어 객체들의 재사용이 가능함
    • 매핑 정보가 명확하기 대문에 ERD에 대한 의존도를 낮춤
  • DBMS에 대한 종속성 감소
    • DBMS 교체를 더욱 적은 리스크로 수행 가능
    • 대부분의 ORM은 DB에 종속적이지 않다
      단, 쿼리를 직접 작성한 경우엔 DBMS에 대한 종속성이 증가함

단점

  • 쿼리의 복잡도가 올라갈 수록 ORM만으로의 구현은 한계가 있음
  • 특정 쿼리는 튜닝이 필요할 수 있음
  • 프로시저가 많은 시스템에서는 ORM의 객체 지향적인 장점을 활용하기 어려움

    프로시저란?
    DB 에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한 것

  • 쿼리문을 하나의 메서드 형식으로 만들고 어떤 동작을 일괄적으로 처리하는 용도

JPA

Java Persistance API

  • Java ORM 기술 표준
  • 인터페이스의 모음으로, Hibernate, EclipseLink, OpenJPA 등으로 구현을 한다.

Spring Data JPA

JPA를 편리하게 사용할 수 있도록 지원하는 라이브러리

  • CRUD 인터페이스 제공
  • Repository 개발 시 인터페이스만 작성하면 실행 시점에 객체를 동적으로 생성하여 주입
  • 데이터 접근 계층 개발 시 인터페이스만 작성하면 된다.

Hibernate에서 자주 사용되는 기능을 보다 쉽게 사용할 수 있도록 구현해준다.

영속성 컨텍스트

Entitiy를 영구히 저장하는 환경을 의미

어플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 역할을 수행한다.

EntitiyManager를 통홰 엔티티를 저장하거나 조회하면 EntityManager는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

서비스에는 하나의 EntityManagerFactory가 존재하며, DB에 접근하는 트랜잭션이 생길 때마다 EntityManager를 생성하여 영속성 컨텍스트에 접근한다.

EntitiyManager: Entity의 생명주기를 관리하는 context

1차 캐시

특정 엔티티를 캐싱하여 동일한 엔티티에 대한 중복 조회를 방지한다.
DB와 불필요한 통신이 감소

쓰기 지연 SQL 저장소

DB에 대한 Write 작업을 즉시 실행하지 않고 일정 시간 후에 일괄 처리
빈번한 쓰기 작업을 하게 되면 context switching이 여러번 발생하며, 쓰기 작업을 일괄처리함으로써 문맥교환에 의해 발생하는 오버헤드를 줄여준다.

Entity 생명주기

비영속(New/Transient)

엔티티 객체를 생성했지만 아직 영속성 컨텍스트에 저장하지 않은 상태

Member member = new Member();

영속(Managed)

  • EntityManager를 통해 엔티리를 영속성 컨텍스트에 저장된 상태
  • 영속성 컨텍스트에 의해 관리되는 상태
EntityManagerFactory emf = Persistence.createEntityManagerFactory();
EntityManager em = emf.createEntityManager();

em.persist(member);	// 객체 저장
em.merge(member);	// 준영속 상태를 영속 상태로 변환

준영속(Detached)

  • 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 더 이상 관리하지 않을 때의 상태
  • 영속성 컨텍스트가 제공하는 기능이 동작하지 않는 상태
em.detach(member);	// 특정 엔티티를 
em.clear();			// 영속성 컨텍스트 초기화
em.close();			// 영속성 컨텍스트 닫기

삭제(Removed)

  • 엔티티가 영속성 컨텍스트와 DB에서 삭제된 상태
    마지막 commit 시점으로 돌아간다.
em.remove(member)
profile
어중이떠중이

0개의 댓글