[Spring] Hibernate, JPA, ORM, JDBC란?

젼이·2024년 10월 19일

ORM(Object Relational Mapping)

관계형 데이터베이스(RDB) 는 데이터가 행과 열이 있는 테이블로 구성되는 집합 이론 모델을 기반으로 한다.

전반적으로 관계형 데이터베이스는 강력하고 효율적인 데이터 저장 및 검색 기능을 제공하지만 복잡한 객체 지향 개념을 모델링(상속, 다형성, 레퍼런스, 오브젝트)하는 데 적합하지 않는다.

우리는 객체 지향 언어인 JAVA를 사용하는데 RDB는 객체 지향을 모델링하는데 적합하지 않다? -> 이 말은 곧 객체에 접근할 때마다 DB상에 어떤 테이블과 연결 시켜주어야 하고 객체의 상태, 상속 정보가 바뀔 때마다 이를 수정해주어야 한다.

ORM은 테이블을 객체지향적으로 사용하기 위한 기술이다.
객체와 DB 테이블이 매핑을 이루는 것을 의미한다.
즉, 내가 코드 상에서 생성한 객체가 DB상에 어떤 테이블과 연결이 된다는 것을 의미한다. 이렇게 되면 내가 객체를 조작함으로써 DB를 조작할 수 있게 된다.

우리는 JPA에서 DB에 대한 접근을 시도할 때 직접 sql문 쿼리문을 만들지 않는다. 다만 객체를 이용한 메소드를 통해 관리한다.
SELECT * FROM user -> user.findAll()
query를 직접 작성하지 않고도 메서드 호출만으로 query가 수행되다 보니까 ORN을 사용하면 생선성이 매우 높아진다.

ORM의 핵심: ORM을 사용해 Object와 RDB사이에 객체지향적으로 다루기 위한 기술이다.

ORM 프레임워크 종류:

  • JAVA: JPA, Hibernate, EclipseLink, DataNucleus, Ebean 등






Hibernate란?

Hibernate란 자바 언어를 위한 ORM 프레임워크이다.
JPA의 구현체로, JPA 인터페이스를 구현하며, 내부적으로 JDBC API를 사용한다.
JPA는 관계형 데이터베이스와 객체의 패러다임 불일치 문제를 해결 할 수 있다는 점과 영속성 컨텍스트(엔티티를 영구 저장하는 환경) 제공이 큰 특징이다.


JPA와 Hibernate는 마치 자바의 interface와 해당 interface를 구현한 class와 같은 관계이다.
JPA의 핵심은 EntityManagerFactory, EntityManager, EntityTransaction을 Hibernate에서는 각각 SessionFactory, Session, Transaction으로 상속받고 각각 Impl로 구현하고 있음을 확인할 수 있다.

"Hibernate는 JPA의 구현체이다"로부터 도출되는 중요한 결론 중 하나는 JPA를 사용하기 위해서는 반드시 Hibernate를 사용할 필요가 없다는 것이다. Hibernate의 작동 방식이 마음에 들지 않는다면 언제든지 DataNucleus, EclipseLink 등 다른 JPA 구현체를 사용해도 되고 본인이 구현해도 된다.

Hibernate의 핵심: JPA의 구현체, interface, class로 되어있다. JPA에서 넘겨받은 정보들을 표준화해서 JDBC에게 넘겨준다.

Hibernate의 장점

생산성

  • Hibernate는 SQL을 직접 사용하지 않고, 메서드 호출만으로 쿼리가 수행된다. 즉, SQL 반복 작업을 하지 않음으로 생산성이 높아진다.
    - SQL문을 몰라도 되는 건 아님

유지보수

  • 테이블 컬럼이 변경되었을 때, 테이블과 관련된 DAO의 파라미터, 결과, SQL등을 대신 수행해준다. 이로 인해 유지보수 측면이 높아진다.

특정 벤더에 종속적이지 않는다.

  • JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않는다.
  • 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지를 알려주기만 하면 얼마든지 DB를 변경할 수 있다.

패러다임 불일치 해결

  • 상속, 연관 관계, 객체 그래프 탐색, 비교 등 객체와 관계형 데이터베이스와의 패러다임 불일치를 해결할 수 있다.

Hibernate의 단점

성능

  • 메서드 호출만으로 쿼리를 수행하는 것은 직접 SQL을 작성하는 것보다는 성능상 좋지 않다.

세밀함

  • 메서드 호출만으로 DB 데이터를 조작하기에는 한계가 있다. 이를 보완하기 위해 JPQL을 지원한다.
  • NativeQuery를 지원하여 SQL 자체 쿼리도 작성할 수 있다.




JPA

자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
라이브러리가 아닌 인터페이스이므로 특정 기능을 하진 않는다.


JPA는 Hibernate 기반으로 새로운 자바 ORM 기술 표준이자, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.

JPA는 영속성 컨텍스트인 EntityManager를 통해 Entity를 관리하고 이러한 Entity가 DB와 매핑되어 사용자가 Entity에 대한 CURD를 실행을 했을 때 Entity와 관련된 테이블에 대한 적절한 SQL 쿼리문을 생성하고 이를 관리하엿다가 필요시 JDBC API를 통해 DB에 날리게 된다.





JDBC

자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는 테이블 형태의 데이터 사이에 독립적인 연결을 지원하는 표준이다. 즉, DB 작업을 위한 표준이라 볼 수 있다.
DBMS 회사들이 JDBC 인터페이스를 구현하여 제공한다. 이를 JDBC 드라이버라고 하는데, 결국 JDBC 드라이버란 DBMS 회사들이 자신들의 데이터베이스 시스템에 접근할 수 있도록 표준 JDBC 인터페이스에 명시된 메소드들을 구현한 것이다.
따라서 JDBC API를 사용할 경우 하나의 자바 응용 프로그램만으로 JDBC 드라이버를 제공하는 어떤 종류의 관계형 DBMS에도 접근이 가능하고, 사용자들은 특정 회사의 데이터베이스의 정확한 사용 방법을 몰라도 JDBC API만 알면 데이터베이스 조작이 가능하다.



JDBC는 ORM이 아닌, 데이터베이스 연결 및 작업을 하기 위한 자바 표준 인터페이스이다.
자바는 DBMS 종류에 상관 없이 하나의 JDBC API를 이용해서 데이터베이스 작업을 처리한다. 이 JDBC는 DB에 접근해서 CRUD를 쉽고 효율적이게 할 수 있게 한다.
JDBC API가 생겨나기 전에는 데이터베이스 종류마다 각각의 SQL을 사용하였는데, 하지만 DB의 종류에 따라 SQL문의 작성 방법이 너무 차이가 나서 구현이 불편했다. 이런 불편함을 해결하고자 메소드, 전역변수 등을 하나의 문법으로 통일시켰고 그것이 JDBC가 되었다.

JDBC의 핵심: DBMS의 종류에 상관없이 하나의 JDBC API를 사용해서 하나의 문법으로 통일시켜 데이터베이스 작업을 처리한다.


참고

spring Data JPA는 JPA를 쓰기 편하게 만들어 놓은 모듈이다.
JPA를 한 단계 추상화 시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. Repository 인터페이스에 정해진 규칙대로 메서드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.

참고

https://livenow14.tistory.com/70
https://velog.io/@murphytklee/Spring-ORM-JPA-Hibernate-JDBC-%EC%B4%9D%EC%A0%95%EB%A6%AC

profile
신입 개발자 임니당 : > (2025.02.05~)

0개의 댓글