JPA란?

개념 정리

JPA

JPA(Java Persistence API)는 현재 ORM(Object Relational Mapping)의 기술 표준으로, 인터페이스 모음이다. 즉, ORM을 사용하기 위한 인터페이스를 모아둔 것이라 볼 수 있다. ORM에 대한 자바 API 규격이며 Hibernate, OpenJPA 등이 JPA를 구현한 구현체이다. JPA는 특정 구현 기술에 대한 의존도를 줄일 수 있으며, 다른 구현 기술로 쉽게 이동할 수 있다.

  • 생산성

  • 유지보수

  • 패러다임의 불일치 해결

  • 성능

ORM

ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임워크는 객체와 테이블을 매핑하여 패러다임 불일치 문제를 개발자 대신 해결해준다.

ORM 프레임워크는 단순히 SQL을 개발자 대신 생성해서 DB에 전달해주는 것뿐만 아니라 다양한 패러다임의 불일치 문제들도 해결해준다. 그러므로, 객체 측면에서 정교한 모델링을 할 수 있으며, RDB는 데이터베이스에 맞도록 모델링하고, 둘의 매핑 방법만 ORM 프레임워크에 알려주면된다.

Hibernate

JPA를 사용하기 위해서 JPA를 구현한 ORM 프레임워크 중 하나이다**. Hibernate는 JPA 명세의 구현체**로, javax.persistence.EntityManager 와 같은 JPA의 인터페이스를 직접 구현한 라이브러리이다. Hibernate는 기본 CRUD뿐만 아니라 거의 대부분의 패러다임 불일치 문제를 해결해주는 성숙한 ORM 프레임워크이다.

Spring Data JPA

Spring Data JPA는 JPA를 쓰기 편하게 만들어 놓은 모듈로 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다. 이는 JPA를 한단계 추상화 시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어 Bean으로 등록해준다.

Spring Boot 설정

Maven

pom.xml

<!-- jpa  -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Gradle

build.gradle.kts

compileOnly("org.springframework.boot:spring-boot-starter-data-jpa")

application.yml

spring:
  jpa:
    show-sql: true          # sql 쿼리 콘솔 출력
    properties:
      hibernate:
        format_sql: true     # sql 보기좋게 출력 
    generate-ddl: false       # @Entity 어노테이션 기준으로 DDL 작업 방지
    hibernate:
      ddl-auto: validate      # 변경된 스키마가 있는지 확인

다음과 같이 설정하면 기본적으로 h2 database에 jpa를 사용할 준비가 다 되었다.

데이터베이스 Dialect

JPA는 특정 데이터베이스에 종속적이지 않은 기술로, 다른 데이터베이스로 쉽게 교체할 수 있다. 하지만, 각 데이터베이스가 제공하는 SQL문법과 함수가 조금씩 다른 경우가 있다.

SQL표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 Dialect(방언)이라한다.

  • 데이터 타입 : MySQL은 VARCHAR, 오라클은 VARCHAR2

  • 다른 함수명 : 문자열 자르는 함수 SQL 표준 : SUBSTRING(), 오라클 SUBSTR()

  • 페이징 처리 : MySQL LIMIT, 오라클 ROWNUM

특정 데이터베이스에 종속되는 기능을 많이 사용하면, 나중에 다른 데이터베이스로 교체하기 어려우며, 하이버네이트를 포함한 대부분 JPA 구현체들은 이러한 문제를 해결하기 위해 다양한 데이터베이스의 Dialect 클래스를 제공한다.

참조

Last updated