Back-End/Spring JPA

[Spring] JPA 란? (JPA의 탄생 이유와 개념, 장단점) (+ ORM이란 / ORM의 개념)

koh1018 2022. 12. 14. 22:46
반응형

기존의 문제점

현대의 웹 어플리케이션에서는 대부분 관계형 데이터베이스(RDB)가 쓰인다. (ex. Oracle, MySQL...)

그러다 보니 객체를 관계형 데이터베이스에서 관리하는 것은 무척 중요해졌다.

 

문제는 코드의 대부분이 어플리케이션 코드보다 SQL로 가득차게 됐다는 것이다.

이는 관계형 데이터베이스가 SQL만 인식할 수 있었기 때문이었다.

이에 각 테이블마다 기본적인 CRUD SQL을 매번 생성해야 했다.

 

이런 문제로 인해 자바 클래스를 아무리 잘 설계한다해도 결국은 SQL을 통해야만 저장, 조회가 가능했고 반복적인 SQL들이 늘어났다.

규모가 커질수록 테이블은 늘어났고 테이블의 몇 배가 되는 SQl은 만드는 것 뿐만 아니라 유지 보수도 굉장히 어려웠다.

또한 패러다임 불일치 문제도 있었는데, 이는 관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임이 서로 다른데 객체를 데이터베이스에 저장하려고 할 때 발생하는 문제를 말한다.

  • 관계형 데이터베이스 : 어떻게 데이터를 저장할지에 초점이 맞춰진 기술
  • 객체지향 프로그래밍 언어 : 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술

둘은 사상부터 다른 시작점에서 출발했기에 이는 어쩔 수 없는 문제였다.

 

 

그리고 이러한 문제를 해결하기 위해 JPA가 등장한다.

 

 

 


 

 

ORM (Object-Relational Mapping)

JPA에 앞서 ORM에 대해 간단히 알아보겠다.

ORM은 어플리케이션 Class와 관계형 데이터베이스의 테이블을 매핑(연결)한다는 의미이며, 기술적으로는 어플리케이션의 객체를 관계형 데이터베이스 테이블에 자동으로 영속화(Persistence) 해주는 것이다.

 

장점

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

단점

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

 

 

Spring Data JPA

앞서 본 서로 지향하는 바가 다른 관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임을 중간에서 일치시켜주는 기술이 등장했고 그것이 바로 JPA(Java Persistence API)다.

JPA가 객체지향 프로그래밍을 관계형 데이터베이스에 맞게 SQL을 대신 생성해 실행해줌으로써 개발자는 객체지향적 프로그래밍에 집중할 수 있게 되었다.

덕분에 유지보수가 편해졌으며 생산성 또한 향상되었다.

 

 

착각할 수 있는 것이 있는데, JPA는 구현체가 아닌 인터페이스이다.

Java 진영에서 ORM 기술 표준으로 사용하는 인터페이스 모음이다.

즉, 자바 표준명세서이며 이 JPA를 사용하기 위해서는 구현체가 따로 필요하다.

대표적으로 Hibernate, Eclipse Link등이 있다.

 

Spring에서는 이 구현체들을 직접 다루지 않으며 이 구현체들을 조금 더 쉽게 사용할 수 있게 추상화시킨 Spring Data JPA라는 모듈을 사용한다.

즉, JPA ← Hibernate ← Spring Data JPA 관계이다.

 

사실 Hibernate와 Spring Data JPA를 쓰는 것에는 큰 차이가 없지만 Spring Data JPA를 쓰는 것에는 다음과 같은 이유가 있는데,

첫 번째로 Hibernate 외에 다른 구현체로 쉽게 교체하기 위함이다. Spring Data JPA를 쓰고 있다면 Hibernate가 수명을 다하더라도 새로운 JPA 구현체로 교체할 수 있다.

두 번째로 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함이다. 서버에 트래픽이 많아져 관계형 데이터베이스로는 도저히 감당이 안될 수 있는데, 이때 MongoDB로 교체가 필요하다면 개발자는 Spring Data JPA에서 Spring Data MongoDB로 의존성만 교체하면 된다. 이는 Spring Data의 하위 프로젝트들의 기본적인 CRUD 인터페이스가 같기 때문이다.

 

 

이런 JPA를 실무에서 잘 쓰기 위해서는 객체지향 프로그래밍과 관계형 데이터베이스에 대한 깊은 이해가 있어야 해 높은 러닝 커브가 동반된다.

하지만 그만큼 얻는 보상도 큰데, 이는 다음과 같다.

1. CRUD 쿼리를 직접 작성할 필요가 없음

2. 부모-자식 관계 표현, 1:N 관계 표현, 상태와 행위를 한 곳에서 관리하는 등의 객체지향 프로그래밍을 쉽게 할 수 있음

 

 

따라서 객체지향 프로그래밍과 관계형 데이터베이스를 공부하며 JPA를 꾸준히 배워가는 것이 중요할 것이다.

반응형