JPA소개
JPA - Java Persistence API
자바 진영의 ORM 기술 표준
ORM
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어는 대부분 ORM 기술이 존재
JPA는 애플리케이션과 JDBC 사이에서 동작
JPA는 인터페이스의 모음
3가지 구현체 - 하이버네이트, EclipseLink, DataNucleus
JPA를 사용하는 이유
JPA를 사용하면 개발 생산성이 높아진다.
SQL 쿼리를 직접 작성할 필요가 없다.
JAP가 어려운 이유
- 실무에서는 수십 개 이상의 복잡한 객체와 테이블을 사용하기 때문에 힘들다.
- 객체와 테이블을 올바르게 매핑하고 설계하는 방법을 알아야 한다.
- 내부 동작 방식의 이해가 필요하다.
JPA는 왜 사용해야 하는가
SQL 중심적인 개발의 문제점
- 언어는 객체지향 언어를 사용한다.
- 데이터베이스는 대부분 관계형 DB이다.
- 객체를 관계형 DB로 관리하게 된다.
- 코드는 SQL 이다.
- 무한 반복, 지루한 코드
- 객체 CRUD 등록, 조회, 수정, 삭제
- EX) 연락처 컬럼 추가 -> 객체 및 모든 쿼리 수정!!!
- SQL에 의존적인 개발을 피하기 힘들다.
- 페러다임의 불일치
- 객체 VS 관계형 데이터 베이스
객체는 시스템의 복잡성을 제어 할수 있는 다양한 장치로 구성
관계형 데이터베이스는 데이터만 잘 정리해서 보관
- 객체를 영구 보관하는 저장소의 현실적인 대안은 관계형 데이터베이스이다.
- 객체 -> SQL 변환 -> RDB
SQL 변환을 개발자가 한다.
- 객체와 관계형 데이터베이스의 차이
- 상속, 연관관계(get, pk, fk, join 등등), 데이터 타입, 데이터 식별방법
연관관계 객체 member.getTeam() (단방향) , SQL JOIN ON M.TEAM_ID = T.TEAM_ID (양방향)
보통 객체를 테이블에 맞춰서 모델링 한다.
- 엔티티 신뢰 문제
- 모든 객체를 미리 로딩할 수는 없다.
- 객체답게 모델링 할수록 매핑 작업만 늘어난다.
객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수는 없을까? -> JPA
JPA의 장점
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 저장: jpa.persist(member)
- 조회: Member member = jpa.find(memberId)
- 수정: member.setName(“변경할 이름”)
- 삭제: jpa.remove(member)
- 유지보수 필드만 추가
- 패러다임의 불일치 해결
- JPA와 상속
- JPA와 연관관계
- JPA와 객체 그래프 탐색
- JPA와 비교하기
- 신뢰할 수 있는 엔티티, 계층 지연로딩(데이터가 있을때 필요한 시점에 SQL 쿼리를 날려준다)
(데이터가 존재할 경우)
- JPA의 성능 최적화 기능
- 1차 캐시와 동일성(identity)보장
- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- 지연 로딩(Lazy Loading)
옵션으로 컨트롤