[1장] JPA 소개

 

1-1. SQL을 직접 다룰 때 발생하는 문제점

  • 자바 애플리케이션이 관계형 DB와 통신할 때 JDBC API를 통해 SQL문을 사용한다. 
  • DB와 객체는 서로 다른 구조를 가지고 있어 객체를 DB에 직접 저장하거나, 조회가 불가능해서 개발자가 직접 애플리케이션 코드와 DB 테이블 사이의 변환 작업을 SQL과 JDBC API로 해야한다.
  • 테이블마다 동일하게 DAO 구성 작업을 반복해야한다.

 

1-2. SQL에 의존적인 개발

  • 개발하다 요구사항(스펙)이 변경되면 관련 DAO 로직의 SQL 실행을 확인 후, 수정이 필요하다.
  • SQL에 의존하는 상황에서는 엔티티를 신뢰할 수 없다.
  • 물리적으로는 SQL과 JDBC API를 DAO에 숨겼지만, 논리적으로는 강한 의존 관계를 가지고 있다.
  • 강한 의존 관계로 인해 요구 사항의 변경이 있을 때마다 매번 SQL 및 DAO 코드들을 수정해야한다.

 

2-1. 패러다임의 불일치

  • 객체와 관계형 DB의 패러다임 불일치로 인해 많은 시간과 코드가 소비된다.
  • 객체 vs 관계형 DB
    • 상속
      • 객체는 class 형태의 extends 상속이 가능
      • 테이블은 슈퍼/서브 타입으로 유사하게 설계 가능
    • 연관 관계
      • 객체는 참조를 사용하여 연관 관계를 가짐
      • 테이블은 외래 키를 사용해서 join을 통해 연관 테이블 조회함
    • 객체 그래프 탐색
      • 객체는 객체 그래프 전체를 탐색 가능
      • 테이블의 경우, 처음 실행되는 SQL에 따라 객체 그래프의 범위가 정해짐
      • JPA Lazy Loading(지연 로딩)으로 테이블에서도 객체 그래프 전체 탐색 가능
    • 비교
      • DB는 PK(Primary Key)로 row 구분
      • 객체는 동일성/동등성 비교함
        • 동일성: 객체 인스턴스의 메모리 주소 값을 비교한다.
        • 동등성: equals 메소드로 객체 내부의 값을 비교한다.
      • DAO로 직접 조회 SQL 작성 시 DB의 동일한 row 조회시 서로 다른 객체 인스턴스로 생성
      • JPA는 같은 트랜잭션일 때 같은 객체 조회 보장 
  • 객체 모델과 DB 모델은 서로 지향하는 패러다임이 다름
    • 패러다임 불일치 문제를 해결하려면 코드와 시간 비용이 커짐
    • JPA: 패러다임 불일치 문제 해결 및 객체 모델링이 유지가능하게 도와줌

 

2-2. JPA란 무엇인가?

  • JPA는 Java 진영 ORM 기술 표준이다. (JDBC API를 추상화한 느낌)
  • ORM은 객체와 DB를 매핑하여 개발자 대신 패러다임 불일치 문제 해결

 

2-3. JPA 소개

  • 하이버네이트 기반 자바 ORM 기술 표준
  • 자바 ORM 기술에 대한 API 표준 명세
    • JPA를 구현한 ORM 프레임워크(하이버네이트, DataNucleus) 사용 
  • 특정 구현 기술에 대한 의존도 감소, 다른 기술로 쉽게 이전 가능

 

2-4. 왜 JPA를 사용해야 하는가?

  • 생산성
    • 반복적인 코드, CRUD용 SQL을 직접 작성할 필요가 없다.
    • DB 중심의 설계를 객체 중심 설계로 역전 가능
  • 유지보수
    • 스펙이 변경되면 관련 JDBC API 모두 변경 필요
    • JPA가 대신 처리해줘서 유지보수 코드 수 감소
  • 패러다임 불일치 해결
  • 성능
    • DB와 두 번 통신해야하는 로직을 한번만 조회하고 캐싱을 사용함
    • SQL 힌트를 넣을 수도 있음
  • 데이터 접근 추상화 및 벤더 독립성
    • 서버 애플리케이션과 DB 사이에 추상화된 DAO를 제공해서 특정 DB 기술에 종속되지 않음
    • ex) 로컬 개발은 H2 DB, 상용은 MySQL
  • 표준

'책 스터디 정리 > JPA ORM 스터디' 카테고리의 다른 글

[7장] 고급 매핑  (0) 2023.05.09
[6장] 다양한 연관관계 매핑  (0) 2023.05.02
[5장] 연관관계 매핑 기초  (0) 2023.04.25
[4장] 엔티티 매핑  (0) 2023.04.18
[3장] 영속성 관리  (0) 2023.04.11