Computer Science/Database

ORM, JPA, Hibernate, MyBatis

gozer0 2024. 7. 16. 15:00

ORM이란? 

객체 관계 매핑(Object-Relational Mapping) 이라고

Java와 같은 객체지향 언어에서의 객체와 RDB의 테이블을 자동으로 매핑하는 방법이다.

 

 

 

예를 들어 스프링부트에 있는 '{ 객체 }'  와 관계형 데이터베이스 사이에 ORM이 역할을 맡는다.

 

데이터베이스를 프로그래밍 언어의 객체 관점으로 바라볼 수 있어서

객체 지향 프로그래밍 언어를 이용해 프로그램을 개발하기 편리하다.

 

SQL문을 사용하지 않아도 객체 지향 코드를 작성할 수 있고, 

코드의 가독성을 높여 개발자 편의성을 증대시킨다.

 

하지만 복잡한 프로젝트를 수행할 때에는 ORM으로만으로 서비스를 구현하기 어려울 수 있다.

복잡한 쿼리를 ORM으로만으로 구성하기에는 한계가 있다.

 

대표적인 ORM 프레임워크로는

자바의 하이버네이트(Hibernate), 파이썬의 장고(Django), 루비의 액티브 레코드(ActiveRecord)

등이 있다.

 

즉, ORM은 클래스와 데이터베이스의 테이블을 매핑하기 위한,

이 둘의 불일치를 해결하기 위한 역할을 한다.

 

여러가지 ORM프레임워크 중 자바의 하이버네이트는

SQL 쿼리를 작성하는 것이 아닌, 자바 코드로 데이터를 조작할 수 있다.

 

 

 

JPA(Java Persistence API)

ORM이 큰 개념이라면 JPA는 더 작은 부분이다.

그러니까 자바에서는 JPA가 ORM의 역할을 한다.

 

 

JPA의 구현체는 대표적으로 하이버네이트(Hibernate),  이클립스 링크(EclipseLink), 데이터 뉴클리어스(DataNucleus)로 3가지가 있다. 그중 하이버네이트가 가장 많이 사용된다.

 

즉, 하이버네이트는 Java 진영의 ORM인 JPA의 가장 대표적인 구현체이다.

 

흔히 하이버네이트랑 마이바티스 이 두개를 사용을 하는데

둘다 Java의 데이터베이스 접근을 도와주는 ORM 프레임워크이다.

 

그런데 역할은 엄연히 다르다.

 

하이버네이트가 JPA의 구현체 중 하나고, ORM의 표준을 따르며,

객체와 RDB 간의 매핑을 자동으로 처리해준다.

그래서 SQL 쿼리를 거의 작성하지 않는다.

그래서 객체로 데이터베이스를 조작 가능하다.

 

마이바티스는 SQL 매퍼로, SQL 쿼리를 직접 작성하는 것을 중시한다.

그래서 SQL를 직접 컨트롤할 수 있으며, 성능 최적화에 굿.

XML파일이나 애너테이션으로 SQL 쿼리를 정의한다.

 

하이버네이트는 JPA의 구현체라면

마이바티스는 ORM의 구조체이다.

 

자, 그러면 하이버네이트는 DB를 조작한다고 했는데 

쿼리를 작성하지 않아도 어떻게 조작이 되는걸까?

 

Hibernate

JPA는 하이버네이트를 쓴다.

하이버네이트를 쓰게 되면 데이터베이스를 두 번을 확인하는데,

실제 데이터베이스, 하이버네이트의 DB이다.

 

여기서 하이버네이트의 DB를 1차 캐시라고 부르는데

여기서 데이터가 먼저 수정이 되면, 

수정 사항을 체크한 후, 

실제 데이터베이스에 이를 반영하는 방식이다.

 

그래서 코드에서 바로 수정이 되었다고,

실제 데이터베이스에 즉각적으로 반영이 되는 것이 아니다.

 

1. 1차 캐시에서 DB가 수정 되었다.

2. 수정된 부분을 바탕으로 SQL 쿼리문을 저장해 놓는다.

3. Commit이 되면 SQL 쿼리가 실제 DB에 반영된다.

 

 

 

 

 

 

 

이제 이 과정들을 이해하기 위해서는

Entity Factory라는 것이 나오는데 

이건 다음 게시물에 다뤄보겠다!

 

 

 

 

'Computer Science > Database' 카테고리의 다른 글

Entity Factory  (0) 2024.07.17
데이터베이스  (0) 2024.07.15