JPA : 자바 표준 ORM
- Mybatis, iBatis는 ORM이 아닌 SQL Mapper다.
ORM은 객체를 매핑하는 것이고, SQL Mapper는 쿼리를 매핑한다.
현대의 웹 애플리케이션에선 관계형 데이터베이스가 필수적인 요소이고, 그렇기 때문에 객체를 관계형 데이터베이스에서 관리하는 것이 무엇보다도 중요해졌다.
현업 프로젝트의 대부분이 애플리케이션 코드보다 SQL로 가득차있다.
(관계형 데이터베이스가 SQL만 인식할 수 있기 때문 -> 각 테이블마다 기본적인 CRUD SQL을 매번 생성해야한다.)
ex) User 객체를 테이블로 만들기
insert into user (id, name, ...) values(...);
select * from user where ...;
update user set ... where...;
delete from user where...;
수 십, 수백의 테이블마다 이 테이블의 몇 배나 되는 SQL을 만들고 유지 보수해야만 한다.
패러다임의 불일치
관계형 데이터 베이스는 어떻게 저장할지
에 초점이 맞춰진 기술
객체 지향 프로그래밍은 기능과 속성을 한 곳에서 관리
하는데에 초점이 맞춰진 기술
ex) 객체 지향 프로그래밍에서 부모 객체를 가져오는 방법?
User user = findUser();
Group group = user.getGroup();
user와 group이 부모-자식 관계임을 명확히 알 수 있음
하지만 데이터베이스가 추가되면?
User user = userDao.findUser();
Group group = groupDao.findGroup(user.getGroupId());
user와 group을 각각 따로 조회함.
상속, 1:N등 다양한 객체 모델링을 데이터베이스로는 구현할 수 없다.
이러한 문제점을 해결하기 위해
JPA
가 등장
JPA는 인터페이스로서 자바 표준명세서다. 인터페이스인 JPA를 사용하기 위해서는 구현체가 필요하고 대표적으로는 Hibernate
, Eclipse
, Link
등이 있다. 하지만 Spring에서는 이 구현체들을 직접 다루지는 않고 구현체들을 조금 더 쉽게 사용하고자 추상화시킨 Spring Data JPA
모듈을 이용한다.
Hibernate가 언젠가 수명을 다해서 새로운 JPA 구현체가 대세로 떠오른다면 Spring Data JPA를 사용중이었다면 아주 쉽게 교체가 가능하다. Spring Data JPA는 내부에서 구현체 매핑을 지원하기 때문.
관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함