- SQL에 의존적인 개발을 하게됨
- 패러다임의 불일치
- 객체 지향 --> 필드와 메서드로 객체를 구성해서 사용하는 것에 초점
- 관계형 DB --> 데이터를 잘 정규화해서 저장하는 것에 초점
객체와 관계형 DB의 차이
1. 상속
- 객체
- 저장 : 공통된 특징을 부모로 정의한 후 자식이 상속받아 특징을 가지는 필드 및 메서드 정의
- 조회 :
.
을 통해서 접근해서 바로바로 사용- 관계형 DB
- 저장 : 부모와 자식을 다른 테이블로 저장해야만 한다
- 조회 : 모든 필드가 필요할 때 반드시 JOIN을 써야한다 (객체와 다르게 비용이 든다)
즉, 객체를 효율적으로 설계해도 관계형 DB에 넣게 되면 구조적 차이 때문에
추가적인 반복된 과정이 많이 필요
2. 연관관계
- 객체
: 일방적인 방향으로 접근이 가능하다 (단방향)- 관계형 DB
: key를 통해서 양방향으로 접근이 가능하다 (양방향)
[ 정리 ]
- 객체다운 모델링을 할 수록 SQL 매핑 작업만 늘어난다
ex) 매우 빈번한 JOIN의 발생- 결과적으로 SQL매핑 작업에 의한 시간이 많이 소요되는 큰 단점이 존재
- 이러한 구조적 차이를 극복하기 위해
Java의 Collection
에 저장하듯 하기 위한 결과물이 바로JPA
[ 정의 ]
- Java Persistence API
- 자바 진영의 ORM 기술의 표준
ORM
?
- Object-Relational Mapping
- 객체는 객체대로 설계 / RDB는 RDB대로 설계하게 도와주는 역할
- ORM 프레임워크가 중간에서 역할을 수행함
[ 배경 ]
- 과거에도 EJB라는 ORM방식의 Java 표준이 있었다.
하지만, 기술의 완성도가 낮고 비효율적- 그래서,
개빈 킹
이라는 개발자가 직접 ORM을 만든 것이 바로Hibernate
Hibernate
를 오픈소스로 많이 개발되고, 사용되다 보니 Java에서개빈 킹
을 데리고 가서Hibernate
와 매우 흡사하게 만든 java 표준이 바로JPA
- JPA는 사실 표준으로써 내용은 수많은 인터페이스로 구성되어 있음
즉, 구현하는 구현체가 필요하고 현재 대중적으로Hibernate
를 사용한다
[ JPA 동작 원리 ]
- 우리가 개발하는
JAVA 애플리케이션
과JDBC API
사이에서 우리대신SQL Mapping
과정을 수행- 개발자가 더이상
SQL Mapping
에 시간을 낭비하지 않아도 된다
1) 생상성 향상
- CRUD과정이 매우 간단하게 해결된다
2) 유지보수
- 갑자기 DB에 column이 추가되어도 쿼리를 직접 수정할 일이 없음
- SQL을 작성하지 않기 때문에 유지보수가 편해진다
3) 패러다임의 불일치 해결
- 우리는
find()
를 통해 자식객체의 타입을 명시해주기만 하면 된다
--> JPA는 내부적으로 JOIN을 거쳐서 알아서 처리해줌!
persist()
를 통해 저장하는 하나의 쿼리를 사용
--> JPA가 내부적으로 연관된 하위 객체까지 모두 생성해준다
1) 1차 캐시와 동일 성 보장
- 같은
Transaction
에서는 같은 객체를 조회할 때 캐시처럼 동작
--> 반드시 같은 Entity 반환을 보장 & 조회 성능 향상
2) 트랜잭션을 지원하는 쓰기 지연
- 특징이 비슷한 쿼리들을 모아서 한번에 처리 (Batch 방식)
--> 네트워크를 여러번 통신할 일을 한 번으로 줄일 수 있음
3) 지연로딩 & 즉시로딩
- 지연로딩
: 참조된 객체를 실제 사용되는 시점에서 조회하는 방법
(참조된 객체의 사용이 적을 때 효율적)- 즉시로딩
: 참조된 객체를 최초 조회시 함께 조회하는 방법
(참조된 객체의 사용이 많을 때 효율적)