ORM, JPA, Hibernate
ORM : OOP 에서 RDB 의 Relation 형태의 데이터를 Object 형태로 맵핑하기 위해 발생하는 개념적 불일치에 대한 고민이자, 이를 해결하기 위한 프로그래밍 기법의 규약이다.
JPA : Java App. 에서 RDB 를 사용할 때 Object<->Relation 맵핑 이슈를 해결하기 위한 Java의 ORM 기술 표준이자, 인터페이스의 모음이다. (쉽게 말하자면 ORM 의 Java 버전이다)
Hibernate : JPA 라는 인터페이스를 구현한 구현체 중 하나이다. JPA 의 구현체는 Hibernate 말고도 EclipseLink, OpenJPA 등 많이 있지만, 성능과 JPA API에서 추가된 편리한 독점 API 를 제공하는 이유로 인기가 많다. 또한, 국내 기준으로는 이미 de facto standard 여서 생태계 발전으로 인한 개발정보를 얻기 편리하다면 이점이 있다.
Hibernate 에서 제공하는 대표적인 독점 기능은 아래와 같다.
- Java 8 Date and Time support
- SQL fragment mapping
- Immutable entity types
- Entity filters
- SQL fragment matching
- Soft deletes
Spring Data JPA : JPA 인터페이스를 Spring 개발환경에 편리하고 쉽게 사용하기 위한, Spring 개발환경에서의 JPA 에 대한 추상화 인터페이스이다.
JPA 와 Hibernate 의 역사
JPA 가 ORM 의 Java 버전이며, Hibernate 가 이 JPA 를 구현하고 있기에 JPA 가 더 오랜 역사를 가지고 있을 것 같지만 그렇지 않다.
Hibnerate 는 2001년에 출시한 오픈소스 프레임워크이며, JPA 는 기존의 EJB 3.0 을 대체하기 위해 2005년에 새로운 표준으로 만들어졌는데, 이 당시 Hibernate 를 기반으로 표준이 제작되었다.
그러니 Hibernate 가 JPA 의 표준을 지켜 구현하고 있지만, 사실 JPA 가 Hibernate 의 구현모델을 표준으로 삼은 것이 맞다고 볼 수 있다.
개인적인 고찰
Hibernate vs. Spring Data JPA 둘은 다른 차원의 개념이다. Hibernate 는 JPA 라는 추상화된 인터페이스를 구현한 구현체(라이브러리)이며, Spring Data JPA 는 JPA 를 Spring 개발환경에서 편리하게 접근할 수 있게 한번 더 추상화한 인터페이스이다.
JPA vs. JDBC 에 대한 고민
App. 개발자가 DB 설계를 직접 할 수 있거나, 영향력을 줄 수 있는 위치에 있다면 JPA 가 좋다.
반면, App. 에 대한 지식이 없는 DBA 가 별도로 있거나, ORM 을 고려하지 않은 레거시 DB 인 경우에는 JDBC 를 선택하는 것이 좋다.
JPA 는 결국 DB 접근을 위해 JDBC 를 호출하기에, xml mapping 방식으로 JDBC 를 직접 호출하는 것보다 오버헤드가 있다고 생각할 수 있다. 그러나 이는 Hibernate 1.x 레벨의 초기 생태계의 이야기이며, 현재는 수많은 ORM 퍼포먼스 향상 기법을 도입했다. 이로써, JPA 는 주어진 조건에 대해 가장 적합한 실행계획을 보장하는 쿼리를 작성하여 실행시간을 단축할 것이고, 이는 제대로 튜닝되지 않고 개발자가 직접 설계한 쿼리보다 빠를 수 있으며 이를 통해 위에서 설명한 오버헤드라는 간극을 줄이거나 오히려 더 빠르게 동작할 수 있다.
참고
https://www.inflearn.com/course/스프링부트