들어가며
짧은 시간 내에 JPA를 프로젝트에 적용하기 위해서 JPA를 제대로 공부할 시간 없이 바로 코드에 적용하느라고 수많은 에러를 만나고 해결해보았다. 하지만 코드를 작성하면서 EntityManager
를 이용하지 않고 Repository
인터페이스만을 사용하였다.
사실 우리가 급하게 적용해본 기술은 JPA의 구현체인 Hibernate를 쉽게 사용하기 위한 Spring Data API라는 스프링에서 제공하는 '인터페이스'이다.
JPA를 공부하면서 누군가 구현해둔 편리한 도구만을 이용해서 개발을 한다면 결국 각자 기본 개념을 제대로 알지 못하고 혼용해서 사용하거나 헷갈리는 문제, 그리고 에러가 발생했을 때 그 원인을 파악하지 못하는 여러가지 문제가 생길 것이다.
따라서 이번 포스팅에서는 가장 기본이 되면서도 헷갈리기 쉬운 JPA와 Hibernate, 그리고 Spirng Data API의 차이점에 대해 정리해보고자 한다.
JPA
JPA는 Java Persistence API의 약자로, 자바 ORM 기술에 대한 API 표준 명세를 의미한다. 쉽게 말하면 ORM 기술의 인터페이스들을 모아둔 것이다. 따라서 JPA를 사용하려면 JPA를 구현한 ORM 표준 프레임워크를 선택해야한다. 현재 가장 대중적인 ORM 프레임워크는 하이버네이트(Hibernate)이다.
JPA라는 표준 덕분에 특정 구현 기술에 대한 의존도를 줄일 수 있고 다른 구현 기술로 손쉽게 이동할 수 있는 장점이 있다. 그리고 JPA표준은 일반적이고 공통적인 기능의 모음이므로, 표준을 먼저 이해하고 필요에 따라 JPA 구현체가 제공하는 고유의 기능을 알아가는 식으로 공부하면 된다.
하이버네이트(Hibernate)
하이버네이트(Hibernate)는 위 그림에서 볼 수 있는 것처럼 JPA라는 명세의 구현체이다. 현 시점에서 JPA를 주도하는 프레임워크이기에 JPA와 혼용해서 사용하기도 하며, 2001에 공개된 후 지금도 발전하고 있는 성숙한 ORM 프레임워크이다.
하이버네이트는 SQL 매퍼인 MyBatis와 달리 직접 SQL을 사용하지 않고 직관적인 코드를 사용해 데이터를 조작할 수 있다.
MyBatis와 하이버네이트(JPA)와의 차이점은 다음 글을 참고하자
[JPA] ORM(Object-Relational Mapper)
Spring Data JPA
Spring Data JPA는 Spring에서 제공하는 라이브러리 중 하나로, JPA를 쉽고 편하게 사용할 수 있도록 도와준다.
우리가 JPA를 사용하기 위해 Repository
인터페이스를 사용한 것이 바로 Spring Data JPA를 통해 JPA를 사용한 것이다.
이를 조금 어려운 말로 설명하자면(내 기준) Spring Data JPA가 JPA를 추상화했다고 할 수 있다.
이 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해주기 때문에 우리는 더 간단하게 JPA를 이용할 수 있다.
마치 findByUser(User user);
와 같이 메소드를 작성하면 그에 맞는 쿼리를 DB에 날려주는 것처럼 말이다.
JPA를 이용하기 편하게 해주는 라이브러리이지만 위에서 말했듯이 JPA의 기본 개념을 알지 못한다면 사실상 '코딩하는 기계'의 길로 접어들거나, JPA가 뱉어내는 에러를 이해하지 못해 해결하지 못하고 머리를 싸매는 경우가 생길 가능성이 높으므로 JPA의 개념을 공부하면서 사용하도록 하자.
마치며
JPA, Hibernate, 그리고 Spring Date JPA의 전반적인 개념을 표현한 그림을 끝으로 셋의 차이점에 대한 포스팅을 마무리 한다.
출처 및 참고
JPA, Hibernate, 그리고 Spring Data JPA의 차이점
'Study > Spring boot' 카테고리의 다른 글
[JPA] 프록시(Proxy), 지연 로딩(LAZY Loading), 즉시 로딩(EAGER Loading) (0) | 2022.06.23 |
---|---|
[JPA] 영속성 관리 (0) | 2022.06.21 |
[Spring boot] RestControllerAdvice를 이용한 예외 처리 (0) | 2022.06.13 |
[Spring boot] 스프링 프레임워크(Spring Framework) (0) | 2022.06.09 |
[JPA] ORM(Object-Relational Mapper) (0) | 2022.06.05 |