들어가기에 앞서
실제 프로젝트 진행했던 코드 내용은 업로드하지 않았습니다
11. Spring Data JPA 시작 전 지식
(1) ORM (Objected Relational Mapping)
- 객체 지향 언어를 이용, 서로 호한되지 않는 타입 간의 데이터를 변환하는 기술
- 좁은 의미 : DB(RDBMS) 테이블 데이터를 (Java) 객체와 매핑하는 기술
- 효과 : RDBMS를 객체 지향 DB로 가상화
- ORM으로 얻고자 하는 것
- DB의 추상화 : 특정 DB에 종속된 표현(SQL 등)이나 구현이 사라지고 DB 변경에 좀 더 유연해짐
- 객체의 이점 활용 : 객체간 참조, type-safety
- 관심사 분리 : DB 동작에 관한 코드 작성의 반복을 최소화, 비즈니스 로직에 집중
(2) JPA (Jakarta, Java Persistence API)
- 자바에서 ORM 기술을 사용해 RDBMS를 다루기 위한 인터페이스 표준 명세
- API + JPQL + metadata (+Criteria API)
- 기본적으로 관계형 데이터베이스의 영속성(persistence)만을 규정
- JPA 구현체 중 다른 유형의 데이터베이스 모델을 지원하는 경우가 있지만, 원래 JPA 스펙과 무관
- 이름의 변화
- Java Pe~~~ -> Jakarta (상표권 문제)
(3) 영속성(Persistence)
- 프로세스가 만든 시스템의 상태가 종료된 후에도 사라지지 않는 특성
- 구현 방법 : 시스템의 상태를 데이터 저장소에 데이터로 저장
- 사라지는 데이터 - 주기억장치(휘발성 스토리지)에 저장된 데이터
- 프로세스 메모리 안의 데이터 (변수, 상수, 객체, 함수 등)
- 사라지지 않는 데이터 - 보조기억장치(비휘발성 스토리지)에 저장된 데이터
- 하드디스크, SSD에 기록된 데이터 (파일, 데이터베이스 등)
- 영속성 프레임워크 : 영속성을 관리하는 부분을 persistence layer로 추상화하고 이를 전담하는 프레임워크에 관리를 위임
- JPA에서 persistence란 : 프로세스가 DB로부터 읽거나 DB에 저장한 정보의 특성
(4) JPQL (Jakarta, Java Persistence Query Language)
- 플랫폼으로부터 독립적인 객체 지향 쿼리 언어
- JPA 표준의 일부로 정의
- RDBMS의 엔티티(Entity)를 다루는 쿼리를 만드는데 사용
- SQL의 영향을 받아 형식이 매우 유사
- SQL vs JPQL 비교
- JPQL : 객체 간의 관계를 통해 표현
SELECT DISTINCT a
FROM Author a
INNER JOIN a.books b
WHERE b.publisher.name = 'XYZ Press`
AND a.lastName IS NULL
;
SELECT DISTINCT a.*
FROM author 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.last_name IS NULL
;
- SQL과 JPQL은 다른 언어이며 JPA 프레임워크 사용 시 특별한 요구사항이 있지 않는 한 JPQL을 몰라도 됨 (JPQL 직접 사용 시 반드시 필요한 일인지 검토할 것)
(5) SQL Mapper
- MyBatis
- 스프링, 스프링 부트와 연동 지원
- 다양한 프레임워크와 연동 지원 (Freemaker, Velocity, Hazelcast, Redis 등)
- ORM vs MyBatis
- ORM : Java 객체를 DB 테이블과 매핑
- MyBatis : Java 메소드를 SQL 실행 결과와 매핑 (SQL 실행 결과 -> Java Method)
- JDBC Templeate (Spring JDBC)
- 스프링에서 제공하는 JDBC 기반 영속성 프레임워크
- JdbcTemplate : Spring JDBC에서 제공하는 템플릿 클래스. 쿼리 실행과 결과 전달 기능을 제공
- SQL Mapper의 단점
- 프로그램 코드에서 아직 SQL을 완전히 분리하지 못함
- 개발자가 여전히 SQL을 알아야 함
- 프로그램이 특정 DB에 종속된 SQL을 알아야 함 -> 전체 코드가 특정 DB 기술과 결합을 가짐
- XML 관리 필요
- type-safety를 온전히 활용하지 못함 (쿼리 실행 결과는 대체로 Map, ResultSet 구조로 넘어옴)
- 따라서 매핑은 내가 구현해줘야 함
- Map 구조는 어떤 필드(key)가 있음을 보장하지 않음
- 각 데이터의 타입을 보장하지 않음
- 객체 지향적이지 않음
(6) Hibernate vs Spring Data JPA
- Hibernate
- Java 생태계를 대표하는 ORM 프레임워크
- 스프링 부트에서 채택한 메인 ORM 프레임워크
- JPA 표준 스펙을 구현한 JPA Provider
- 다양한 하위 제품들로 나뉨 (Hibernate ORM, Validator, Reactive...)
- Hibernate Query Language (HQL)
- Hibernate가 사용하는 SQL 스타일 비표준 쿼리 언어
- 객체 모델에 초점을 맞춰 설계
- JPQL의 바탕이 됨 (JPQL는 HQL의 subset)
- JPQL은 완벽한 HQL 문장이지만 반대는 성립하지 않음
- Criteria Query
- Type-safety를 제공하는 JPQL의 대안 표현법
- Hibernate Navive SQL Query : 특정 DB에 종속된 SQL도 사용 가능
- 엔티티 클래스로 객체와 테이블 관계 정의
- Spring Data JPA
- 스프링에서 제공하는 JPA 추상화 모듈
- JPA 구현체의 사용을 한 번 더 Repository라는 개념으로 추상화
- JPA 구현체의 사용을 감추고 다양한 지원과 설정 방법을 제공
- JPA 기본 구현체로 Hibernate 사용
- Querydls 지원
- Spring Data JPA를 사용한다면
- JPA, Hibernate를 몰라도 되어야 한다
- EntityManager를 직접 사용하지 않는다
- JPQL을 직접 사용하지 않는다
persist()
, merge()
, close()
를 직접 사용하지 않는다
- 트랜잭션을
getTransation()
, commit()
, rollback()
으로 관리하지 않는다
- 코드가 Hibernate를 직접 사용하고 있다면
- 꼭 필요한 코드인지, Spring Data JPA로 대체가 가능한 일인지 확인
- Hibernate와 직접적인 연관 관계를 가지게 됨
- 추상화의 이점을 포기
(7) H2
- 스프링 부트가 지원하는 가장 세팅하기 편한 인메모리 DB
- 빠르고 오픈소스이며 JDBC API
- 다양한 모드 지원 : embedded, server, in-memory
- 브라우저 콘솔 지원 (h2-console)
- 경량
- 순수 Java로 구현
- Compatibility Mode (각종 DB)