본문 바로가기
도전

Hibernate Architecture

by oncerun 2023. 7. 8.
반응형

 

하이버네이트의 설계 목적은 SQL 및 JDBC를 사용하여 수작업으로 데이터를 처리할 필요가 없도록 함으로써

개발자가 일반적인 데이터 지속성 관련 프로그래밍 작업의 95%에서 벗어날 수 있도록 하는 것이다.

 

타 지속성 솔루션들과 달리 하이버네이트는 SQL에 대한 강력한 기술을 사용할 수 있게 하며, 관계형 기술에 대한 지식과 투자를 항상 가치 있도록 보장하려고 노력한다.

 

사실 하이버네이트는 비지니스비즈니스 로직을 구현하기 위해 stored-procedures만 사용하는 데이터 중심 애플리케이션에는 적합하지 않을 수 있습니다. 그러나 Java 기반의 middle-tier의  객체지향 도메인 모델 및 비즈니스 로직에 가장 유용하다고 할 수 있습니다.

 

여기서 Middle-tier는 소프트웨어 아키텍처에서 사용되는 용어로 presentation-tier와 data-tier 사이에 있는 중간 계층을 가리킵니다.  일반적으로 미들 티어는 비지니스 로직을 처리하고 데이터 액세스와 통신하는 역할을 담당합니다.

 

결론적으로 하이버네이트는 특정 벤더사의 SQL code를 제거하거나 캡슐화하는데 도움을 줄 수 있고 테이블 형태의 결과 집합에 대해 객체 그래프로 변경하는데 있어서 큰 도움을 줄 수 있습니다.

 

[Involved]

Try your hand at fixing some bugs or implementing enhancements. Again, see Issue Tracker.

 

 

System Requirements

 

Hibernate 6.0 이상은 최소 Java 11 그리고 JDBC 4.2. 버전이 필요합니다.

 

 

Architecture

 

Hibernate는 ORM 솔루션으로 자바 애플리케이션의 데이터 액세스 레이어와 관계형 데이터베이스 사이에  위치합니다.

 

자바 애플리케이션은 Hibernate API를 사용하여 도메인 데이터를 로드, 저장, 쿼리 등을 수행합니다.

 

Jakarta Persistence 공급자로서 Hibernate는 Java Persistence API 사양을 구현하고, Jakarta Persistence  인터페이스와  하이버네이트 특정 구현 사이의 연결은 다음 다이어그램에서 시각화할 수 있습니다.

 

 

 

SessionFactory

 

애플리케이션 도메인 모델과 데이터베이스를 매핑하는 thread-safe한 표현입니다.

org.hibernate.Session 인스턴스의 팩토리 역할을 합니다. 

 

EntityManagerFactory는 SessionFactory와 동등한 Jakarta Persistence입니다. 기본적으로 이 둘은 동일한 세션팩토리 구현으로 표현됩니다.

 

즉 JPA에서 EntityManagerFactory는 EntityManager 인스턴스 생성을 담당합니다.

 

Hibernate에서 SessionFactory는 Hibernate ORM 프레임워크와 상호작용하기 위한 주요 런타임 인터페이스입니다.

이는 Session 인스턴스를 생성하는 책임을 담당합니다. 

 

SessionFactory는 Hibernate 전용 인터페이스이며 JPA의 일부가 아닙니다.

 

EntityManager, Session은 모두 데이터베이스 작업을 수행하는 데 사용되지만 서로 다른 Persistence 프레임워크에 속한다는 차이가 있습니다.

 

이 글은 Hibernate에 대한 글이며, JPA 스펙에 관한 글이아니여서 특정 클래스가 Hibernate의 스펙인 경우가 있어 헷갈리면 안 됩니다.

 

 

 

Session

 

개념적으로 짧은 수명을 가지고, 단일 스레드에서 실행되는 Unit of Work 모델입니다.

JPA에서는 이를 EntityManager라 표현합니다.

 

Hibernate에서 session은  JDBC의 java.sql.Connection을 래핑 합니다.

그리고 org.hibernate.Transaction 인스턴스의 팩토리로 동작합니다. 

그리고 애플리케이션에서 도메인 모델의 repeatable read의 지속성 콘텍스트를 유지합니다. 

 

여기서 repeatable read는 트랜잭션 내에서 데이터베이스에서 읽은 데이터가 일관되고 안정적으로 유지되도록 하는 트랜잭션 격리 수준을 말합니다.

 

즉 트랜잭션이 실행 중에 특정 데이터 집합을 여러 번 읽어도 항상 동일한 값을 볼 수 있으며, 데이터를 수정하는 다른 동시 트랜잭션의 영향을 받지 않습니다. 

 

repeatable read의 격리 수준에서는 다른 트랜잭션이 변경한 내용이 커밋될 때까지 현재 트랜잭션에 표현되지 않습니다.

즉 동일한 트랜잭션이 동일한 데이터를 여러 번 읽는 경우 다른 트랜잭션에서 동시에 업데이트 또는 삽입이 발생하는 것과 관계없이 항상 동일한 결과를 얻게 됩니다.

이를 first level cache라고도 부릅니다. 

 

Transaction 

 

애플리케이션에서 개별 물리적 트랜잭션 경계를 구분하는 데 사용되는 수명이 짧은 단일 스레드 객체입니다. 

 

여기서 물리적 트랜잭션 경계란 트랜잭션이 시작되고 종료되는 범위를 가리킵니다. 

 

즉 트랜잭션 객체는 애플리케이션에서 데이터베이스 트랜잭션의 경계를 설정하고 트랜잭션 내에서 실행되는 작업들을 관리하는 데 사용됩니다. 이를 통해 애플리케이션은 데이터베이스의 트랜잭션 시스템(JDBC, JTA)과의 상세한 상호작용을 추상화할 수 이 쓰며, 트랜잭션의 범위와 작업의 원자성을 보장할 수 있습니다.

 

더 쉽게 말하면, JDBC의 복잡한 작업을 추상화시킨 Hibernate의 Transaction 객체를 통해 간편하게 사용할 수 있다는 것입니다.

 

 

 

 

ps

 

심심해서 읽는 https://docs.jboss.org/hibernate/orm/6.2/userguide/html_single/Hibernate_User_Guide.html

 

Hibernate ORM 6.2.6.Final User Guide

Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

docs.jboss.org

 

반응형

'도전' 카테고리의 다른 글

코딩 테스트, 코드 리뷰, 인터뷰 피할 수 없으면 즐겨  (0) 2023.07.12
스크럼이 뭐야?  (0) 2023.07.12
Video Protocol  (0) 2023.06.29
개발 용어  (0) 2023.06.26
SPF? DKIM? DMARC?  (0) 2023.06.15

댓글