요즘 회사에서 Spring boot를 공부하고 있다.
신입이라 모르는게 산더미인데 가장 이해가 가지 않았던건 JPA와 Hibernate를 구분하는 것이였다.
뭐 대충대충~.~ JPA는 표준 명세고 그걸 구현해주는게 하이버네이트야! 라고는 알겠다.
그래서 뭐... 거기서부터 뭐...ㅎㅎㅎ
또한 JPA를 정말 잘 사용한다면 쿼리가 아닌 개발 로직에만 집중 할 수 있다는 사실도 알겠다.
그럼 어떻게 하면 로직에만 집중할 수 있도록 잘 사용할 수 있을까?
라는 생각들로 공부하기로 마음을 먹었다!
1. JPA(Java Persistence API)란?
자바 진영의 ORM 기술 표준이다.
쉽게 이야기하여 인터페이스를 모아둔 것.
따라서 JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 선택해야 한다.
(ORM 프레임워크 종류 : 하이버네이트, EclipseLink, DataNucleus / 하이버네이트가 가장 대중적)
2. JPA를 사용해야 하는 이유
1) 생산성
쿼리를 작성하고 JDBC API를 사용하는 지루하고 반복적인 일은 JPA가 대신 처리해주므로 생산성이 향상된다.
2) 유지보수
SQL을 직접 다룰 경우 엔티티에 필드를 하나만 추가해도 관련된 등록, 수정, 조회 SQL 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야 한다.
하지만 JPA를 사용한다면 이 과정들을 JPA가 처리해주기 때문에 필드를 추가하거나 삭제해도 수정해야 할 코드가 줄어든다.
또한, JPA가 패러다임의 불일치 문제를 해결해주므로 객체지향 언어가 가진 장점들을 활용해서 유연하고 유지보수하기 좋은 도메인 모델을 편리하게 설계할 수 있다.
3) 패러다임 불일치 해결
JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결한다.
4) 성능
예를 들어보면 User users1 = jpa.find()와 User users2 = jpa.find()가 연달아 있다.
만일 JDBC API의 경우였다면 유저를 조회할때마다 SELECT 쿼리를 사용하여 데이터베이스와 두 번 통신하게 된다.
반면에 JPA를 사용한다면 유저를 조회하는 SELECT 쿼리를 한 번만 데이터베이스에 전달하고 두 번째는 조회한 유저1 객체를 재사용하게 된다.
따라서 성능은 향상이 된다.
5) 데이터 접근 추상화와 벤더 독립성
JPA는 위의 사진처럼 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공하여 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다.
이것 또한 예를 들어보자. 로컬 개발 환경은 H2 데이터베이스를 사용하고 개발이나 상용 환경은 오라클이나 MySQL 데이터베이스를 사용할 수 있게 된다.
3. ORM(Object-Relational Mapping)이란?
객체와 관계형 데이터베이스를 매핑한다는 뜻이다.
ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결한다.
예를 들어, 객체를 데이터베이스에 저장할 때 INSERT문을 직접 작성하지 않고 객체를 ORM 프레임워크에 저장하면 된다.
객체 측면에서 정교한 객체 모델링이 가능하고, 관계형 데이터베이스는 데이터베이스에 맞도록 모델링하면 된다.
또한 개발자는 데이터 중심인 관계형 데이터 베이스를 사용해도 객체지향 애플리케이션 개발에 집중할 수 있다.
다양한 ORM 프레임워크가 존재하는데 그중에 하이버네이트 프레임워크가 가장 많이 사용된다.
* 하이버네이트 : 거의 대부분의 패러다임 불일치 문제를 해결해주는 ORM 프레임워크.