1.1 SQL 중심적인 개발의 문제점
문제점
- 관계형 데이터베이스를 쓰면서 SQL에 의존적인 개발을 피하기 어렵다.
- 패러다임의 불일치
- 객체(속성과 기능을 캡슐화해서 쓰는 게 목표) vs 관계형 데이터베이스(데이터 정교화 및 보관)
객체를 영구 보관하는 다양한 저장소
- RDB - 관계형 데이터베이스
- NoSQL - 비관계형 데이터베이스
- File
- ODB
객체와 관계형 데이터베이스의 차이
- 객체 - RDB
- 상속 - Table 슈퍼타입 서브타입 관계
- 연관 관계: 객체는 참조 사용(ex. get) - 테이블은 외래 키 사용 (pk - fk 조인)
- 객체는 단방향, 테이블은 양방향 조회 가능하다.
- 데이터 타입
- 데이터 식별 방법
1.2 JPA (Java Persistence API)소개
JPA(Java Persiatence API)란?
- Java Persiatence API: 자비 진영의 ORM 기술 표준을 말한다.
- ORM(Object Relational mapping, 객체 관계 매핑)
- 객체는 객체대로 설계하고 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
- ORM 프레임워크가 객체와 관계형 데이터베이스 중간에서 매핑한다.
- 대중적인 언어에는 대부분 ORM 기술이 존재한다.
- ORM(Object Relational mapping, 객체 관계 매핑)
JPA는 표준 명세
- JPA는 인터페이스 모음이다.
- JPA 2.1 표준 명세를 구현한 3가지 구현체: 하이버네이트(Hibernate), EclipseLink, DataNucleus
- JPA를 사용하는 이유는?
- SQL 중심 보다는 객체 중심으로 개발하기 위해서
- 장점: 생산성, 유지보수, 패러다임의 불일치 해결, 성능, 데이터 접근 추상화와 벤더 독립성, 표준
JPA의 성능 최적화 기능
- 1차 캐시와 동일성(Identity) 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환한다.
- 일반적으로 트랜잭션이 시작하고 종료할 때까지 1차 캐시가 유효하다.
- DB isolation level Read commit이어도 애플리케이션에서 Repeatable Read를 보장한다.
- ex) jpa.find()를 두 번 실행하는 경우 SQL을 1번만 실행한다.
- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- 버퍼링 기능을 말한다.
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모은다.
- JDBC BATCH SQL 기능을 사용해서 한 번에 SQL을 전송한다.
<hide/>
transaction.begin(); // 트랜잭션 시작
em.persist(mamberA);
em.persist(mamberB);
em.persist(mamberC); // INSERT SQL 대기 상태
transaction.commit(); // 커밋하는 순간 A, B, C를 몰아서 한번에 보낸다.
- 지연 로딩(Lazy loading)
- 지연 로딩: 객체가 실제 사용될 때 로딩, 지연 로딩의 문제점: 쿼리가 두 번 날아간다.
- 즉시 로딩: JOIN SQL로 한번에 연관된 객체끼리 미리 조회한다. JPA에 있는 옵션을 켜면 멤버와 팀에 대해 미리 저장된 정보를 항상 함께 가져온다.
'Spring Framework > [인프런] Java ORM 표준 프로그래밍 - JPA' 카테고리의 다른 글
Chapter 06. 다양한 연관관계 매핑 (0) | 2022.09.05 |
---|---|
Chapter 05. 연관 관계 매핑 기초 (0) | 2022.09.05 |
Chapter 04. 엔티티 매핑 (entity mapping) (0) | 2022.09.04 |
Chapter 03. 영속성 관리 - 내부 동작 방식 (0) | 2022.09.03 |
Chapter 02. JPA 시작하기 (0) | 2022.09.03 |