- 자바 ORM 기술에 대한 표준 명세로, JAVA에서 제공하는 API이다.
- 자바 어플리케이션에서 관계형 데이터 베이스를 사용하는 방식을 정의한 인터페이스. JPA는 말 그대로 인터페이스다.
- ORM이기 때문에 자바 클래스와 DB테이블을 매핑한다. (SQL을 매핑하는건 아니다.)
- ORM을 사용하기 위한 인터페이스를 모아둔 것이며 JPA를 사용하기 위해서는 JPA를 구현한 하이버네이트, 이클립스링크, DataNucleus같은 ORM 프레임워크를 사용해야된다.
동작 순서
1. 서비스
2. 레파지토리
3. 스프링 데이터 JPA
4. 하이버네이트
5. JDBC Basic APIs, DataSource
6. JDBC Driver
7. DataBase
ORM이란 객체와 DB의 테이블이 매핑을 이루는 것.
즉, 객체가 테이블이 되도록 매핑 시켜주는 것.
ORM을 이용하면 SQL Query가 아닌 직관적인 코드로써 데이터를 조작할 수 있다.
쿼리문을 직접 작성하지 않고 메서드 호출만으로도 query가 수행되다 보니 ORM을 사용하면 생산성이 높아진다.
하지만 쿼리문이 복잡해지면 ORM으로 표한하는데 한계가 있고 성능이 raw query에 비해 느리다는 단점이 있기 때문에, JPQL, QueryDSL 등을 사용하거나 한 프로젝트 내에서 Mybatis, JPA를 같이 사용하기도 한다.
Spring Data JPA는 JPA를 쉽게 사용하기 위해 스프링에서 제공하고 있는 프레임워크이다.
추상화 정도는 Spring Data JPA -> Hibernate -> JPA
Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것 사이에는 큰 차이가 없지만.
1. 구현체 교체의 용이성
2. 저장소 교체의 용이성
이라는 이유로 Spring Data JPA를 사용하는것이 더 좋다.
JPA는 애플리케이션과 JDBC 사이에서 동작한다.
개발자가 JPA를 사용하면 JPA내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신하기 때문에 개발자가 직접 JDBC API를 쓰는것이 아님
객체를 저장하고 싶을때 개발자는 JPA에 객체를 넘긴다.
JPA는 첫번째로 엔티티를 분석하고 그 다음으로 insert ~~ 쿼리문을 생성 한 다음 JDBC API를 사용하여 완성된 쿼리문을 DB에 날린다.
개발자는 찾고자 하는 엔티티의 프라이머리 키 값을 JPA에 넘긴다.
JPA에서는
1. JDBC API를 사용하여 쿼리문을 DB에 날린다.
2. DB로부터 결과를 받아온다.
3. 결과를 객체에 모두 매핑한다
쿼리를 JPA가 만들어주기 때문에 객체와 RDB간의 패러다임 불일치를 해결 할 수 있다.
하이버네이트는 JPA구현체의 한 종류이다.
JPA는 DB와 자바 객체를 매핑하기 위한 인터페이스를 제공하고 하이버네이트는 이 인터페이스를 구현한 것이다.
하이버네이드 외에도 EclipseLink, DataNucleus, OpenJPA, TopLink Essentials등이 있다.
하이버네이트가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.
하이버네이트가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있고 개발자가 직접 쿼리문을 작성하지 않을 뿐이다.
HQL이라고 불리는 매우 강력한 쿼리 언어를 포함하고 있다.
HQL은 SQL하고 매우 비슷하고 추가적인 컨벤션을 정의할 수 있다.
HQL은 완전히 객체 지향적이며 이로써 상속, 다형성, 관계 등의 객체지향의 강점을 누릴 수 있다.
HQL은 쿼리 결과로 객체를 반환하며 프로그래머에 의해 생성되고 직접적을로 접근할 수 있다.
HQL은 SQL에서는 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공한다.
HQL은 여러 테이블을 작업할 때 명시적인 join을 요구하지 않는다.
데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성
영속성을 갖지 않으면 데이터는 메모리에서만 존재하게 되고 프로그램이 종료되면 해당 데이터는 모두 사라지게 된다.
그래서 우리는 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여한다.
프로그램의 아키텍처에서 데이터에 영속성을 부여해주는 계층
JDBC를 이용해 직접 구현이 가능하나 보통은 Persistence Framwork를 사용한다.
프레젠테이션 계층 (Presentation layer) - UI 계층 (UI layer) 이라고도 함
애플리케이션 계층 (Application layer) - 서비스 계층 (Service layer) 이라고도 함
비즈니스 논리 계층 (Business logic layer) - 도메인 계층 (Domain layer) 이라고도 함
데이터 접근 계층 (Data access layer) - 영속 계층 (Persistence layer) 이라고도 함
Persistence Framwork는 JDBC프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 DB와 연동되는 시스템을 빠르게 개발할 수 있고 안정적인 구동을 보장한다.
분류를 나누자면 SQL Mapper와 ORM으로 나눈다.