1. JPA 소개
SQL 중심적인 개발의 문제점
애플리케이션 - 객체 지향 언어 (Java, Scala, …)
데이터베이스 - 관계형 DB (Oracle, MySQL, …)
지금 시대는 객체를 관계형 DB에 관리
SQL 중심적인 개발의 문제점
- 무한 반복, 지루한 코드 (CRUD)
- 패러다임의 불일치: 객체 vs 관계형 데이터베이스 - 객체를 SQL로 변환
객체와 관계형 데이터베이스의 차이
- 상속 - Table 슈퍼타입 서브타입 관계
각각의 테이블에 따른 조인 SQL 작성, 각각의 객체 생성… 복잡
- 연관 관계
객체 - 참조 사용, 테이블 - 외래 키 사용 (join)
객체 참조는 한 방향으로만 가능하지만 테이블은 양방향으로 join 가능
객체를 테이블에 맞게 모델링 - 조회 시 매우 복잡
- 객체 그래프 탐색
객체는 자유롭게 객체 그래프를 탐색할 수 있어야 함
처음 실행하는 SQL에 따라 탐색 범위 결정 - 엔티티 신뢰 문제 (논리적으로는 자유롭게 호출 불가)
계층형 아키텍처에서 진정한 의미의 계층 분할이 어렵다.
- 비교하기
식별자가 같아도 SQL을 사용하면 값이 다름
- 데이터 타입
- 데이터 식별 방법
객체답게 모델링 할수록 매핑 작업만 늘어남
→ 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수는 없을까?
→ JPA
JPA 소개
JPA
- Java Persistence API
- 자바 진영의 ORM 기술 표준
ORM
- Object-relational Mapping (객체 관계 매핑)
- 객체는 객체대로 설계, RDB는 RDB대로 설계
- ORM 프레임워크가 중간에서 매핑 - 객체와 RDB의 차이 해결
JPA는 애플리케이션과 JDBC 사이에서 동작
[JAVA 애플리케이션 - JPA - JDBC API - SQL - DB]
SQL 쿼리를 개발자가 만드는 것이 아니라 JPA가 만들어 줌
패러다임 불일치 해결!!
JPA 소개
- EJB(자바 표준) → 하이버네이트(오픈 소스) → JPA(자바 표준)
- JPA는 인터페이스의 모음
- JPA 2.1 표준 명세를 구현한 3가지 구현체 (하이버네이트(대부분 사용), EclipseLink, DataNucleus)
JPA를 왜 사용해야 하는가
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성 - JPA와 CRUD
- 저장: jpa.persist(member)
- 조회: Member member = jpa.find(memberId)
- 수정: member.setName(”변경할 이름”)
- 삭제: jpa.remove(member)
- 유지보수
기존: 필드 변경시 모든 SQL 수정
JPA: 필드만 추가, SQL은 JPA가 처리
- JPA와 패러다임 불일치 해결
상속, 연관 관계, 객체 그래프 탐색, 신뢰할 수 있는 엔티티, 계층, 비교
→ JPA를 통해 자유롭게 사용 가능
- JPA의 성능 최적화 기능
중간 계층 - 버퍼링과 캐싱이 가능
- 1차 캐시와 동일성(Identity) 보장 - 캐싱, 약간의 조회 성능 향상
- 트랜잭션을 지원하는 쓰기 지연 - 버퍼링, JDBC BATCH SQL 기능으로 한번에 SQL 전송
- 지연 로딩과 즉시 로딩
- 지연 로딩: 객체가 실제 사용될 때 로딩
- 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회 (옵션으로 끄고 켜기 가능)
ORM은 객체와 RDB 두 기둥 위에 있는 기술