Author: jdkim528
Date: 2007-02-25 00:35:21 -0500 (Sun, 25 Feb 2007)
New Revision: 11242
Modified:
trunk/Hibernate3/doc/reference/ko/modules/tutorial.xml
Log:
Added warnings about session-per-operation anti-pattern
Modified: trunk/Hibernate3/doc/reference/ko/modules/tutorial.xml
===================================================================
--- trunk/Hibernate3/doc/reference/ko/modules/tutorial.xml 2007-02-25 05:34:40 UTC (rev
11241)
+++ trunk/Hibernate3/doc/reference/ko/modules/tutorial.xml 2007-02-25 05:35:21 UTC (rev
11242)
@@ -562,7 +562,7 @@
</sect2>
- <sect2 id="tutorial-firstapp-workingpersistence"
revision="4">
+ <sect2 id="tutorial-firstapp-workingpersistence"
revision="5">
<title>객체 로딩과 객체 저장</title>
<para>
@@ -622,21 +622,40 @@
</para>
<para>
+
<literal>sessionFactory.getCurrentSession()</literal>은 무엇을
행하는가? 먼저
당신은 당신이 (<literal>HibernateUtil</literal> 덕분에
쉽게) <literal>SessionFactory</literal>을
당신이 소유하고 있다면, 원하는 만큼 어디서든 여러번 그것을 호출할 수 있다.
<literal>getCurrentSession()</literal> 메소드는 항상
"현재의" 작업 단위를 반환한다. 우리가
<literal>hibernate.cfg.xml</literal> 내에서 이 매커니즘에 대한 구성 옵션을
"thread"로 전환시켰음을 기억하는가?
- 그러므로 현재 작업 단위의 영역은 우리의 어플리케이션을 실행시키는 현재의 Java 쓰레드이다. 하지만
이것은
- 전부가 진실은 아니다. 그것이 처음으로 필요로 되고,
<literal>getCurrentSession()</literal>을 첫번째로
- 호출할 때 <literal>Session</literal>이 시작된다. 그때
현째의 쓰레드에 대해 Hibernate에 의해 바인드 된다.
- 트랜잭션이 종료될 때 커밋 되거나 롤백되고, Hibernate는 또한 쓰레드로부터
<literal>Session</literal>을
- 바인드 해제시키고 당신을 위해 그것을 닫는다. 만일 당신이
<literal>getCurrentSession()</literal>을 다시
- 호출한다면, 당신은 새로운 <literal>Session</literal>을
얻고 새로운 작업단위를 시작할 수 있다. 이
- <emphasis>thread-bound</emphasis> 프로그래밍 모형은 Hibernate를 사용하는
가장 대중적인 방법이다.
+ 그러므로 작업의 현재 단위는 우리의 어플리케이션을 실행시키는 현재 자바 쓰레드에 묶여 있다. 하지만
+ 이것은 전체 그림이 아니며, 당신은 또한 scope(영역), 작업 단위가 시작될 때와 작업 단위가 종료될 때를
+ 고려해야 한다.
</para>
<para>
+ <literal>Session</literal>은 그것이 처음으로 필요로 되고
<literal>getCurrentSession()</literal>에 대한
+ 첫 번째 호출이 이루어질 때 시작된다. 그때 그것은 Hibernate에 의해 현재의 쓰레드에 바인드 된다.
+ 커밋되든 롤백되든 간에 트랜잭션이 종료되고, Hibernate가 자동적으로 그 쓰레드로부터
<literal>Session</literal>을
+ 바인드 해제시키고 당신을 위해 세션을 닫는다. 만일 당신이
<literal>getCurrentSession()</literal>을 다시
+ 호출한다면, 당신은 새로운 <literal>Session</literal>을 얻고 새로운 작업단위를 시작할
수 있다.
+ 이 <emphasis>thread-bound</emphasis> 프로그래밍 모형은 Hibernate를
사용하는 가장 대중적인 방법이다.
+ 왜냐하면 그것은 당신의 코드를 유연하게 계층화시키는 것을 허용해주기 때문이다(트랜잭션 경계 분할 코드는
+ 데이트 접근 코드와 구별지워질 수 있는데, 우리는 이 튜토리얼의 뒷부분에서 이것을 다룰 것이다.).
+ </para>
+
+ <para>
+ 작업 영역의 단위와 관련하여, Hibernate <literal>Session</literal>은 하나 또는
여러 개의 데이터베이스
+ 오퍼레이션들을 실행시키는데 사용될 수 있는가? 위의 예제는 하나의 오퍼레이션에 한 개의
<literal>Session</literal>을
+ 사용하고 있다. 이것은 순진한 일치이며, 예제는 어떤 다른 접근법을 보여주기에는 충분히 복잡하지 않다.
+ Hibernate <literal>Session</literal>의 scope(영역)은 유연하지만 당신은 결코
<emphasis>모든</emphasis>
+ 데이터베이스 오퍼레이션 각각에 대해 새로운 Hibernate <literal>Session</literal>을
사용하도록
+ 당신의 어플리케이션을 설계할 수 없다. 따라서 심지어 당신이 다음의 (매우 사소한) 예제들에서 여러 번
+ 그것을 볼 수 있을지라도 <emphasis>session-per-operation</emphasis>을 하나의
안티-패턴으로 간주하라.
+ 실제 (웹) 어플리케이션은 이 튜토리얼의 뒷부분에 보여진다.
+ </para>
+
+ <para>
트랜잭션 핸들링과 경계구분에 대한 추가 정보는 <xref
linkend="transactions"/>을 살펴보라.
우리는 또한 앞의 예제에서 임의의 오류 처리와 롤백을 생략했다.
</para>
@@ -1201,7 +1220,7 @@
그것은 새로운 이벤트들을 입력하기 위한 HTML form을 제공한다.
</para>
- <sect2 id="tutorial-webapp-servlet" revision="1">
+ <sect2 id="tutorial-webapp-servlet" revision="2">
<title>기본 서블릿 작성하기</title>
<para>
@@ -1257,6 +1276,12 @@
사용하지 않는다).
</para>
+ <para>
+ 모든 데이터베이스 오퍼레이션 각각에 대해 새로운 Hibernate
<literal>Session</literal>을 사용하지 <emphasis>말라</emphasis>.
+ 전체 요청에 대해 영역지워진 한 개의 Hibernate <literal>Session</literal>을
사용하라. 그것이 자동적으로 현재의 자바 쓰레드에 바인드되도록
+ <literal>getCurrentSession()</literal>을 사용하라.
+ </para>
+
<para>
다음으로, 요청의 가능한 액션들이 처리되고 응답 HTML이 렌더링된다. 우리는 곧장 그부분으로 갈
것이다.
</para>
Show replies by date