본문 바로가기
Spring/Spring JPA

JPA

코동이 2021. 8. 28.

 개요


JPA는 Spring에서 기존에 Mybatis 사용을 대체하는 새로운 기술로 많이 사용합니다. 사용 방법과 문법은 공부했지만, 어떤 기술이고 어떻게 등장했는지 조사해보려고 합니다.

 

 

텍스트로만 보면 이해가 잘 되지 않기 때문에, 사진을 보고서 이해해보겠습니다.

ORM, JPA, Spring Data JPA, Hiberante 등을 같이 살펴보겠습니다.

 

 

Spring에서 사용되는 JPA의 형태

 

 

 

ORM(Object–Relational Mapping)


ORM

 

 

ORM은 객체지향 패러다임을 사용하여 이기종 시스템끼리 데이터를 변환하기 위해서 사용하는 기술입니다. Java에서 ORM 계층은 Java 클래스와 객체를 관계형 데이터베이스에 저장하고 관리할 수 있도록 변환합니다.

 

 

 기존에 SQL DBMS와 같은 데이터베이스는 객체지향적이지 않고, 테이블에 정의된 integer 형이나 string같은 값만을 저장하거나 사용할 수 있었습니다. 프로그래머는 객체 값들을 저장하기 위해 단순한 값들로 바꾸거나 검색을 위해 값을 바꾸거나, 프로그램 내에서 간단한 값만을 사용해야만 했습니다.

 

하지만, 객체지향 프로그래밍에서, 데이터관리 작업은 객체단위로 움직이므로 객체 단위로 사용이 가능합니다.

 핵심은, ORM을 이용하면 객체의 논리적 표현을 데이터베이스에 저장할 수 있는 원자화된 형태로 바꾼다는 것입니다. (객체의 속성과 관계를 보존할 수 있다) 그래서 필요시 객체 형태로 조회될 수 있으며, 저장소와 검색 기능이 구현되면, 객체는 영속성 상태에 있다고 말할 수 있습니다.

 

DB문의 SQL 쿼리를 이용하는 것과, ORM을 사용해서 이름을 조회하는 코드를 비교해보겠습니다.

 


*  C#에서 DB를 사용해서 SQL에 정의된 쿼리를 실행하는 방법

 

var sql = "SELECT id, first_name, last_name, phone, birth_date, sex, age FROM persons WHERE id = 10";
var result = context.Persons.FromSqlRaw(sql).ToList();
var name = result[0]["first_name"];



* ORM API를 사용해서 언어의 특징을 따라 코드작성하는 방법 

 

var person = repository.GetPerson(10);
var firstName = person.GetFirstName();

 

 

기존의 관계형 데이터베이스 방식과 비교하여 ORM은 코드양이 많이 줄어듭니다. 또한, 많은 경우 실제 SQL 쿼리문을 작성할 필요가 없으며, 코드를 객체 지향적으로 관리할 수 있습니다.

 ORM의 단점은 러닝 커브가 있으며, 구현코드에서 실제로 실행되는 부분들을 고수준으로 추상화를 합니다. 또한 ORM에 높은 의존도는 잘못 디자인된 데이터베이스 생성의 주요 요인으로 꼽힙니다. 테이블의 관계 제약은 따로 설정을 하고, DDL 작업만 ORM으로 하는 것을 추천합니다.

 

 

JPA(Jakarta Persistence API)


JPA

 

 

*JPA란?

 

 JPA는 자바 객체와 관계형 데이터베이스 사이에 데이터를 영속화하기 위해 사용되는 명세서입니다. JPA는 관계형 데이터베이스와 객체지향 도메인 모델 사이를 이어주는 다리 역할을 하며 단순한 명세서이기 때문에, JPA 자체로는 어떠한 기능도 할 수 없습니다. 

 

 영속성 엔티티는 가벼운 자바 클래스로 그 상태는 보통 관계형 데이터베이스에서 테이블에 영속성을 가집니다. 엔티티의 객체는 테이블에서 개별적인 ROW에 해당합니다. 

 

 

*JPA 구현체

 

JPA는 프레임워크보다는, 구현을 안내하는 개념을 정의하는 오픈소스 API입니다. 따라서, Oracle, Redhat, Eclipse같은 회사들이 여러 제품들을 만들었고, Hibernate, Eclipselink, Toplink, Spring Data JPA 등이 있습니다.

 

