2022/03/06 Spring Data JPA

김석진·2022년 3월 6일
0

JPA 기본기

ORM,JPA,JPQL 개요

ORM(Object Relational Mapping)

객체 지향 언어를 이용하며, 서로 호환되지 않는 타입 간의 데이터를 변환하는 기술

  • 좁은 의미: DB(RDBMS) 테이블 데이터를 (자바)객체와 매핑하는 기술
  • 효과: RDBMS를 객체 지향 DB로 가상화하는 것
  • ORM으로 얻고자 하는 것
    • DB의 추상화: 특정 DB에 종속된 표현(ex:SQL)이나 구현이 사라지고, DB변경에 좀 더 유연해짐
    • 객체의 이점을 활용: 객체간 참조, type-safety
    • 관심사 분리 : DB동작에 관한 코드 작성의 반복을 최소화하고 비지니스 로직에 집중

JPA

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

  • API+JPQL+metadata(+Criteria API)
  • 기본적으로 관계형 데이터베이스의 영속성(persistence)만을 규정
    • JPA 구현체 중에 다른 유형의 데이터베이스 모델을 지원하는 경우가 있지만, 원래 JPA스펙과는 무관
  • 이름의 변화
    • Java Persistence API -> Jakarta Persistence API
    • 17년 9월, 오라클이 Java EE를 이클립스 재단으로 이관 -> 상표권 문제로 이름을 변경
    • Spring Boot :2.2부터 Jakarta EE로 의존성이 변경됨

JPA:Persistence

PErsistence(영속성)

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

  • 구현방법: 시스템의 상태를 데이터 저장소에 데이터로 저장한다
  • 사라지는 데이터 -주기억장치(휘발성 스토리지)에 저장된 데이터
    • 프로세스 메모리 안의 데이터(변수,상수,객체,함수 등)
  • 사라지지 않는 데이터- 보조기억장치(비휘발성 스토리지)에 저장된 데이터
    • 하드디스크, SSD 에 기록된 데이터(파일,데이터베이스 등)
  • 영속성 프레임워크:영속성을 관리하는 부분을 persistence layer로 추상화하고, 이를 전담하는 프레임워크에게 관리를 위임
  • JPA에서 persistence란: 프로세스가 DB로부터 읽거나 DB에 저장한 정보의 특성

JPQL(Jakarta(Java) Persistence Query Language))

플랫폼으로부터 독립적인 객체 지향 쿼리 언어

  • JPA 표준의 일부로 정의됨
  • RDBMS의 엔티티(Entity)를 다루는 쿼리를 만드는데 사용
  • SQL의 영향을 받아서 형식이 매우 유사
  • SQL과 JPQL은 다른 언어이다
    • SQL: 표준 ANSI SQL을 기준으로 만든, 특정 DB에 종속적인 언어
    • JPQL: 특정 DB에 종속적인 언어가 아님
  • JPA 프레임워크를 사용한다면
    • 특별한 요구사항이 있지 않은 한 JPQL을 몰라도됨
    • JPQL을 직접 사용하고 있다면, 반드시 필요했던 일인지 검토하기

기존의 기술들-iBATIS,MyBatis,JdbcTemplate

SQL Mapper

RDBMS 쿼리문의 실행 결과를 자바 코드에 매핑하는 프레임워크

  • JDBC API를 사용
  • persistence framework의 일종
  • 프로그램 코드와 SQL를 분리

Apache iBATIS

SQL 데이터베이스와 객체 간 매핑을 지원해주는 persistence framework

  • 지원언어: Java,.NET,Ruby
  • SQL문을 별도의 XML문서로 작성하여 프로그램 코드와 분리한 형식
  • 01년 Clinton Begin이 개발
  • 04년 iBATIS 2.0릴리즈-아파치 소프트웨어 재단에 기증, 아파치에서 6년간 운영됨
  • 10년 iBATIS 3.0릴리즈- MyBatis로 개발 프로젝트 이동, 아파치 애틱(Attic)프로젝트로 분류됨(그 소프트웨어 수명이 다 됐음을 의미)
  • DAO 패턴이 발전하던 시기
    • Data Access Object 패턴: 애플리케이션 비지니스 레이어와 영속성 레이어를 추상화된 API를 이용하여 분리
    • DB 접근 구현 클래스를 ~~~Dao라고 네이밍하는 관례가 많았던 시기

예제코드

MyBatis

  • iBATIS 3.0에서 출발한 persistence framework
  • 아직 쌩쌩히 살아있는 프로젝트
  • 스프링, 스프링 부트와 연동을 지원
    • 스프링:org.mybatis:mybatis-spring
    • 스프링 부트:org.mybatis.spring.boot:mybatis-spring-boot-starter
  • 다양한 프레임워크와 연동을 지원
    • Freemarker,Velocity,Hazelcast,Memcached,Redis,Ignite,Guice
  • ORM vs MyBatis
    • ORM: 자바 객체를 DB테이블과 매핑
    • MyBatis:자바 메소드를 SQL 실행 결과와 매핑

    예제코드


MyBatis vs iBatis 사소한팁

쿼리 실행 결과

JdbcTemplate

JDBC API(Spring JDBC)

스프링에서 제공하는 jdbc 기반 persistence framework

  • spring-boot-starter-jdbc(spring-boot-starter-data-jdbc랑 다름)
  • JdbcTemplate:Spring JDBC에서 제공하는 템플릿 클래스. 쿼리실행과 결과 전달 기능을 제공

Hibernate vs Spring Data JPA

Hibernate

  • 자바생태계를 대표하는 ORM framework
  • 스프링 부트에서 채택한 메인 ORM framework
  • JPA 표준 스펙을 구현한 JPA Provider
  • 고성능,확장성,안정성을 표방
  • 다양한 하위 제품들로 나뉨
    • Hibernate ORM
    • Hibernate Validator
    • Hibernate Reactive

Hibernate Query Language(HQL)

하이버네이트가 사용하는 SQL 스타일 비표준 쿼리 언어

  • 객체 모델에 초점을 맞춰 설계됨
  • JPQL의 바탕이됨(JPQL은 HQL의 subset)
    • JPQL은 완변한 HQL이지만,반대로는 성립하지 않음

Criteria Query

type-safety를 제공하는 JPQL의 대안 표현법

Native SQL Query

특정 DB에 종속된 SQL도 사용가능

예제

설정파일은 META-INF/persistence.xml로 작성

Entity Class

엔티티 클래스로 객체와 테이블 관계를 정의

Spring Data JPA

스프링에서 제공하는 JPA 추상화 모듈

  • JPA 구현체의 사용을 한번 더 , Repository라는 개념으로 추상화
  • JPA 구현체의 사용을 감추고, 다양한 지원과 설정 방법을 제공
  • JPA 기본 구현체로 Hibernate 사용
  • Querydsl 지원

Spring Data JPA 사용하면서 알아야 할 사실

JPA,하이버네이트를 몰라도 되어야 한다

  • EntityManager를 직접 사용하지 않음
  • JPQL을 직접 사용하지 않음
  • persist(),merge(),close()를 직접 사용하지 않음
  • 트랜잭션을 getTransaction(),commit(),rollback()으로 관리하지 않음
  • 코드가 하이버네이트를 직접 사용하고 있다면
    • 꼭 필요한 코드인지, 아니면 Spring Data JPA로 할수 있는 일인지 확인한다
    • 그 코드는 하이버네이트와 직접적인 연관관계를 가지게 된다
    • 추상화의 이점을 포기하게 되는 셈이다.
profile
주니어 개발자 되고싶어요

0개의 댓글