jpa

ORM과 JPA 개념정리

malangcow 2022. 8. 15.

ORM (Object Relation Mapping)란 무엇일까?

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해 주는 것을 말한다.
  • database와 OOP를 둘 다 잘 알고 있어야 한다.

기존 database SQL을 직접 다룰 때의 문제점

  • 코드의 반복이 발생함, 예를들어 insert into(...) ... 계속 반복
  • SQL에 의존적인 개발을 하게됨.
    • 로직을 쿼리로 처리하게 되는 경우가 생김.
      • 쿼리가 길어지면 가독성도 떨어지고 무엇보다 테스트를 하려면 쿼리를 날려야한다..
    • 유지보수성 - 테이블에 변경이 있다면, 연관된 모든 쿼리를 변경해줘야 함.
  • 특정 db벤더사에 의존하게 됨.
    • DB종류마다 약간 씩 문법도 다른 경우가 존재.
    • 중간에 DB를 바꾸게되면 골치아픔.

ORM과 RDB의 차이

  ORM RDB
데이터(엔티티) 객체 ( class ) 테이블
연관관계 속성 ( 관계매핑) FK, join key

ORM의 장점

  • 객체지향적이기 때문에 비즈니스로직 및 코드에 집중할 수 있다.
  • Boilerplate code가 줄어든다.
  • 코드의 재사용과 유지보수성이 좋아진다.
  • DBMS의 종속성이 줄어든다.

ORM의 단점

  • N+1문제 등 해결해야될 문제들이 존재한다.
  • 생성되는 쿼리 속도 등의 문제
  • 설계가 잘못되면 일관성이 무너지거나 성능 저하 문제 발생 함.

이정도면 ORM을 사용할 이유는 충분한 것 같다. 

 

JPA - Java Persistence API

  • JAVA의 ORM 표준 인터페이스
  • Application과 JDCB 사이에서 동작한다.

ORM과 JPA 개념정리 - ORM의 단점

JPA의 구현체 종류

  1. Hibernate
  2. Spring Data JPA  ->  JPA를 한단계 추상화시킨 Repository interface 제공

영속성 컨텍스트란? (Persistence context)

  • 엔티티를 영구 저장하는 환경으로, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 논리적인 개념이다.  EntityManager를 통해서 영속성 컨텍스트에 접근한다.
  • 엔티티매니저의 persist() 메소드를 사용하면 엔티티를 영속성 컨텍스트에 엔티티를 저장할 수 있다.
  • 하나의 엔티티매니저가 하나의 영속성 컨텍스트를 생성 및 접근할 수도 있고,
    여러 매니저가 하나의 영속성컨텍스트를 공유할수도 있다.
  • 엔티티를 식별자값(@Id, PK)으로 구분하기 때문에 식별자값이 반드시 필요 하다.

영속성 컨텍스트 사용의 이점

  • 1차 캐시 역할을 해준다. -> find 메소드를 사용하면 1차적으로 캐시에서 찾아보고 없을 시 DB를 조회한다.
  • 엔티티를 캐시에서 가져오기 때문에 동일성 보장할 수 있고, 그렇기에 == 연산자로 엔티티를 비교할 수 있음.
  • 트랜잭션을 지원하는 쓰기지연 :  커밋 전까지 엔티티를 저장하지 않고 내부 쿼리저장소에 insert sql을 저장해뒀다가 커밋할때 한번에 반영한다. ->  I/O가 줄어 효율적인 프로그래밍이 가능
  • 변경감지 기능 -> JPA는 영속성 컨텍스트에 보관할 때, 스냅샷을 함께 보관하고 플러쉬 시점에서 스냅샷과 비교해 수정된 부분을 DB에 반영한다.
  • 지연로딩 (Laye loading) -> 데이터가 실제로 사용되는 순간에 쿼리를 날려 가져올 수 있다. 효율적인 프로그래밍 가능.

엔티티의 생명주기

  • jpa 엔티티는 기본적으로 entityManger가 관리하고 다양한 메소드가 존재한다. 
  • 비영속(new/transient) : 영속성 컨텍스트와 관계가 없는 상태
  • 영속 (managed) : 영속성 컨텍스트에 저장된 상태
    • persist()가 사용됐거나, DB에서 가져와 1차 캐시에 저장된 상태
  • 준영속 (detached) : 영속성 컨텍스트에 저장됐다가 분리된 상태, 더이상 JPA에서 관리되지 않음.
    • entityManger.detach()로 특정 엔티티만 분리시킬 수 있고, merge()로 다시 영속시킬 수 있다.
    • entityManger.clear()로 영속성 컨텍스트를 초기화하거나 em.close()로 닫아도 준영속 상태로 만들 수 있다.
  • 삭제 (removed) : 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한 상태

ORM과 JPA 개념정리 - ORM의 단점 - 엔티티의 생명주기

Entity manager

  • DB에 엑세스하는 역할을 담당. 말 그대로 엔티티 관리자
  • thread safe하지 않아 thread 사이 공유를 하면 안된다.
  • Entity manger factory로 생성한다. 
    • Entity manger factory는 스프링 설정정보를 읽어와 DB커넥션 풀도 생성하므로 생성비용이 크다.
    • 애플리케이션 전체에서 한번만 생성하고 공유해서 사용해야한다. Thread safe 하다.
    • spring boot에서는 Entity manger factory를 직접 제공해준다.

 

 

'jpa' 카테고리의 다른 글

Jpa 연관관계 정리  (0) 2022.08.22

댓글