JPA 와 Spring Data JPA
보통 사용 가능 기술에 둘 모두 작성되어 있는 백엔드 개발자들이 많을 것이다.
그럼 JPA 와 Spring Data JPA의 차이는 무엇일까?
자신있게 답변하기 쉽지 않았다.
내가 알고 있던 차이점
나는 김영한님의 스프링 입문 강의에서 두 개념에 대해 처음 접한 것 같다.
내가 알고 있던 둘의 개념은
JPA : Java Persistence Api 로 sql문을 따로 작성해주지 않아도 repository를 통해 자바로 db작업까지 함께 할 수 있는 기능(EntityManager 사용)
Spring Data JPA : JPA가 더 간편화된 방법으로 repository 에서 많은 코드를 축약해서 쓸 수 있다. 그런데 너무 많은 내용이 축약되므로 나중에 코드를 한번에 이해하기 어려울 수 있다.
따라서 Spring Data JPA 보다는 JPA를 사용할 것, 부끄럽지만 이렇게 알고 있었다.
각각 개념에 대해 먼저 알아보자
JPA
객체-관계 매핑(ORM)을 위한 표준 명세인 인터페이스
자바 객체를 데이터베이스 테이블에 저장하거나 조회하는 규칙을 정해둔 것
JPA는 인터페이스이므로 직접 사용할 수 없고, 이를 구현한 라이브러리를 사용해야 한다.
Spring Data JPA
JPA의 기능을 더 쉽게 사용할 수 있도록 도와주는 Spring 프레임워크의 확장 라이브러리
JPA 구현체 위에서(구현체를 통해), 반복적인 코드 작성을 줄이고 더 간편하게 데이터베이스와 상호작용할 수 있도록 도와준다.
그럼 그동안 내가 사용했던 EntityManager는 무엇일까? JPA의 구현체일까?
EntityManager
데이터베이스에 대해 자바 객체를 저장, 조회, 수정, 삭제하는 등의 작업을 수행하는 JPA의 핵심 인터페이스 중 하나로, 구현체는 아니다.
실제 동작을 위해서는 EntityManager의 구현체가 필요하다. 대표적인 구현체가 Hibernate 이다.
* 개발자는 JPA 표준을 사용하지만, 실제로는 Hibernate가 그 표준을 기반으로 내부적으로 동작한다.
이번 프로젝트에서 JPA를 사용했다.
=> 이번 프로젝트에서 JPA의 구현체인 Hibernate를 사용했다 .
Hibernate와 Spring Data JPA의 차이
Hibernate |
Spring Data JPA |
|
목적 | JPA의 구현체로서 ORM 기능 제공 | Hibernate 위에서 동작, 더 간편한 추상화 기능 제공 |
세부 제어 | 복잡한 쿼리와 동작을 세밀하게 제어 가능 | 기본적인 CRUD 작업과 페이징, 정렬을 자동으로 처리 |
복잡도 | 높은 수준의 제어와 기능 제공, 복잡한 설정 필요 | 자동화된 기능을 통해 코드 간소화, 단순 작업에 최적화 |
기본 제공 기능 | 고급 캐싱, 배치 처리, 지연 로딩, 원시 SQL 쿼리 지원 | CRUD, 페이징, 정렬, 메서드 쿼리 생성 등의 기능 자동 제공 |
확장성 | JPA 표준 외에도 고급 기능 제공 | 대부분의 고급 기능은 Hibernate를 통해 제공 |
어떤 경우에 어느 방법을 사용하는 것이 효율적일까?
Hibernate를 사용하는 경우:
- 복잡한 데이터베이스 작업이 필요할 때: 복잡한 쿼리나 성능 최적화, 고급 페치 전략을 사용해야 하는 경우
- JPA 표준 이상의 기능을 사용하고 싶을 때: 캐싱 전략, 배치 처리, 고급 로딩 전략 등 JPA 표준에 포함되지 않은 기능을 이용하고 싶은 경우
- 세부적인 쿼리와 데이터 조작이 필요한 경우: 쿼리를 직접 관리하거나 데이터 처리 로직에 대한 세밀한 제어가 필요한 경우
Spring Data JPA를 사용하는 경우:
- 단순 CRUD, 페이징, 정렬 작업이 주된 경우: 반복적인 CRUD 코드를 작성하는 대신, Spring Data JPA가 제공하는 자동화된 기능을 사용하는 것이 효율적이다
- 생산성을 높이고자 할 때: 기본적인 기능을 자동으로 처리해주므로, 복잡하지 않은 애플리케이션에서는 Spring Data JPA가 훨씬 빠르고 생산적이다
- 간단한 프로젝트나 빠른 프로토타이핑이 필요할 때: 기본적인 데이터베이스 연동 작업을 빠르게 처리할 수 있기 때문에 간단한 애플리케이션에서는 Spring Data JPA가 적합하다
궁금증에 대한 시작점
치아 건강 관리 서비스인 '투스데이'를 진행할 때, 나를 포함한 백엔드 팀원 3명은 나-EntityManager 사용, 다른 2분-Spring Data JPA 사용 이렇게 나누어져있었다.
따로 정한건 아니었지만 다른 팀원분들께서 각각 aws 배포, 구글 연동 로그인을 맡으시고 나는 조금 더 많은 api 분량을 담당하여 비교적 먼저 개발을 시작하였다. 이 과정에서 나는 기존에 사용하던 EntityManager 를 사용하여 개발을 진행하였고, 다른 팀원 두분은 치과 진료 기록에 대한 부분을 같이 담당하셔서 같이 Spring Data JPA를 사용하신 것 같다!
프로젝트를 진행하는데 문제는 없었으니 계속 진행하였는데 후반부쯤 페이징 처리 부분에서 이슈가 발생했다!
이 부분은 따로 정리한 페이징과도 연관되어 있는데, 기본 JPA에서 사용하는 offset, limit 처리와 Spring Data JPA 에서 지원하는 Pageable의 offset, limit 처리 기준이 달라 api 마다 페이징 처리가 다르게 되는 문제가 발생한 것이었다.
이 과정에서 Spring Data JPA의 Pageable이 지원하는 방식이 데이터 용량이 큰 경우 더 효율적이라는 글을 보고 Spring Data JPA가 더 안좋은 방식인 줄 잘못 알고 있었던건가?!? 싶어서 둘의 차이점과 장단점, 어떤 경우에 어떤 방법을 사용하는게 더 효과적인 지 공부해보고 싶었다.
이상 끝~!
'Spring' 카테고리의 다른 글
JPA 페이징 처리 기법에 대해, 어느 방법이 내 프로젝트에 적격일까? (1) | 2024.09.07 |
---|---|
Cascade.Type 옵션 공부 (0) | 2024.07.18 |
윈도우 cmd에서 spring build 시 :test , index.html 에러 해결 방법 (0) | 2023.07.04 |