PengTory

JDBC와 JPA 그리고 Hibernate 본문

Spring

JDBC와 JPA 그리고 Hibernate

펭토리 2022. 12. 22. 21:41

Java와 Spring을 공부하다보면 종종 JDBC, JPA 그리고 Hibernate라는 단어를 볼 수 있다.

JDBC와 JPA는 모두 자바 프로그램 내에서 DB에 접속하기 위해 만들어진 API이다.

항상 추상적으로 알고 넘어가던 부분을 자세히 정리해볼까 한다.

 

두 개념에 대해 알기 전에 먼저 영속성(Persistence)에 대해 알고 시작하자.

영속성(Persistence)

persistence의 뜻은 위 사진과 같다. 따라서 영속성은 단어 해석처럼 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의특성을 말한다. 

영속성을 갖지 않는 데이터는 메모리에서만 존재하기 때문에 프로그램이 종료되면 모두 사라지게 된다.

따라서 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용해 데이터를 영구하게 저장해 영속성을 부여해야한다.

 

프로그램 아키텍쳐

위 사진을 보면 DB와 Business Logic 사이에 Persistence Layer가 있는 것을 볼 수있다.

이름 처럼 데이터에 영속성을 부여해주는 계층으로 JDBC를 이용해 직접 구현할 수도 있지만 Persistence framework를 이용한 개발이 많이 이루어진다.

 

Persistence Framework란?

- JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있고 안정적인 구동을 보장한다.

- SQL Mapper(Mybatis, JdbcTemplates 등)과 ORM(JPA, Hibernate 등)으로 나뉜다.

 

JDBC (Java Database Connectivity)

Java 프로그래밍 언어와 광범위한 데이터베이스 사이의 연결을 제공하는 자바 API이다.

각종 DBMS에 알맞은 JDBC 드라이버만 있다면 어떤 데이터베이스라도 사용가능하다.

먼저 자바 웹 어프릴케이션은 개발자가 작성한 자바 프로그램을 말하며 이 프로그램 내에서 JDBC API를 import 하고 있다. JDBC Driver는 데이터베이스로의 접근, 클라이언트의 쿼리를 DB로 전달, 쿼리 결과를 클라이언트에 반환하는 프로토콜의 구현체이다.

데이터베이스마다 차이는 있기 때문에 JDBC Driver는 데이터베이스마다 각각 존재한다.

 

JPA (Java Persistent API)

JPA를 이해하기 위해서는 먼저 ORM(Object Relation Mapping) 개념을 이해해야한다. ORM은 지속성을 유지하기 위해 도입된 개념으로, POJO 자바 클래스를 관계형 데이터베이스에 맵핑하는 기술을 의미한다. 쉽게 말하자면, 순수 자바 클래스와 데이터베이스의 데이터가 서로 대응되게 만든다는 뜻이다.

출처: 자바 ORM 표준 JPA 프로그래밍 기본

JPA는 Java Persist API의 약자로 Java ORM 기술 표준이다.

이름 그대로 JPA는 특정 구현체가 아니라 인터페이스기 때문에 개발자는 어떤 구현체를 사용하던 같은 방식으로 사용할 수 있고, 구현체를 변경한다 해도 코드를 변경할 필요가 없다. 즉 JPA는 ORM을 사용하기 위한 표준 인터페이스를 모아둔 것이다. 대표적인 구현체로는 Hibernate, EclipseLink, OpenJPA 등이 있다.

JPA는 Java 애플리케이션과 JDBC API 사이에서 동작한다. 개발자는 JDBC를 직접 사용할 때 느낀 번거로움을 JPA를 통해 해결할 수 있다.

JPA의 구성요소는 세가지가 있다.

1) javax.persistance 패키지로 정의된 API 그 자체

2) JPQL (Java Persistence Query Language)

3) 객체 / 관계 메타데이터

 

Hibernate

Hibernate는 JPA의 구현체 중 하나이다.

하이버네이트 ORM은 자바 언어를 위한 객체 관계 매핑 프레임워크이다. 객체 지향 도메인 모델을 관계형 데이터베이스로 매핑하기 위한 프레임워크를 제공한다.

JPA는 관계형 데이터베이스와 객체의 패러다임 불일치 문제를 해결할 수 있고 영속성 컨텍스트 (엔티티를 영구 저장하는 환경) 제공이 가장 큰 특징이다.

Hibernater가 SQL을 직접 사용하지 않는다 해서 JDBC API를 사용하지 않는 것은 아니다. Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 직접 작성하지 않는 것 뿐이다.

 

장단점

장점

- 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중할 수 있다.

- 테이블 생성, 변경, 관리가 쉽다.

- 쿼리에 집중하는 로직보다 객체 자체에 집중할 수 있다.

- 개발이 비교적 빨라진다.

 

단점

- 어렵다.

- 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다.

- 성능상 문제가 있을 수 있다.

 

JDBC / Hibernat 차이점

JDBC Hibernate
JDBC에서는 개체 모델의 데이터 표현을 관계형 모델의 스키마에 매핑하는 코드를 작성해야한다. Hibernate는 annoation의 도움을 받아 객체 모델의 데이터를 데이터베이스 자체의 스키마에 매핑한다.
JDBC를 사용하면 개발자는 SQL(Structured Query Language)을 사용하여 관계형 데이터베이스에 쿼리를 만들고 데이터를 업데이트할 수 있다.  Hibernate는 SQL과 유사하지만 inheritance, association 등과 같은 객체 지향 개념을 이해하는 HQL(Hibernate Query Language)를 사용한다.
JDBC 코드는 체크예외를 발생시키므로 try catch 블록에 작성해야한다. Hibernate는 언체크예외를 사용해 예외 자체를 관리한다.
JDBC는 데이터베이스에 종속적이다. 즉 다른 데이터베이스를 사용할 시 다른 코드를 작성해야한다. Hibernate는 데이터베이스에 독립적이다.
따라서 동일한 코드와 사소한 변경이 많은 데이터베이스에 적합하다.
JDBC에서 관계 간 연결을 생성하는 것은 매우 어렵다. 일대일, 일대다, 다대일 및 다대다와 같은 연결은 annotation을 사용해 쉽게 얻을 수 있다.

 

 

[참고자료]

https://velog.io/@im_lily/JDBC%EC%99%80-JPA

https://www.geeksforgeeks.org/difference-between-jdbc-and-hibernate-in-java/

https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html

https://mydevdiary.tistory.com/121

https://hyeooona825.tistory.com/87

https://bravesuccess.tistory.com/144

 

'Spring' 카테고리의 다른 글

스프링 시큐리티(Spring Security)의 개념  (0) 2023.01.02
[Spring] 예외  (1) 2022.11.01
[Spring] 템플릿  (0) 2022.10.21
[Spring] 테스트  (0) 2022.10.14
[Spring] 오브젝트와 의존관계 (5) _ XML  (0) 2022.10.14