ORM 기술에 대한 명세인 JPA(Java Persistence API)의 구현체의 한 종류
JPA의 구현체이므로 JPA의 특징을 함께 정리했어요.
Hibernate란?
하이버네이트는 자바 언어를 위한 ORM 프레임워크에요. JPA의 구현체로, JPA 인터페이스를 구현하며, 내부적으로 JDBC API를 사용해요.
JPA는 관계형 데이터베이스와 객체의 패러다임 불일치 문제를 해결
할 수 있다는 점과 영속성 컨텍스트(엔티티를 영구 저정하는 환경)
제공이 큰 특징이에요.
JPA
자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스에요. 라이브러리가 아닌 인터페이스
이므로 특정 기능을 하진 않아요.
JDBC
자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는 테이블 형태의 데이터 사이에 독립적인 연결을 지원하는 표준이에요. 즉, DB 작업을 위한 표준이라 볼 수 있어요.
DBMS 회사들이 JDBC 인터페이스를 구현
하여 제공해요. 이를 JDBC 드라이버
라고 하는데, 결국 JDBC 드라이버
란 DBMS 회사들이 자신들의 데이터베이스 시스템에 접근 할 수 있도록 표준 JDBC 인터페이스에 명시된 메소드들을 구현한 것이라 볼 수 있어요.
따라서 JDBC API
를 사용할 경우 하나의 자바 응용 프로그램만으로 JDBC 드라이버를 제공하는 어떤 종류의 관계형 DBMS에도 접근이 가능하고, 사용자들은 특정 회사의 데이터베이스의 정확한 사용 방법을 몰라도 JDBC API만 알면 데이터베이스 조작이 가능하게 돼요.
하이버네이트의 장점
생산성
- Hibernate는 SQL을 직접 사용하지 않고, 메서드 호출만으로 쿼리가 수행돼요. 즉, SQL 반복 작업을 하지 않음으로 생산성이 높아져요
- SQL을 몰라도 되는 건 아니에요. (내부 동작에 대해 알아야 하기 때문)
유지보수
- 테이블 컬럼이 변경되었을 때, 테이블과 관련된 DAO의 파라미터, 결과, SQL 등을 대신 수행해줘요. 이로 인해 유지보수 측면에서 높아져요
특정 벤더에 종속적이지 않음
- JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않아요.
- 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지를 알려주기만 하면 얼마든지 DB를 바꿀 수 있어요.
패러다임 불일치 해결
- 상속, 연관 관계, 객체 그래프 탐색, 비교 등 객체와 관계형 데이터베이스와의 패러다임 불일치를 해결할 수 있어요.
하이버네이트의 단점
성능
- 메서드 호출만으로 쿼리를 수행하는 것은 직접 SQL을 작성하는 것보다는 성능상 좋지 않아요
세밀함
- 메서드 호출만으로 DB 데이터를 조작하기에는 한계가 있어요. 이를 보완하기 위해 JPQL을 지원해요
- NativeQuery를 지원하여 SQL 자체 쿼리도 작성할 수 있어요
러닝커브
- 공부해야 할 것이 많아요.
필자가 생각하는 장점
객체에 비지니스 책임을 위임할 수 있어요.
- 객체를 불러올 때, 연관된 객체 또한 함께 불러오기 때문에, SQL에 의존적이지 않은 개발을 할 수 있어요.
- 즉, SQL 중심이 아닌 객체 중심의 개발이 가능해요
참고
Spring Data JPA
는 JPA를 쓰기 편하게 만들어 놓은 모듈이에요.
JPA를 한 단계 추상화시킨 Repository
라는 인터페이스를 제공함으로써 이루어져요. Repository
인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해줘요
Refer
https://m.blog.naver.com/swoh1227/221479428906
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
질문
왜 구현체로 하이버네이트를 선택했나요?
답변
JPA는 Hibernate를 추상화한 인터페이스에요. 다른 구현체에 비해 가장 JPA와 호환이 잘된다 생각해요. 또한 Spring Starter의 Data JPA의존성에는 Hibernate 구현체가 기본적으로 포함되어있어요.
다른 구현체의 선택에 대한 필요성이 있다면, 예를들어 JPA에서 부족한 부분을 채워 준다거나, 동작방식을 다루게 두어 일반적이지 않은 경우 성능이 더 좋다거나, 이런 이유라면 선택을 할거같아요.
하지만 제가느끼기엔 현재까지 Hibernate는 가장 강력하고, 이후에도 변함이 없을 거같아요.
댓글