[JPA] JPA란?
스프링 입문 과제를 진행하다보니 JPA가 어떤 건지도 알지 못하고 사용했다.
JPA에 대한 내용이 상당히 깊고 내용이 많다고 하지만 기본적으로 JPA가 어떤 역할을 하는지 정도는 알고 스프링 공부를 하고 싶어 JPA에 대해 짧게 나마 정리하고자 한다.
1. JPA 정의
JPA (Java Persistence API) : 자바 ORM 기술에 대한 표준 명세
2. ORM?
ORM(Object-Relational Mapping) : 객체 - 관계 - 매핑
- 객체와 데이터베이스의 관계를 매핑해주는 도구
- 즉, 프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 도구
3. JPA 동작 구조
● 구조
- 자바 어플리케이션과 JDBC 사이에서 동작한다.
● 저장
● 조회
4. JPA 사용 이유
● 패러다임 불일치 해결
자바 스프링 서버와 관계형 데이터 베이스를 함께 사용해 개발을 진행해야 하는데 이는 1가지 문제를 발생시킨다.
바로 패러다임의 불일치이다.
객체지향 모델과 관계형 데이터베이스의 패러다임 불일치가 발생한다. 왜 불일치가 발생할까?
객체 | 릴레이션 | |
밀도 문제 | - 다양한 크기의 객체를 만들 수 있음 - 커스텀한 타입 만들기 쉬움 |
- 테이블 - 기본 데이터 타입 |
서브타입 문제 | - 상속, 다형성 구현 쉬움 | - 상속 없음 - 다형적인 관계 표현 불가 |
식별성 문제 | - 레퍼런스 동일성 - 인스턴스 동일성 |
- 오직 PK |
관계 문제 | - 서로간의 객체 참조를 통해 표현 - 다대다 가능 - 방향성 존재 |
- 다대다 불가능 - 다대다를 맺어주는 테이블로 처리 - 외래키가 있어서 바로 조회 가능 - 방향성 미존재 |
데이터 네비게이션 문제 | - 마음대로 레퍼런스타고 이동 가능 | - 그러한 방식이 비효율적 (매번 join, 그리고 다 가져오면 성능문제 발생) |
이러한 Java 객체와 관계형 데이터베이스의 릴레이션 사이의 패러다임 차이가 존재하기에 이를 해소할 필요가 있다. 이 역할을 해주는 것이 JPA이다.
상속, 연관관계, 객체 그래프 탐색, 비교 등의 패러다임 불일치를 해결해준다.
● 생산성
1. 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전
2. 이를 통해, Query를 작성하고 JDBC API를 통해 직접 실행하고, 쿼리 실행 결과를 담을 객체도 직접 만드는 일련의 지루하고 반복적인 과정을 JPA가 대신 처리
3. 즉, JPA에게 저장할 객체를 전달함으로써 개발자의 생산성을 높임
● 유지보수
1. 단순하게 엔티티에 필드 추가시 등록, 수정, 조회 관련 쿼리를 직접 수정할 필요가 없다. 관련 쿼리를 모두 자동으로 변경 및 적용된다.
● 성능
1. 다양한 성능 최적화 기회 제공
2. 어플리케이션과 데이터베이스 사이에 존재함으로 여러 최적화 시도 가능
// 이부분은 조금 더 찾아볼 필요가 있을 듯하다.
● 데이터 접근 추상화와 벤더 독립성
1. 데이터베이스 기술에 종속되지 않도록 한다.
2. 데이터베이스를 변경하면 JPA에게 다른 데이터베이스를 사용한다고 알려주면 된다.