JPA(Java Persistence API)
현재 자바진영의 ORM 기술 표준(명세서)으로, 인터페이스의 모음(실제로 동작하는 것이 아님.)
-
Hibernate
JPA를 구현한 프레임워크. 즉, JPA기능을 구현하여 공급해주는 역할
-
Spring Data JPA
하이버네이트 같은 JPA 구현체 위에 추상화 계층을 따로 두어(Repository 인터페이스 제공) 관리하는 프레임워크
-
개발자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
-
기존 JPA는 EntityManager를 주입받아 사용해야 했지만, Repository인터페이스 안에 EntityManager를 주입해서 실제 사용자는 EntityManager를 사용할 필요가 없다.
- ORM(Object-Relational Mapping)
애플리케이션의 Class와 RDB의 테이블을 매핑한다는 뜻. 즉, 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것.
동작과정
- JAVA애플리케이션과 JDBC 사이에서 동작
JAP사용 -> JPA내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 연결.
저장
- MemberDAO객체를 저장하고 싶을 때
JPA의 persist메소드 실행 -> 엔티티 분석 -> INSERT SQL 생성 -> JDBC API를 사용하여 SQL을 DB에 날린다.
조회
- MemberDAO객체를 조회하고 싶을 때
Find(pk)를 실행 -> 엔티티의 매핑 정보를 바탕으로 SELECT SQL 생성 -> JDBCAPI로 SQL을 DB에 넘김 -> DB로부터 결과를 받는다 -> 결과(ResultSel)을 객체에 모두 매핑
장점
- SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음.
(반복적인 CRUD SQL처리. 내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도됨)
- 필드 변경시 모든 SQL을 수정할 필요 없이 필드만 추가해주면 된다.
- 쿼리를 JPA가 만들어 주기 때문에 Object와 RDB 간의 패러다임 불일치를 해결할 수 있다.
(JAVA의 클래스간 상속관계를 표현해준다.(데이터베이스는 객체의 상속관계를 지원X))
- 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기때문에 생산성 증가
- 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리
단점
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있음
- 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있음
- 학습비용이 비쌈
참고
https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html
https://dbjh.tistory.com/77