JPA는 명세서(specification), Hiberante는 구현체(Implementation)입니다.

 

Hibernate와 JPA는 자주 같이 언급되지만, Hibernate는 JPA 구현체 중 하나일 뿐입니다. 

 

 

 

*JPQL이란? (엔티티 기반 쿼리 수행)

 

 JPQL(Jakarta Persistence Query Language)는 관계형 데이터베이스에 저장된 엔티티에 대해 쿼리를 수행합니다. 쿼리는 구문에서 SQL 쿼리와 유사하지만, 데이터베이스 테이블을 직접 사용하지 않고 엔티티 객체에 적용합니다.

 

 

* 등장 배경

 

EJB의 Entity Bean -----> Hibernate ----> JPA

 

  스프링도 사용되기 이전, 자바로 엔터프라이즈 애플리케이션 개발은 EJB로 이루어졌습니다.(이제 Spring이 주로사용되므로 EJB에 대해서 깊이 알 필요는 없다) EJB는 ORM의 한 종류인 Entity Bean을 사용하여 데이터 관리를 하였는데 코드가 너무 복잡했으며 무거운 자원들을 호출했습니다. 또한 Entity Bean은 Bean과 DAO 사이에 있는 소스코드 혹은 영속성 프레임워크에서 상호통신과 의존성 때문에 JAVA EE 어플리케이션에서만 사용되었습니다.

 

 따라서 Entity Bean 대신에 엔터프라이즈 개발자들은(Gavin King) 영속성 프레임워크 Hiberante를 2002년 개발하여 사용하였으며, dao에 의해 제공되어진 가벼운 경량화 영속성 객체를 사용하였습니다. 이후 ORM 형식의 Hibernate와 이외에 다양한 ORM 프레임워크가 개발되어 사용되었으며,  공통의 영속성 API를 개발할 필요성을 느꼈습니다.

 

 결국, 기존의 ORM 프레임워크 기능들과 써드파티(타사) 영속성 프레임워크에 등장한 많은 기능들이 JPA  API 스펙으로 2006년에 통합되었습니다. EJB 3.0부터는 Entity Bean이 사용되지 않고 API가 대신하게 되었습니다. JPA는 ORM의 표준이 되었고, 대표적인 Hiberante 혹은 TopLink Eseentials 이외에도 다양한 종류가 JPA  API 스펙의 구현체가 되었습니다.

 

* JPA의 특징

 

- SQL 중심적인 개발에서 객체 중심으로 개발

- 생산성 & 유지보수에 뛰어남

- 패러다임의 불일치 해결

- 데이터 접근 추상화와 벤더 독립성

- 표준

 

 

Spring Data JPA


Spring Data JPA

 

JPA의 구현체인 Hibernate의 기능들을 추상화한 것으로, 대표적으로 CRUD메서드를 간편하게 이용할 수 있습니다. Spring Data Jpa를 사용하면, EntityManager를 이용하지 않고도 DB에 좀더 쉽고 다양하게 객체로 접근할 수 있습니다.

 

 

* 참고

 

https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Set-the-record-straight-on-the-JPA-and-Hibernate-debate

https://www.javatpoint.com/jpa-introduction

What is JPA? Introduction to the Jakarta Persistence API

JPA - Quick Guide

https://stackoverflow.com/questions/18198792/hibernate-vs-entity-beans

https://stackoverflow.com/questions/9881611/whats-the-difference-between-jpa-and-hibernate

https://stackoverflow.com/questions/12351312/which-one-is-better-jpa-or-hibernate-annotation

https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%ED%8D%BC%EC%8B%9C%EC%8A%A4%ED%84%B4%EC%8A%A4_API

https://ko.wikipedia.org/wiki/%ED%95%98%EC%9D%B4%EB%B2%84%EB%84%A4%EC%9D%B4%ED%8A%B8

반응형

'Spring > Spring JPA' 카테고리의 다른 글

N:1 테이블 관계 설계하기  (0) 2021.09.07
1:N 테이블 관계 설계하기  (0) 2021.09.07
1:1 테이블 관계 설계하기  (0) 2021.09.07
Entity  (2) 2021.09.05
JPA 영속성 컨텍스트  (0) 2021.08.30