TIL_220723_강의용 실습 프로젝트 6

창고·2022년 7월 25일
0

들어가기에 앞서
실제 프로젝트 진행했던 코드 내용은 업로드하지 않았습니다

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
;
  • SQL : 테이블 간의 관계를 통해 표현
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)
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글