서문
객체 지향 소프트웨어와 관계형 데이터베이스를 함께 쓰는 것은 귀찮고 시간이 많이 소비된다. 데이터가 관계형 데이터베이스와 객체 사이에서 표현되는 방식의 패러다임 불일치로 인해 개발 비용이 증가하게 된다. Hibernate는 자바 환경에서 객체/릴레이션 매핑의 솔루션이다. 객체/관계형 매핑이라는 말은 객체 모델 표현 방식으로 부터 관계형 데이터를 매핑하는 기술을 의미한다.
Hibernate는 자바 클래스로 데이터베이스를 매핑하는 것 뿐 아니라 데이터 쿼리 및 탐색 기능을 제공한다. 이는 SQL과 JDBC로 데이터를 핸들링하는 시간을 상당히 줄여줄 수 있다. Hibernate의 디자인 목표는 SQL과 JDBC로 데이터를 처리하는 필요성을 제거함으로써 개발다의 데이터 관련 프로그램 작업의 95% 감소 시켜 주는 것이다. 그리고 다른 persistence 솔루션들과 다르게 Hibernate는 SQL 기능을 배제하지 않기에 관계형 기술 및 지식에 대한 투자가 항상 유요할 수 있도록 보장해 준다.
Hibernate는 오직 stored-procedure를 사용하는 데이터 중심의 어플리케이션에서는 적합하지 않고 객체 지향의 도메인에 집중되어 있는 비즈니스에 가장 적합하다. 하지만 Hibernate는 벤더에 집중되어 있는 SQL 코드를 제거해 주고 table 중심의 데이터를 객체의 유형으로 변형하는데 편한 도움을 준다.
시스템 요구사항
Hibernate 5.2와 그 이후 버전은 Java 1.8과 JDBC 4.2이상 버전이 요구되고 그 이하 버전은 Java 1.6과 JDBC 4.0버전이 요구된다. (하지만 5.1 또는 그 이하버전을 source로 빌드 할 때 1.6 compiler의 버그 때문에 1.7을 사용해야 한다.)
1. 아키텍쳐
1.1 Overview
JPA provider로써 Hibernate는 Java Persistence API의 요구사항을 구현하고 JPA 인터페이스와 Hibernate 특정 구현 사이에서 아래 다이어그램을 통해 시각화할 수 있다.
SessionFactory (org.hibernate.SessionFactory)
애플리케이션 도메인 모델을 데이터베이스에 thread safe하고 불변하게 매핑한다. org.hibernate.Session 인스턴스를 위한 factory처럼 행동한다. EntityManagerFactory는 SessionFactory에 해당하는 JPA(JPA는 Java Persistence Api로 명세서, 이를 구현한게 Hibernate)이며 기본적으로 이 두가지는 동일한 SessionFactory로 구현된다.
SessionFactory는 데이터베이스 상관없이 매우 생성하기에 비싸기에 애플리케이션은 오직 하나의 SessionFactory만을 가지고 있다 SessionFactory는 2차레벨 캐시, 커넥션 풀, 트렌젝션 시스템 집합체 등과 같은 세션 전반위에 대한 서비스 유지관리를 한다.
Session (org.hibernate.Session)
"Unit of Work" PoEAA 을 개념적으로 모델링한 싱글스레드, 짧은 수명을 가진 객체. JPA에서 Session은 EntityManager로 표현된다.
Hibernate Session은 JDBC java.sql.Connection을 감싸고 있고 org.hibernate.Trasaction인스턴스의 factory로써 동작한다. 이것은 일반적으로 도메인 레벨에서 "반복적인 읽기" 영속성 컨텍스트(1차 캐시)를 유지한다.
Transaction (org.hibernate.Transaction)
어플리케이션에서 물리적으로 트랜잭션의 경계를 독립적으로 분리하기 위해서 사용되는 싱글스레드의 짧은 수명을 가진 객체. EntityTransaction은 JPA 명세이며 JDBC 또는 JTA에서 트랜잭션 시스템의 기초가되는 곳으로 부터 어플리케이션을 분리하기 위해 추상적인 API로써 동작한다.
'데이터베이스 > Hibernate' 카테고리의 다른 글
[번역] 2-2. Domain 모델 (Enum, UUID, Date, Attribute, Generated Properties) (1) | 2020.11.17 |
---|---|
[번역] 2-1. Domain 모델 (매핑 타입, 네이밍 전략, Basic Type - 1) (0) | 2020.11.01 |