mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-03-01 15:29:11 +00:00
241 lines
15 KiB
XML
241 lines
15 KiB
XML
|
<chapter id="architecture">
|
||
|
|
||
|
<title>아키텍처</title>
|
||
|
|
||
|
<sect1 id="architecture-overview" revision="1">
|
||
|
<title>개요</title>
|
||
|
|
||
|
<para>
|
||
|
Hibernate 아키텍처에 대한 (매우) 높은 수준의 개요::
|
||
|
</para>
|
||
|
|
||
|
<mediaobject>
|
||
|
<imageobject role="fo">
|
||
|
<imagedata fileref="images/overview.svg" format="SVG" align="center"/>
|
||
|
</imageobject>
|
||
|
<imageobject role="html">
|
||
|
<imagedata fileref="../shared/images/overview.gif" format="GIF" align="center"/>
|
||
|
</imageobject>
|
||
|
</mediaobject>
|
||
|
|
||
|
<para>
|
||
|
이 다이어그램은 어플리케이션에 영속화 서비스들(과 영속 객체들)을 제공하기 위해 데이터베이스와
|
||
|
컨피그레이션을 사용하는 Hibernate를 보여준다.
|
||
|
</para>
|
||
|
|
||
|
<para>
|
||
|
우리는 런타임 아키텍처에 대한 보다 상세한 뷰를 보여주고 싶다. 불행하게도, Hibernate는 유연하며
|
||
|
몇 가지 접근법들을 제공한다. 우리는 두 가지 극단을 보여줄 것이다. "경량급" 아키텍처는 그것 자신의
|
||
|
JDBC 커넥션들을 제공하고 그것 자신의 트랜잭션들을 관리하는 어플리케이션을 갖는다. 이 접근법은
|
||
|
Hibernate의 API의 최소 부분집합을 사용한다:
|
||
|
</para>
|
||
|
|
||
|
<mediaobject>
|
||
|
<imageobject role="fo">
|
||
|
<imagedata fileref="images/lite.svg" format="SVG" align="center"/>
|
||
|
</imageobject>
|
||
|
<imageobject role="html">
|
||
|
<imagedata fileref="../shared/images/lite.gif" format="GIF" align="center"/>
|
||
|
</imageobject>
|
||
|
</mediaobject>
|
||
|
|
||
|
<para>
|
||
|
"전체 정수" 아키텍처는 기본 JDBC/JTA로부터 어플리케이션을 추상화 시키고 Hibernate로 하여금
|
||
|
상세한 것을 처리하게 한다.
|
||
|
</para>
|
||
|
|
||
|
<mediaobject>
|
||
|
<imageobject role="fo">
|
||
|
<imagedata fileref="images/full_cream.svg" format="SVG" align="center"/>
|
||
|
</imageobject>
|
||
|
<imageobject role="html">
|
||
|
<imagedata fileref="../shared/images/full_cream.gif" format="GIF" align="center"/>
|
||
|
</imageobject>
|
||
|
</mediaobject>
|
||
|
|
||
|
<para>
|
||
|
다음은 다이어그램들 내에 있는 객체들에 대한 몇가지 정의들이다:
|
||
|
|
||
|
<variablelist spacing="compact">
|
||
|
<varlistentry>
|
||
|
<term>SessionFactory (<literal>org.hibernate.SessionFactory</literal>)</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
단일 데이터베이스에 대한 컴파일된 매핑들의 threadsafe (불변의) 캐시. Session과 ConnectionProvider의
|
||
|
클라이언트를 위한 팩토리. 프로세스 레벨 또는 클러스터 레벨에서 트랜잭션들 사이에 재사용 가능한 데이터의 선택적인
|
||
|
(second-level) 캐시를 보관할 수도 있다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>Session (<literal>org.hibernate.Session</literal>)</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
어플리케이션과 영속 저장소 사이의 대화를 표현하는 단일 쓰레드이고, 수명이 짧은 객체. JDBC 커넥션을 포장한다.
|
||
|
<literal>Transaction</literal> 용 팩토리. 객체 그래프를 네비게이트 하거나 식별자로 객체들을 룩업할 때
|
||
|
사용되는 영속 객체들에 대한 필수적인(첫 번째 레벨의) 캐시를 보관한다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>Persistent objects and collections</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
persistent 상태와 비지니스 기능을 포함하는 수명이 짧고, 단일 쓰레드인 객체들. 이것들은 통상의 JavaBeans/POJO들일
|
||
|
수 있고, 오직 그것들에 대한 오직 특별한 것은 그것들이 현재 (정확하게 한 개의) <literal>Session</literal>과 연관되어
|
||
|
있다는 점이다. <literal>Session</literal>이 닫히자마자, 그것들은 분리될(detached 상태가 될) 것이고 어플리케이션
|
||
|
레이어에서 사용하는 것이 자유로와진다(예를 들면. 프리젠테이션으로의 데이터 전송 객체들로서 직접적으로 그리고 프리젠테이션으로부터
|
||
|
데이터 전송 객체들로서 직접으로).
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>Transient and detached objects and collections</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
<literal>Session</literal>과 현재 연관되어 있지 않은 영속 클래스들의 인스턴스들. 그것들은 어플리케이션에 의해 초기화
|
||
|
되었고 (아직) 영속화 되지 않았거나 그것들은 닫혀진<literal>Session</literal>에 의해 초기화 되었을 수도 있다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>Transaction (<literal>org.hibernate.Transaction</literal>)</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
(옵션) 작업의 원자 단위를 지정하기 위해 어플리케이션에 의해 사용되는 단일 쓰레드이고, 수명이 짧은 객체. 기본 JDBC, JTA
|
||
|
또는 CORBA 트랜잭션으로부터 어플리케이션을 추상화 시킨다. 몇몇 경우들에서 하나의 <literal>Session</literal>은
|
||
|
여러 개의 <literal>Transaction</literal>들에 걸칠 수 있다. 하지만 기본 API 또는 <literal>Transaction</literal>을
|
||
|
사용하는 트랜잭션 경계 설정은 결코 옵션이 아니다!
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>ConnectionProvider (<literal>org.hibernate.connection.ConnectionProvider</literal>)</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
(옵션) JDBC 커넥션들에 대한 팩토리(그리고 그것들의 pool). 기본 <literal>Datasource</literal> 또는
|
||
|
<literal>DriverManager</literal>로부터 어플리케이션을 추상화 시킨다. 어플리케이션에 노출되지는 않지만
|
||
|
개발자에 의해 확장/구현 된다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>TransactionFactory (<literal>org.hibernate.TransactionFactory</literal>)</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
(옵션) <literal>Transaction</literal> 인스턴스들에 대한 팩토리. 어플리케이션에 노출되지는 않지만 개발자에 의해
|
||
|
확장/구현 된다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term><emphasis>Extension Interfaces</emphasis></term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
Hibernate는 당신의 영속 계층의 특성을 맞춤화 시키기 위해 당신이 구현할 수 있는 선택적인 확장 인터페이스들을 제공한다.
|
||
|
상세한 것은 API 문서를 보라.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
</variablelist>
|
||
|
</para>
|
||
|
|
||
|
<para>
|
||
|
주어진 "경량급" 아키텍처의 경우, 어플리케이션은 JTA 또는 JDBC와 직접 대화하기 위해서 <literal>Transaction</literal>/<literal>TransactionFactory</literal>
|
||
|
그리고/또는 <literal>ConnectionProvider</literal> API들을 무시한다.
|
||
|
</para>
|
||
|
</sect1>
|
||
|
|
||
|
<sect1 id="architecture-states" revision="1">
|
||
|
<title>인스턴스 상태들</title>
|
||
|
<para>
|
||
|
영속 클래스들의 인스턴스는 세개의 상태들 중 하나 일 수 있다. 그것들(상태들)은 영속 컨텍스트(<emphasis>persistence context</emphasis>)에
|
||
|
대해 정의된다. Hibernate <literal>Session</literal> 객체는 영속 컨텍스트이다:
|
||
|
</para>
|
||
|
|
||
|
<variablelist spacing="compact">
|
||
|
<varlistentry>
|
||
|
<term>transient</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
인스턴스는 임의의 컨텍스트와 연관되어 있지 않고, 결코 연관된 적이 없었다. 그것은 영속 식별자(프라이머리 키 값)을 갖지 않는다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>persistent</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
인스턴스는 현재 영속 컨텍스트와 연관되어 있다. 그것은 영속 식별자(프라이머리 키 값) 그리고 아마 데이터베이스 내에 있는 대응하는
|
||
|
행을 갖는다. 특별한 영속 컨텍스트의 경우, Hibernate는 영속 identity가 Java identity(객체의 메모리 내 위치)와 같다는 점을
|
||
|
<emphasis>보증한다</emphasis>.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>detached</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
인스턴스는 영속 컨텍스트와 한번 연관되었지만, 그 컨텍스트가 닫혔거나, 그 인스턴스가 또 다른 프로세스로 직렬화 되었다. 그것은 영속
|
||
|
identity 그리고, 아마 데이터베이스 내에 대응하는 행을 갖는다. detached 인스턴스들의 경우, Hibernate는 영속 identity과
|
||
|
Java identity 사이의 관계를 보증하지 않는다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
</variablelist>
|
||
|
</sect1>
|
||
|
|
||
|
<sect1 id="architecture-jmx" revision="1">
|
||
|
<title>JMX 통합</title>
|
||
|
|
||
|
<para>
|
||
|
JMX는 자바 컴포넌트 관리를 위한 J2EE 표준이다. Hibernate는 JMX 표준 서비스를 통해 관리될 수도 있다. 우리는 배포본 내에 MBean 구현,
|
||
|
<literal>org.hibernate.jmx.HibernateService</literal>를 제공한다.
|
||
|
</para>
|
||
|
|
||
|
<para>
|
||
|
JBoss 어플리케이션 서버 상에 Hibernae를 JMX 서비스로서 배치하는 방법에 대한 예제는 JBoss 사용자 가이드를 보길 바란다. JBoss
|
||
|
어플리케이션 서버 상에서, 만일 당신이 JMX를 사용하여 배치할 경우 당신은 또한 다음 이점들을 얻는다:
|
||
|
</para>
|
||
|
|
||
|
<itemizedlist>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
<emphasis>Session 관리:</emphasis> Hibernate <literal>Session</literal>의 생명주기가 JTA 트랜잭션의
|
||
|
영역 내에 자동적으로 바인드 될 수 있다. 이것은 당신이 더이상 <literal>Session</literal>을 수작업으로 열고 닫지 않아도
|
||
|
됨을 의미하고, 이것은 JBoss EJB 인터셉터의 업무가 된다. 당신은 또한 더 이상 당신의 코드 어느 곳에서든 트랜잭션 경계설정에
|
||
|
대해 걱정하지 않아도 된다(당신이 물론 이식성 있는 영속 계층을 작성하고자 원하지 않는한, 이를 위해 옵션 Hibernate <literal>Transaction</literal>
|
||
|
API를 사용하라). 당신은 <literal>Session</literal>에 접근하기 위해 <literal>HibernateContext</literal>를 호출한다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
<emphasis>HAR 배치:</emphasis> 대개 당신은 JBoss 서비스 배치 디스크립터를 사용하여 Hibernate JMX 서비스를
|
||
|
(EAR 과/또는 SAR 파일로) 배치하고, 그것은 Hibernate <literal>SessionFactory</literal>의 통상적인 구성
|
||
|
옵션들 모두를 지원한다. 하지만 당신은 여전히 모든 당신의 매핑 파일들을 배치 디스크립터 속에 명명해야 한다. 만일 당신이
|
||
|
옵션 HAR 배치를 사용하고자 결정하는 경우, JBoss는 당신의 HAR 파일 내에 있는 모든 매핑 파일들을 자동적으로 검출해낼 것이다.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</itemizedlist>
|
||
|
|
||
|
<para>
|
||
|
이들 옵션들에 대한 추가 정보는 JBoss 어플리케이션 서버 사용자 가이드를 참조하라.
|
||
|
</para>
|
||
|
|
||
|
<para>
|
||
|
JMX 서비스로서 이용 가능한 또다른 특징은 런타임 Hibernate 통계이다.
|
||
|
<xref linkend="configuration-optional-statistics"/>를 보라.
|
||
|
</para>
|
||
|
</sect1>
|
||
|
|
||
|
<sect1 id="architecture-jca" revision="1">
|
||
|
<title>JCA 지원</title>
|
||
|
<para>
|
||
|
Hibernate는 JCA 커넥터로서 구성될 수도 있다. 상세한 것은 웹 사이트를 보길 바란다. Hibernate JCA 지원은 여전히 실험적으로
|
||
|
검토 중에 있음을 노트하길 바란다.
|
||
|
</para>
|
||
|
</sect1>
|
||
|
|
||
|
</chapter>
|
||
|
|