[Spring Data JPA] JPA(Java Persistence API)란?
반응형

JPA란?

JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준으로 사용되는 인터페이스의 모음이다. 즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임 워크이다.

 

ORM에 대해 잠깐 짚고 넘어가기

ORM(Object-Relational Mapping)은 객체(애플리케이션 Class)와 관계형 DB를 매핑한다는 뜻이다. 기술적으로는 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면 된다.

영속화 : 어떤 데이터를 영구적으로 저장하게 해주는 것

 

ORM 장점

  • SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있다.
    (내부적으로는 쿼리를 생성하여 DB를 조작하지만 개발자가 이를 신경 쓰지 않아도 된다.)
  • Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높인다.
  • 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기때문에 생산성 증가한다.
  • 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리하다.
  • 예를들어 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생기는데 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없다.

 

ORM 단점

  • 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있다.
  • 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있다.
  • 학습비용이 비싸다.

 

JPA의 등장과 개념

기존에 스프링에서 관계형 데이터베이스를 다룰 때, iBatis, MyBatis와 같이 쿼리를 매핑하는 SQL Mapper를 많이 사용했다. 하지만 이러한 기술은 객체 모델링보다 테이블 모델링에만 집중하게 만들고, 객체를 단순히 테이블에 맞추어 데이터를 전달하는 역할만 할 수 있다는 단점이 있었다.

RDB는 데이터를 어떻게 저장할지에 초점이 맞춰진 기술인 반면 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술이다.  하지만 개발자들이 공들여 설계한 자바 클래스도 SQL을 통해서만 RDB에 저장하고 조회할 수 있다.. RDB와 객체지향 프로그래밍 언어의 패러다임이 불일치하는 상황에서 객체를 데이터 베이스에 저장하려고 하니 여러 문제가 발생하였다.

 

SQL을 직접 다룰 때의 문제점

  • 도메인 별로 유사한 CURD 코드를 반복적을 작성해야 한다.
  • SQL이 변경되면 수정할 사항이 많아진다.
  • 자바의 객체와 데이터베이스 테이블이 정확하게 일치하지 않으므로 둘 사이를 매핑하기 위해 많은 SQL 구문과 자바 코드가 필요하다.

-> 이러한 문제의 해결책으로 JPA라는 자바 표준 ORM(Object Relational Mapping) 기술이 등장했다. JPA는 객체지향 프로그래밍 언어와 RDBMS 중간에서 패러다임을 일치 시켜주기 위한 기술이다.

ORM이 일치하지 않는 자바 객체와 테이블 사이를 매핑해줌으로써 Row 정보로 저장하고, 반대로 테이블에 저장된 Row 정보를 자바 객체로 매핑한다. 이 과정에서 사용되는 SQL 구문과 자바 코드는 ORM 프레임워크가 자동으로 만들어 준다.

개발자는 객체지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행한다. 개발자는 객체지향적으로 코드를 표현할 수 있어 더는 SQL에 종속적인 개발을 하지 않아도 된다.

 

물론 단점 또한 존재한다.

- 대표적 단점으로는 러닝커브가 높다.. 장점을 더 극대화 하기 위해서 알아야 할 것이 많다.

- 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다.

- 마찬가지로 잘 이해하고 사용하지 않으면 성능상 문제가 생길 수 있다.

 

JPA 요약

- 현재 자바 진영의 ORM 기술 표준으로 인터페이스의 모음이다. -> 실제로 동작하는 것이 아니다, JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate라고 할 수 있다.

- JPA 표준 명세를 구현한 3가지 구현체 : Hibernate, EclipseLink, DataNucleus

이미지 출처 : https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html

Hibernate
- 자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 성숙한 프레임워크, Open Source SW
- 이러한 Hibernate 기반으로 만들어진 ORM 기술 표준이 바로 JPA다.

 

여기서 알아야 할 것은, 스프링에서 흔히 사용하는 것으로 알려진 JPA는 정확히 JPA를 이용하는 Spring Data JPA 프레임워크이지 JPA는 아니다!

 

Spring Data JPA

JPA를 사용하기 위해서는 구현체가 필요하다. JPA의 대표적인 구현체로 Hibernate, Eclipse Link 등이 있다. Spring에서 JPA를 사용할 때에는 이 구현체들을 직접 다루지 않고 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용해 JPA 기술을 다룬다.

 

이렇게 한 단계 더 감싸놓은 Spring Data JPA가 등장한 이유는 다음과 같다.

  • 구현체 교체의 용이성
  • 저장소 교체의 용이성

 

구현체 교체의 용이성이란 Hibernate의 수명이 다했을 때 다른 구현체로 쉽게 교체하기 위함이다. 다음으로 저장소 교체의 용이성이란 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함이다.  예를 들어 RDBMS에서 MongoDB로 교체가 필요하다면, 개발자는 Spring Data JPA에서 Spring Data MongoDB로 의존성 교체만하면 된다.

 

JPA 동작과정

이미지 출처 : https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html

JPA는 애플리케이션과 JDBC 사이에서 동작한다.

- 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신

- 즉 개발자가 직접 JDBC API를 쓰는 것이 아니다!

 

저장과정

이미지 출처 : https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html

Ex) MemberDAO에서 객체를 저장하고 싶을 때

- 개발자는 JPA에 Member 객체를 넘긴다.

- JPA는 
1. Member Entity 분석
2. INSERT SQL 생성
3. JDBC API를 사용해 SQL을 DB에 전송하기

 

조회과정

이미지 출처 : https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html

Ex) Member 객체를 조회하고 싶을 때

- 개발자는 Member의 pk값을 JPA에 넘긴다.

- JPA는
1. 엔티티 매핑 정보를 바탕으로 적절한 SELECT SQL을 생성
2. JDBC API를 사용하여 SQL을 DB에 전송
3. DB로 부터 결과를 받아오기
4. 결과(ResultSet)를 객체에 모두 매핑하기

-> 쿼리를 JPA가 만들어 주기 때문에 Object와 RDB간의 패러다임 불일치를 해결할 수 있다.

 

 

 

Reference : https://dbjh.tistory.com/77?category=853400, https://velog.io/@jwkim/JPA-JPA%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80, https://scshim.tistory.com/229, https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html

반응형