책 스터디 정리/JPA ORM 스터디
[1장] JPA 소개
8시20분
2023. 4. 4. 14:07
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
- 표준