Spring

[Spring Data JPA] MyBatis vs Hibernate vs Spring Data JPA

jhkimmm 2022. 1. 23. 18:03

Java 진영의 DB기술들을 공부하다 보면 필연적으로 MyBatis, Hibernate, Spring Data JPA을 접하게 되는데 다들 비슷해 보이고 개념에 혼동이 오곤 했습니다. 각 모듈들에 대한 정확한 개념을 정리하고자 포스팅을 작성합니다.

MyBatis

MyBatis는 SQL Mapper의 일종입니다. SQL Mapper란 RDBMS 쿼리문의 실행 결과를 실제 자바 코드에 매핑하기 위한 프레임워크로 이를 활용하면 프로그램 코드와 SQL을 분리할 수 있다는 장점을 가집니다.

MyBatis는 별도의 XML파일에 SQL문을 작성하고 이를 자바 프로그램의 메서드에 매핑해줍니다.

위와 같은 표기법으로 작성된 XML파일은 아래 자바 프로그램의 메서드에 매핑되고 이 메서드를 활용해서 데이터베이스에 접근하게 됩니다. 이러한 방식은 이전의 방식보다는 편리하지만 여전히 아쉬운 점이 남아있습니다.

 

첫번째, 프로그램이 특정 DB에 종속됩니다. SQL이라는 언어 자체가 DB마다 다른데, XML파일에 SQL을 직접적으로 사용하고 있으므로 다른 DB로 전환하기 위해서는 해당 DB의 문법에 맞는 SQL문으로 모두 교체 해주어야 합니다.

 

두번째, SQL문을 프로그램 코드에서 분리하기 위한 목적으로 XML파일을 만들었지만, 결국 이 XML파일도 관리해주어야 합니다.

 

세번째, Type-safety를 활용하지 못합니다. 쿼리 실행 결과는 Map이나 ResultSet의 구조로 넘어오므로 결국 매핑은 직접 구현 해주어야하며, 이는 각 데이터의 타입을 보장해주지 못합니다.

 

Hibernate와 JPA

Hibernate는 JPA를 구현한 구현체 입니다.

먼저 JPA란 Jakarta(Java) Persistence API의 약자로 자바에서 ORM 기술을 사용해 RDBMS를 다루기 위한 표준 명세입니다. (오라클이 Java EE의 관리를 이클립스 재단에 넘기면서 Java라는 명칭의 상표권 문제로 Jakarta라는 명칭으로 바뀌었다고 합니다.)

실제 JPA의 javax.persistence 패키지 소스코드를 살펴보면 구현된 부분은 없이 인터페이스로만 이루어 진 것을 확인할 수 있습니다. 이런 JPA를 구현한 것이 바로 Hibernate입니다.

javax.persistence.spi 패키지의 PersistenceProvider 인터페이스

Hibernate는 자바 생태계를 대표하고 스프링 부트에서 채택한 ORM 프레임워크이며 JPA의 표준 스펙을 구현한 JPA의 Provider입니다.

HIbernate의 소스코드

실제 Hibernate의 소스코드를 살펴보면 JPA에 정의된 추상메서드를 오버라이딩해서 구현한 부분을 확인할 수 있습니다.

Hibernate는 특별한 데이터베이스 테이블이나 필드를 필요로 하지 않으며 런타임 대신 시스템 초기화 시간에 많은 SQL을 생성하고 개발자 생산성과 런타임 성능 면에서 JDBC보다 일관되게 우수한 성능을 제공합니다.

또한 객체 모델에 초점을 맞춰 설계된 HQL이라는 SQL스타일의 비표준 쿼리언어를 사용하여 특정 DB에 종속되지 않습니다.

 

Spring Data JPA

Spring Data JPA는 스프링에서 제공하는 JPA를 Repository라는 개념으로 한 단계 더 추상화 시킨 JPA추상화 모듈입니다.

JPA 기본 구현체로 Hibernate를 사용하며, Hibernate의 직접적인 사용을 한번 더 감추고 다양한 지원과 설정방법을 제공합니다. 실제로 스프링 부트 프로젝트를 생성하고 Gradle에 Spring Data JPA 의존성만 추가하고 빌드 해보면

JPA 의존성이 추가된 모습
Hibernate 의존성이 추가된 모습

자동으로 JPA와 Hibernate에 관련된 의존성이 추가되는 것을 확인할 수 있습니다.

 

정리

MyBatis는 대표적인 SQL Mapper이며

Hibernate는 JPA를 구현한 대표적인 구현체입니다.

그리고 Spring data JPA는 JPA를 Repository라는 개념으로 한단계 더 추상화 시킨 모듈이며 JPA의 구현체로 Hibernate를 사용합니다.