ORM, JPA, JPQL

Byung Seon Kang·2022년 7월 14일

JPA

목록 보기
1/1

ORM

  • Object Relational Mapping의 약자.
  • 객체 지향 언어를 사용해서 서로 호환되지 않는 타입간의 데이터를 변환
    • RDBMS 객체를 특정언어(java, JS등등)의 객체와 매핑하는 기술
    • 즉, 객체와 테이블간의 패러다임 불일치 문제를 개발자 대신 해결해줌
  • RDBMS를 객체 지향 DB로 가상화 하는 효과가 생김.
  • ORM으로 얻는 것들
    • DB의 추상화 → 특정 DB에 종속된 표현 없어짐. → DB 변경에 유연해진다.
      즉, vendor에 종속적이지 않게 됨.
    • 객체의 이점을 활용: 객체간 참조, type-safety
    • 관심사 분리: DB 동작에 관한 코드 작성의 반복을 최소화하고 비즈니스 로직에 집중
  • 단점
    • 속도가 느려짐. 생 쿼리를 날리는 것들에 비해 문제가 많음.
    • N+1 problem. 복잡한 쿼리를 날리면 생 쿼리를 날리는 것보다 많은 쿼리를 날리는 문제.

JPA

  • Jakarta(Java) Persistence API
  • 자바에서 ORM 기술을 사용해 RDBMS를 다루기 위한 인터페이스 표준 명세

    표준 명세이지 ORM이 아님. 실제 구현체인 ORM framework는 Hibernate, EclipseLink, DataNucleus, OpenJPA, ObjectDB, TopLink Essential이 있다.

  • API + JPQL + metadata(+ Criteria API)
  • 기본적으로 RDBMS의 영속성(persistence)만을 규정
    • JPA 구현체 중에 다른 유형의 데이터베이스 모델을 지원하는 경우가 있으나 원래 JPA 스펙과는 무관.
  • 이름의 변화한 이유
    • 오라클이 Java EE를 이클립스 재단으로 이관시킴 → 상표권 문제 생겨서 이름 변경
    • Spring Boot는 2.2부터 Jakarta EE로 의존성이 변경됨
    • 현재는 JPA 2.2.3으로 패키지명은 아직 javax.persistence.*임
    • JPA 3.0 도입되면 패키지명이 완전히 jakarta.persistence.*로 변경될 전망

*Persistence(영속성)

  • 프로세스가 만든 시스템의 상태가 종료된 후에도 사라지지 않는 특성

    • 시스템의 상태를 비휘발성 스토리지에 저장.
  • 영속성 프레임워크

    • 영속성을 관리하는 부분을 Persistence layer로 추상화하고, 이를 전담하는 프레임워크에 관리 위임.
  • JPA에서 persistence란? 프로세스가 DB로부터 읽거나 DB에 저장한 정보의 특성

    persistence관련 참고자료

    [조대협 대용량 아키텍처]Persistent Layer - RDBMS

  • 전달 과정

    JPA → JDBC API → SQL → DB

JPQL

  • Jakarta(Java) Persistence Query Language
  • 플랫폼으로부터 독립적인 객체 지향 쿼리 언어
  • JPA 표준의 일부로 정의됨
  • entity를 다루는 쿼리 만들 때 사용
    • 즉, 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 쿼리한다. 쉽게말하면 클래스와 필드를 대상으로 쿼리.
    • JPQL은 데이터베이스 테이블을 전혀 알지 못함.
    • JPA는 JPQL을 분석해서 SQL을 만들어 데이터베이스에서 데이터를 조회. ex)
      select m from Member m //JPQL
      
      ---변환---
      SELECT M.ID, M.NAME, M.AGE FROM MEMBER M
  • SQL의 영향을 받아 형식이 매우 유사
    //JPQL
    
    SELECT DISTINCT a
    FROM Athor a
    INNER JOIN  a.books b
    WHERE b.publisher.name = 'XYZ Press'
    AND a.lastName IS NULL;
    //SQL (mySQL)
    
    SELECT DISTINCT a.*
    FROM Athor a
    INNER JOIN book b on b.id = a.book_id
    INNER JOIN publisher p on p.id = b.publisher_id
    WHERE p.name = 'XYZ Press'
    AND a.lastName IS NULL;
  • SQL과 JPQL은 다른 언어
    • 특정 DB에 종속적인 언어(표준 ANSI SQL을 기준으로 만듬)
    • JPQL: 특정 DB에 종속적이지 않음.
  • 하지만 특정 요구사항 없으면 직접 JPQL 쓸일이 없음.
    • JPA 프레임워크 사용하면 알아서 해준다.
profile
왜 필요한지 질문하기

0개의 댓글