01. JPA 소개
* 객체와 관계형 데이터베이스 간의 차이를 중간에서 해결해주는 ORM 프레임워크
* JPA를 사용해서 얻은 가장 큰 성과는 애플리케이션을 SQL이 아닌 객체 중심으로 개발하니 생산성과 유지보수가 확연히 좋아졌고 테스트를 작성하기도 편리해졌다.
1.1 SQL을 직접 다룰 때 발생하는 문제점
1.1.1 반복, 반복 그리고 반복
객체를 데이터베이스에 CRUD하려면 너무 많은 SQL과 JDBC API를 코드로 작성해야 한다. 그리고 테이블마다 이런 비슷한 일을 반복해야 한다. 개발하려는 애플리케이션에서 사용하는 데이터베이스 테이블이 100개라면 무수히 많은 SQL을 작성해야 하고 비슷한 일을 100번은 더 반복해야 한다.
1.1.2 SQL에 의존적인 개발
* 진정한 의미의 계층 분할이 어렵다.
* 엔티티를 신뢰할 수 없다.
* SQL에 의존적인 개발을 피하기 어렵다.
1.1.3 JPA와 문제 해결
JPA가 제공하는 CRUD API를 간단히 알아보자.
1) 저장 기능
//등록
em.persist(member);
persist() 메소드는 객체를 데이터 베이스에 저장한다.
2) 조회 기능
String id = "id1";
Member findMember = em.find(Member.class, id);
3) 수정 기능
//수정
member.setAge(20);
4) 연관된 객체 조회
String id = "id1";
Member findMember = em.find(Member.class, id);
Team team = findMember.getTeam(); //연관된 객체 조회
1.2 패러다임의 불일치
객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다. 이것을 객체와 관계형 데이터베이스의 패러다임 불일치 문제라한다. 따라서 객체 구조를 테이블 구조에 저장하는 데는 한계가 있다.
애플리케이션은 자바라는 객체지향 언어로 개발하고 데이터는 관계형 데이터베이스에 저장해야 한다면, 페러다임의 불일치 문제를 개발자가 중간에서 해결해야한다. 문제는 이런 객체와 관계형 데이터베이스 사이의 패러다임 불일치 문제를 해결하는 데 너무 많은 시간과 코드를 소비하는 데 있다.
1.2.1 상속
객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이라는 기능이 없다.
슈퍼타입 서브타입 관계를 사용하면 객체 상속과 가장 유사한 형태로 테이블을 설계할 수 있다.
JDBC API를 사용해서 insert 및 조회하려면 패러다임의 불일치를 해결하기위해 소모돼는 비용이 크다. 만약 해당 객체들을 데이터베이스가 아닌 자바 컬렉션에 보관하면 그냥 켈렉션을 사용하면 됀다.
JPA와 상속
JPA는 상속과 관련된 패러다임의 불일치 문제를 개발자 대신 해결해준다. 개발자는 마치 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 저장하면 된다.
1.2.2 연관관계
객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다. 반면에 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.
객체를 테이블에 맞추어 모델링
Team team = member.getTeam();
특정 회원이 소속된 팀을 조회하는 가장 객체지향적인 방법은 이처럼 참조를 사용하는 것이다.
객체지향 모델링
JPA는 연관관계와 관련된 페러다임의 불일치 문제를 해결해준다.
1.2.3 객체 그래프 탐색
1.JPA를 사용하면 객체 그래프를 마음껏 탐색할 수 있다.
member.getOrder().getOrderItem()
1.2.4 비교
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; // 같다
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장!
(1차 캐시를 사용하기 때문)
1.2.5 정리
JPA는 패러다임의 불일치 문제를 해결해주고 정교한 객체 모델링을 유지하게 도와준다.
1.3 JPA란 무엇인가?
JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이다.
JPA는 애플리케이션과 JDBC 사이에서 동작한다.
그렇다면 ORM이란 무엇일까? ORM(Object-Relational Mapping)은 이름 그대로 객체와 관계형 데이터베이스를 매핑한다는 뜻이다.
ORM 프레임워크가 적절한 INSERT SQL을 생성해서 데이터베이스에 객체를 저장해준다.
JPA를 사용해서 객체를 저장하는 코드는 다음과 같다.
jpa.persist(member);//저장
JPA를 사용해서 객체를 조회하는 코드는 다음과 같다.
Member member = jpa.find(memberId); // 조회
하이버네이트는 거의 대부분의 패러다임 불일치 문제를 해결해주는 성숙한 ORM 프레임워크다.
1.3.1 JPA 소개
JPA는 자바 ORM 기술에 대한 API 표준 명세다.
1.3.2 왜 JPA를 사용해야 하는가?
JPA를 사용해야 하는 이유는 여러 가지다.
* 생산성
-> JPA를 사용하면 다음 코드처럼 자바 컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달하면 된다.
* 유지보수
-> 유지보수해야 하는 코드 수가 줄어든다.
*패러다임의 불일치 해결
-> JPA는 상속, 연관관게, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결해준다.
* 성능
-> JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공한다.
* 데이터 접근 추상화와 벤더 독립성
-> 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다.
*표준
-> JPA는 자바 진영의 ORM 기술 표준이다.