왜 JPA를 사용할까?
Why use JPA(Java Persistence API)?
왜 JPA를 사용하게 됐을까?
객체를 영구 보관하는 다양한 저장소에는 RDB, NoSQL, File, OODBn 등이 있지만 현실적인 대안은 관계형 데이터베이스(RDB)이다.
즉, SQL을 이용해서 객체를 RDB에 저장할 수 밖에 없다. 관계형 DB를 쓰는 상황에서는 SQL에 의존적인 개발을 피하기 어렵다. 하지만 SQL 중심적인 개발에는 여러 문제가 있다.
- 무한 반복, 지루한 코드
- CRUD (INSERT, SELECT, UPDATE, DELETE)을 테이블마다 생성해야 함.
- 객체 지향과 관계형 데이터베이스 간의 패러다임 불일치
- 객체 지향
- 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공
- 추상화, 캡슐화, 정보은닉, 상속, 다형성 등을 잘 사용하자
- 관계형 데이터베이스
- 데이터를 잘 정규화해서 보관하자
패러다임이 불일치하는 두 가지를 매핑하기 떄문에 문제가 생김
- 결국 RDB가 인식할 수 있는 것은 SQL뿐이기 때문 객체를 SQL로 짜야된다.
- 개발자 == SQL매퍼 라고 할만큼 SQL 작업을 너무 많이 하고 있다.
- 객체 지향
- 객체와 관계형 데이터베이스의 차이
- 상속
- 연관관계
- 데이터 타입
- 데이터 식별 방법
- 모델링 과정에서의 문제
- 객체를 테이블에 맞추어 모델링
- 객체 그래프 탐색
- 객체는 자유롭게 객체 그래프(연관 관계가 있는 객체 사이)를 탐색할 수 있어야 된다.
- 그러나 처음 실행하는 SQL에 따라 탐색 범위가 결정되기 때문에 탐색할 수 없음.
⇒ 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수 는 없을까? JPA 도입
JPA(Java Persistent API)
자바 진영의 ORM 기술표준으로 인터페이스의 모음이다. 즉, 실제로 구현된것은 아니고 구현한 클래스와 매핑을 해준다. JPA를 구현한 ORM 프레임워크로는 Hibernate, EclipseLink, DataNucleus가 있다.
ORM(Object-relational mapping)
- Object-realational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
그래서 JPA를 도입해서 얻는 장점?
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 기존: 테이블마다 CRUD 생성
- 유지보수
- 기존: 원래 필드 변경시 모든 SQL 수정
- JPA: 필드만 추가, SQL은 JPA가 처리
- 패러다임의 불일치 해결 (상속, 연관관계, 객체 그래프 탐색)
- 성능
- JPA의 성능 최적화 기능
- 중간 계층이 있는 경우 다음과 같은 방법으로 성능을 개선할 수 있는 방법이 있다.
- 버퍼링(모아놨다가 한번에 보내는) 기능
- 캐싱(미리 데이터 저장) 기능
- JPA도 JDBC API와 DB 사이에 존재하기 때문에 위의 두 기능이 존재한다.
- 1차 캐시와 동일성 보장 - 캐싱 기능
- 트랜 잭션을 지원하는 쓰기 지연 - 버퍼링 기능
- 지연 로딩
- 객체가 실제 사용될 때 로딩하는 기능
- 중간 계층이 있는 경우 다음과 같은 방법으로 성능을 개선할 수 있는 방법이 있다.
- JPA의 성능 최적화 기능
여기까지 JPA를 왜 사용하게 되었는지 알아보았고 다음부터는 JPA에 대해 자세히 알아보자.
참고: JPA
*틀린 부분이 있으면 언제든지 말씀해 주시면 공부해서 수정하겠습니다.