- JPA의 등장 배경에 대해 파악한다.
- SQL 중심 개발의 문제점
- JPA의 개념을 이해한다.
- JPA의 효과를 파악한다.
요즘 우리가 사용하는 수많은 서비스의 뒷편에는 엄청난 양의 데이터가 움직인다.
서비스의 입장에서 우리는 객체이자, 객체를 생성하는 주체이다.
그렇다, 지금 시대는 객체를 Database에 저장하고 관리한다.
이제 우리가 개발자가 되어보자. 서비스를 관리하기 위해서는 Database를 조작할 줄 알아야한다. 이를 위해 반드시 알아야하는 것은? 바로 SQL이다.
우리는 객체를 SQL로 변환하여 DB에 저장하기도, 가져오기도 해야한다.
즉, 개발자는 SQL mapper가 되어야한다.
객체와 RDB(관계형 데이터베이스)의 차이
그런데 문제가 발생한다. 객체와 DB의 패러다임 차이이다.
- 객체는 상속이 가능하나, DB는 상속 개념이 존재하지 않는다.
왼쪽은 객체 상속 관계를, 오른쪽은 DB의 테이블 구조를 나타낸다.
이러한 관계를 가진 객체와 DB는 연관관계를 어떻게 인식할까?
이와 같이, 객체는 상속을 통해 Member가 Team과 연관이 있음을 직접적으로 표현할 수 있다. 그러나 DB는 Foreign Key를 사용하여 두 테이블을 Join해야만 값을 찾아올 수 있다.
이러한 차이로 인해, 상속 관계가 복잡해지고 테이블이 늘어날수록 개발자가 손봐야할 SQL은 감당할 수 없을정도로 많아진다.
이런 문제점이 반복되자 "객체를 자바 Collection에 저장하듯이 DB에 저장할 수는 없을까?"에 대한 해답으로 나온 것이 바로 ❗️JPA❗️이다.
- Java Persistence API로서, 자바 진영의 ORM 기술의 표준이다.
- JPA는 application과 JDBC 사이에서 동작한다.
- JPA 동작하여 객체를 저장할 때 JPA의 역할
- Entity 분석
- INSERT SQL 생성
- JDBC API 사용
- 패러다임 불일치 해결
- JPA 동작하여 객체를 조회할 때 JPA의 역할
- SELECT SQL 생성
- JDBC API 사용
- ResultSet Mapping
- 패러다임 불일치 해결
ORM이란?
- Object - Relational Mapping의 약자이다.
- 패러다임의 차이를 무시하고 객체는 객체대로, RDB는 RDB대로 설계한다.
그리고 ORM 프레임워크가 객체와 RDB를 Mapping 해준다.
JPA를 사용함으로서 아래와같은 효과를 볼 수 있다.
1. SQL 중심 개발에서 객체 중심 개발을 가능하게 한다.
위에서 설명한 패러다임의 불일치를 해결하고 Mapping해줌으로써 얻는 효과이다.
2. 생산성
아래와같이 Colletion에 저장하듯 한 줄의 코드만으로 CRUD가 가능하다.
3. 유지보수
JPA가 없다면, 객체의 필드가 변경되면 모든 SQL을 수정해야한다.
그러나 JPA를 통해 객체에 필드만 추가함으로써 SQL을 JPA가 처리한다.
4. 성능
아래에서 살펴보자.
1차 캐시와 동일성을 보장한다.
같은 transaction 안에서는 같은 entity임을 보장하여 조회 성능이 향상된다.
Transaction을 지원하는 쓰기 지연
transaction을 commit할 때까지 SQL query를 모아뒀다가 한 번에 전송한다. 삽입, 수정, 삭제 모두에 해당한다.
지연 로딩, 즉시 로딩
- 지연 로딩 : 객체가 실제 사용될 때 로딩한다.
- 즉시 로딩 : JOIN SQL로 연관된 객체까지 미리 조회한다.
- 위 두 기능을 적절히 사용함으로써 성능을 향상시킬 수 있다.
ex) A를 조회할 때 대체로 B도 같이 조회한다면, 설정을 통해 즉시로딩으로 전환하여 사용할 수 있다.