JPA(Java Persistence API)
자바 진영의 ORM 기술 표준
ORM?
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재한다.
JPA는 애플리케이션과 JDBC 사이에서 동작한다.
개발자가 직접 JDBC API를 쓰는게 아니라 개발자가 JPA를 사용하면 JPA 내부에서 JDBC API를 사용해 DB와 통신한다.
JPA 저장 과정
예를 들어 MemberDAO에서 데이터를 저장하고 싶다면
- JPA에게 Member 객체를 넘긴다.
- JPA가 Member 객체를 분석한다.
- JPA가 Insert Query를 사용
- JPA가 JDBC API를 사용하여 DB에 보낸다.
JPA 조회 과정
MemberDAO에서 멤버를 찾고싶다면
- JPA에게 멤버의 ID값을 넘긴다.
- JPA가 ID값으로 SQL query를 만든다.
- JDBC API 통해 DB에 보내고 결과를 받는다.
- 결과를 가지고 Member Object에 매핑을 해준다.
JPA는 표준 명세이다. 내부 코드는 거의 인터페이스로 되어있다. JPA 표준 명세를 구현한 3가지가 있는데 하이버네이트, EclipseLink, DataNucleus가 있다.
JPA를 왜 사용해야 할까?
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 유지보수
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준
생산성 - CRUD 만들기가 매우 편하다.
- 저장 : jpa.persist(member)
- 조회 : Member member = jpa.find(memberId)
- 수정 : member.setName("변경할 이름")
- 삭제 : jpa.remove(member)
유지보수 - SQL을 사용하면 필드가 추가, 제거되면 모든 SQL을 수정 해야한다. 그러나 JPA를 사용한다면 필드만 추가하면 JPA가 알아서 해준다.
성능
- 1차 캐시와 동일성 보장
- 트랜잭션을 지원하는 쓰기지연 - Insert
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모아둔다.
하이버 네이트란?
하이버네이트는 자바 환경에서의 ORM이다.
ORM은 객체와 데이터베이스 테이블간에 데이터 타입이나 관계를 자동으로 매핑시켜 해결해준다.
Spring Data JPA란?
JPA를 쓰기 편하게 만들어 놓은 모듈로 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다.
Repository라는 인터페이스를 사용하여 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어 Bean으로 등록해준다.
하이버네이트와 Spring Data JPA의 차이점
하이버네이트는 JPA의 구현체이고 Spring Data JPA는 JPA에 대한 데이터 접근의 추상화라고 할 수 있다.
Spring Data JPA는 항상 하이버네이트와 같은 JPA 구현체가 필요하다.
참고 : 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 (inflearn.com)