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로 할수 있는 일인지 확인한다
- 그 코드는 하이버네이트와 직접적인 연관관계를 가지게 된다
- 추상화의 이점을 포기하게 되는 셈이다.