<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>GGwanG's. 꿈★은 이루어진다.</title>
	<link>http://ggwangs.egloos.com</link>
	<description>꿈을 향해 한발짝 다가서기~</description>
	<language>ko</language>
	<pubDate>Tue, 12 May 2009 15:25:55 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>GGwanG's. 꿈★은 이루어진다.</title>
		<url>http://pds11.egloos.com/logo/200809/03/08/f0065208.jpg</url>
		<link>http://ggwangs.egloos.com</link>
		<width>80</width>
		<height>57</height>
		<description>꿈을 향해 한발짝 다가서기~</description>
	</image>
  	<item>
		<title><![CDATA[  Non Blocking I/O [ C 언어] ]]> </title>
		<link>http://ggwangs.egloos.com/1483052</link>
		<guid>http://ggwangs.egloos.com/1483052</guid>
		<description>
			<![CDATA[ 
  <p>소켓호출의 디폴트 동작은 요구된 행위가 종료될때까지 불록되는 것이다. recv()함수는 적어도 하나의 메세지를 받을때까지는 반환하지 않는다. send()의 경우 전송할 데이타를 저장할 공간이 충분하지 못하면 블록된다.<br><br>TCP 연결에 관련도니 함수들은 연결이 설정될때까지&nbsp; 블록된다. 예를 들면 accept()는 클라이언트가 connect() 호 연결을 설정할때까지 블록된다. 하지만 UDP의 경우 중간의 패킷이 유실되었다고 가정하자, 그러면 recvfrom()은 영원히 블록되어 있어야 할 것이다.<br><br>이런 경우 어느 정도 시간이 지난후 블록에서 풀려 클라이언트가 데이터그램 유실을 처리할 수 있도록 해야 할것이다.<br><br><strong><span style="COLOR: #ff0000">해결책</span></strong><br>원하지 않는 블로킹 문제를 해결하기 위해서는 소켓의 동작을 변경 시켜 nonblocking이 되도록 설정하는 것이다. 이런 경우 소켓에 대해 만약 요구된 연산이 즉시 완료된다면 성공을 반환하고 그렇지 않으면 실패(보통 -1) 을 반환한다. 실패의 경우 불록에 의한 실패인지 아니면 다른 형태의 실패인지 구분할 수 있어야 한다. <br><br>TCP 통신의 경우 connect()가 블록에 으해 실패했다면 error를 EINPROGRESS 반환하고, 다른 경우에는 EWOULBLOCK이 반환된다.<br><br>디폴트 불로킹 동작은 fcnt() 이나 ioctl() 호출로 제어할 수 있다. </p>			 ]]> 
		</description>
		<category>JAVA</category>

		<comments>http://ggwangs.egloos.com/1483052#comments</comments>
		<pubDate>Tue, 12 May 2009 15:25:28 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[  함수 총정리 ]]> </title>
		<link>http://ggwangs.egloos.com/1350265</link>
		<guid>http://ggwangs.egloos.com/1350265</guid>
		<description>
			<![CDATA[ 
  <p>1. 문자 함수<br>&nbsp;1-1) CHR<br>&nbsp;1-2) CONCAT 함수 <br>&nbsp;1-3) INITCAP 함수 <br>&nbsp;1-4) LOWER 함수 <br>&nbsp;1-5) LPAD 함수 <br>&nbsp;1-6) LTRIM 함수 <br>&nbsp;1-7) NLS_INITCAP 함수 <br>&nbsp;1-8) NLS_LOWER 함수 <br>&nbsp;1-9) NLSSORT 함수 <br>&nbsp;1-10) NLS_UPPER 함수 <br>&nbsp;1-11) REPLACE 함수<br>&nbsp;1-12) RPAD 함수 <br>&nbsp;1-13) RTRIM 함수 <br>&nbsp;1-14) SOUNDEX 함수 <br>&nbsp;1-15) SUBSTR 함수 <br>&nbsp;1-16) TRANSLATE 함수 <br>&nbsp;1-17) TREAT 함수 <br>&nbsp;1-18) TRIM 함수 <br>&nbsp;1-19) UPPER 함수 <br>&nbsp;1-20) ASCII 함수 <br>&nbsp;1-21) INSTR 함수 <br>&nbsp;1-22) LENGTH 함수 </p><p><br>2. 날짜 처리함수(datetime function)<br>&nbsp;2-1) ADD_MONTHS 함수 <br>&nbsp;2-2) CURRENT_DATE 함수 <br>&nbsp;2-3) URRENT_TIMESTAMP 함수 <br>&nbsp;2-4) DBTIMEZONE 함수 <br>&nbsp;2-5) EXTRACT(datetime) 함수 <br>&nbsp;2-6) FROM_TZ 함수 <br>&nbsp;2-7) LAST_DAY 함수 <br>&nbsp;2-8) LOCALTIMESTAMP 함수&nbsp; <br>&nbsp;2-9) MONTHS_BETWEEN 함수 <br>&nbsp;2-10) NEW_TIME 함수 <br>&nbsp;2-11) NEXT_DAY 함수 <br>&nbsp;2-12) NUMTODSINTERVAL 함수 <br>&nbsp;2-13) NUMTOYMINTERVAL 함수 <br>&nbsp;2-14) ROUND(date) 함수 <br>&nbsp;2-15) SESSIONTIMEZONE 함수 <br>&nbsp;2-16) SYS_EXTRACT_UTC 함수 <br>&nbsp;2-17) SYSDATE 함수 <br>&nbsp;2-18) SYSTIMESTAMP 함수 <br>&nbsp;2-19) TO_DSINTERVAL 함수<br>&nbsp;2-20) TO_TIMESTAMP 함수 <br>&nbsp;2-21) TO_TIMESTAMP_TZ 함수 <br>&nbsp;2-22) TO_YMINTERVAL 함수 <br>&nbsp;2-23) TRUNC(date) 함수 <br>&nbsp;2-24) TZ_OFFSET 함수</p><p><br>3.데이터 형 변환 함수(conversion function)<br>&nbsp;3-1) ASCIISTR 함수 <br>&nbsp;3-2) BIN_TO_NUM 함수<br>&nbsp;3-3) CAST 함수 <br>&nbsp;3-4) CHARTOROWID 함수 <br>&nbsp;3-5) COMPOSE 함수&nbsp; <br>&nbsp;3-6) CONVERT 함수 <br>&nbsp;3-7) HEXTORAW 함수 <br>&nbsp;3-8) NUMTODSINTERVAL 함수 <br>&nbsp;3-9) NUMTOYMINTERVAL 함수 <br>&nbsp;3-10) RAWTOHEX 함수 <br>&nbsp;3-11) RAWTONHEX 함수 <br>&nbsp;3-12) ROWIDTOCHAR 함수<br>&nbsp;3-13) ROWIDTONCHAR 함수 <br>&nbsp;3-14) TO_CHAR(character) 함수 <br>&nbsp;3-15) TO_CLOB 함수 <br>&nbsp;3-16) TO_DSINTERVAL 함수 <br>&nbsp;3-17) TO_LOB 함수 <br>&nbsp;3-18) TO_MULTI_BYTE 함수 <br>&nbsp;3-19) TO_NCHAR(character) 함수 <br>&nbsp;3-20) TO_NCHAR(datetime) 함수 <br>&nbsp;3-21) TO_NCHAR(number) 함수 <br>&nbsp;3-22) TO_NCLOB 함수 <br>&nbsp;3-23) TO_NUMBER 함수 <br>&nbsp;3-24) TO_SINGLE_BYTE 함수 <br>&nbsp;3-25) TO_YMINTERVAL 함수 <br>&nbsp;3-26) TRANSLATE ... USING 함수 <br>&nbsp;3-27) UNISTR 함수</p><p><br>4. 기타함수(miscellaneous single row function)<br>&nbsp;4-1) BFILENAME 함수 <br>&nbsp;4-2) COALESCE 함수 <br>&nbsp;4-3) DECODE 함수 <br>&nbsp;4-4) DEPTH 함수 <br>&nbsp;4-5) DUMP 함수 <br>&nbsp;4-6) EMPTY_BLOB 함수 <br>&nbsp;4-7) EMPTY_CLOB 함수 <br>&nbsp;4-8) EXISTSNODE 함수 <br>&nbsp;4-9) EXTRACT(XML) 함수 <br>&nbsp;4-10) EXTRACTVALUE 함수 <br>&nbsp;4-11) GREATEST 함수 <br>&nbsp;4-12) LEAST 함수 <br>&nbsp;4-13) NLS_CHARSET_DECL_LEN 함수 <br>&nbsp;4-14) NLS_CHARSET_ID 함수 <br>&nbsp;4-15) NLS_CHARSET_NAME 함수 <br>&nbsp;4-16) NULLIF 함수 <br>&nbsp;4-17) NVL2 함수 <br>&nbsp;4-18) PATH 함수 <br>&nbsp;4-19) SYS_CONNECT_BY_PATH 함수 <br>&nbsp;4-20) SYS_CONTEXT 함수 <br>&nbsp;4-21) SYS_DBURIGEN 함수 <br>&nbsp;4-22) SYS_EXTRACT_UTC 함수 <br>&nbsp;4-23) SYS_GUID 함수 <br>&nbsp;4-24) SYS_XMLAGG 함수 <br>&nbsp;4-25) SYS_XMLGEN 함수 <br>&nbsp;4-26) UID 함수 <br>&nbsp;4-27) USER 함수 <br>&nbsp;4-28) USERENV 함수 <br>&nbsp;4-29) VSIZE 함수 <br>&nbsp;4-30) XMLAGG 함수 <br>&nbsp;4-31) XMLCOLATTVAL 함수 <br>&nbsp;4-32) XMLCONCAT 함수 <br>&nbsp;4-33) XMLFOREST 함수 <br>&nbsp;4-34) XMLELEMENT 함수</p><p><br>5.그룹함수&nbsp; Aggregate 함수<br>&nbsp;5-1) AVG* 함수 <br>&nbsp;5-2) CORR* CORR* 함수 <br>&nbsp;5-3) COUNT* 함수 <br>&nbsp;5-4) COVAR_POP 함수 <br>&nbsp;5-5) COVAR_SAMP 함수<br>&nbsp;5-6) CUME_DIST 함수 <br>&nbsp;5-7) DENSE_RANK 함수 <br>&nbsp;5-8) FIRST 함수 <br>&nbsp;5-9) GROUP_ID 함수 <br>&nbsp;5-10) Grouping 함수 <br>&nbsp;5-11) GROUPING_ID 함수 <br>&nbsp;5-12) LAST 함수 <br>&nbsp;5-13) MAX 함수 <br>&nbsp;5-14) MIN 함수 <br>&nbsp;5-15) PERCENTILE_CONT 함수 <br>&nbsp;5-16) PERCENTILE_DISC 함수 <br>&nbsp;5-17) PERCENT_RANK 함수 <br>&nbsp;5-18) RANK 함수 <br>&nbsp;5-19) REGR_(linear regression) function* 함수 <br>&nbsp;5-20) STDDEV 함수 <br>&nbsp;5-21) STDDEV_POP 함수 <br>&nbsp;5-22) STDDEV_SAMP 함수 <br>&nbsp;5-23) SUM 함수 <br>&nbsp;5-24) VAR_POP 함수 <br>&nbsp;5-25) VAR_SAMP 함수 <br>&nbsp;5-26) VARIANCE 함수 <br>&nbsp;5-27) Grouping sets 함수</p><p><br>6. Analytic 함수<br>&nbsp;6-1) AVG* 함수 <br>&nbsp;6-2) CORR* CORR* 함수 <br>&nbsp;6-3) COUNT* 함수 <br>&nbsp;6-4) COVAR_SAMP 함수 <br>&nbsp;6-5) CUME_DIST 함수 <br>&nbsp;6-6) DENSE_RANK 함수 <br>&nbsp;6-7) FIRST 함수 <br>&nbsp;6-8) FIRST_VALUE 함수 <br>&nbsp;6-9) LAG 함수 <br>&nbsp;6-10) LAST_VALUE 함수 <br>&nbsp;6-11) LEAD 함수 <br>&nbsp;6-12) NTILE 함수 <br>&nbsp;6-13) RATIO_TO_REPORT 함수 <br>&nbsp;6-14) ROW_NUMBER 함수</p><p><br>7. 객체 참조 함수<br>&nbsp;7-1) REF 타입</p><p><br>8. PseudoColumn을 의미하는 것<br>&nbsp;8-1) ROWID 컬럼 <br>&nbsp;8-2) ROWNUM 컬럼</p><br/><br/>tag : <a href="/tag/oracle" rel="tag">oracle</a>,&nbsp;<a href="/tag/함수" rel="tag">함수</a>			 ]]> 
		</description>
		<category>ORACLE</category>
		<category>oracle</category>
		<category>함수</category>

		<comments>http://ggwangs.egloos.com/1350265#comments</comments>
		<pubDate>Fri, 06 Feb 2009 02:55:56 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[ iBatis 동적 SQL 작성 ]]> </title>
		<link>http://ggwangs.egloos.com/1350196</link>
		<guid>http://ggwangs.egloos.com/1350196</guid>
		<description>
			<![CDATA[ 
  <span style="FONT-SIZE: 100%">실무에서&nbsp;SQL문을 작성하다 보면 동적인 쿼리문 작성을 작성해야 할 때가 많이 있다.</span><p><span style="FONT-SIZE: 100%">이때 지겹게 if~else if 문을 통해 아주 지저분한 소스 코드를 생성할 때가 왕왕 있게 마련이다.</span></p><p><span style="FONT-SIZE: 100%">이때 ibatis에서는 아주 깔금하게 구현할 수 있는 방법을 제공해 준다.</span></p><p>&nbsp;</p><p><span style="FONT-SIZE: 100%">&lt;statement id="dynamicGetAccountList" resultMap="account-result"&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp; select * from account</span></p><p><span style="FONT-SIZE: 100%">&nbsp; &lt;dynamic prepend="WHERE"&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp; &lt;isNotNull prepend="AND" property="firstName"&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (acc_first_name = #firstName#</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp; &lt;isNotNull prepend="OR" property="lastName"&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acc_last_name = #lastName#</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/isNotNull&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp; )</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp; &lt;/isNotNull&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp; &lt;isNotNull prepend="AND" property="emailAddress"&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acc_email like #emailAddress#</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp; &lt;/isNotNull&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp;&nbsp;&lt;isGreaterThan prepend="AND" property="id" campareValue="0"&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acc_id = #id#</span></p><p><span style="FONT-SIZE: 100%">&nbsp;&nbsp;&nbsp; &lt;/isGreaterThan&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp; &lt;/dynamic&gt;</span></p><p><span style="FONT-SIZE: 100%">&nbsp; order by acc_last_name</span></p><p><span style="FONT-SIZE: 100%">&lt;/statement&gt;</span></p><p>&nbsp;</p><p><span style="FONT-SIZE: 100%">상황에 의존적인 위 동적 statement로 부터 각각 다른 16가지의 SQL문이 생성될 수 있다. if-else구조와 문자열 연결을 코딩하는 경우 수백라인이 필요할 수도 있다.</span></p><p><span style="FONT-SIZE: 100%">동적 statement를 사용하는 것은 몇몇 조건적인 태그를 추가하는 것처럼 간단하게 작성할 수 있다.</span></p><p>&nbsp;</p><p><span style="FONT-SIZE: 100%">이러한 조건들에 대해 간단히 정리하면 아래와 같다.</span></p><p>&nbsp;</p><p><span style="FONT-SIZE: 100%">바이너리 조건 요소-바이너리 조건 요소는 정적값 또는 다른 프로퍼티값을 위한 프로퍼티값과 비교한다. 만약 결과가 true라면 몸체부분의 SQL쿼리가 포함된다.</span></p><p>&nbsp;</p><p><span style="FONT-SIZE: 100%">바이너리 조건 속성</span></p><p><span style="FONT-SIZE: 100%"><p><table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">prepend<?XML:NAMESPACE PREFIX = O /><o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span lang="EN-US">Statement</span>에 붙을 오버라이딩 가능한 <span lang="EN-US">SQL</span>부분<span lang="EN-US">(</span>옵션<span lang="EN-US">)<o:P></o:P></span></span></p></td></tr><tr style="mso-yfti-irow: 1"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">property<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">비교되는 <span lang="EN-US">property(</span>필수<span lang="EN-US">)<o:P></o:P></span></span></p></td></tr><tr style="mso-yfti-irow: 2"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">compareProperty<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">비교되는 다른 <span lang="EN-US">property (</span>필수 또는 <span lang="EN-US">compareValue)<o:P></o:P></span></span></p></td></tr><tr style="mso-yfti-irow: 3; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">compareValue<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">비교되는 값<span lang="EN-US">(</span>필수 또는 <span lang="EN-US">compareProperty)<o:P></o:P></span></span></p></td></tr></tbody></table></p><p>&nbsp;</p><p><table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isEqual&gt;<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 값 또는 다른 프로퍼티가 같은지 체크<span lang="EN-US"><o:P></o:P></span></span></p></td></tr><tr style="mso-yfti-irow: 1"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isNotEqual&gt;<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 값 또는 다른 프로퍼티가 같지 않은지 체크<span lang="EN-US"><o:P></o:P></span></span></p></td></tr><tr style="mso-yfti-irow: 2"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isGreaterThan&gt;<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 값 또는 다른 프로퍼티 보다 큰지 체크<span lang="EN-US"><o:P></o:P></span></span></p></td></tr><tr style="mso-yfti-irow: 3"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isGreaterEqual&gt;<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 값 또는 다른 프로퍼티 보다 크거나 같은지 체크<span lang="EN-US"><o:P></o:P></span></span></p></td></tr><tr style="mso-yfti-irow: 4"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isLessThan&gt;<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 값 또는 다른 프로퍼티 보다 작은지 체크<span lang="EN-US"><o:P></o:P></span></span></p></td></tr><tr style="mso-yfti-irow: 5; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isLessEqual&gt;<o:P></o:P></span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 값 또는 다른 프로퍼티 보다 작거나 같은지 체크</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">사용법 예제)</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">&lt;isLessEqual prepend="AND" property="age" compareValue="18"&gt;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">&nbsp; ADOLESCENT = ’TRUE’</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">&lt;/isLessEqual&gt;</span></p></td></tr></tbody></table></p><p>&nbsp;</p></span><p></p><p><span style="FONT-SIZE: 100%">단일 조건 요소-단일 조건 요소는 특수한 조건을 위해 프로퍼티의 상태를 체크한다.</span></p><p><span style="FONT-SIZE: 100%"><table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">prepend</span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span lang="EN-US">statement</span>에 붙을 오버라이딩 가능한 <span lang="EN-US">SQL</span>부분<span lang="EN-US">(</span>옵션<span lang="EN-US">)</span></span></p></td></tr><tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">property</span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="441"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">체크하기 위한 프로퍼티<span lang="EN-US">(</span>필수<span lang="EN-US">)</span></span></p></td></tr></tbody></table></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">&nbsp;</span></o:P></span></p><p><table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext; mso-table-layout-alt: fixed" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 137pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="183"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isPropertyAvailable&gt;</span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 299pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="399"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 유효한지 체크</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span lang="EN-US">(</span>이를 테면 파라미터의 프로퍼티이다<span lang="EN-US">.)</span></span></p></td></tr><tr style="mso-yfti-irow: 1"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 137pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="183"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isNotPropertyAvailable&gt;</span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 299pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="399"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 유효하지 않은지 체크</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span lang="EN-US">(</span>이를 테면 파라미터의 프로퍼티가 아니다<span lang="EN-US">.)</span></span></p></td></tr><tr style="mso-yfti-irow: 2"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 137pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="183"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isNull&gt;</span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 299pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="399"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 <span lang="EN-US">null</span>인지 체크</span></p></td></tr><tr style="mso-yfti-irow: 3"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 137pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="183"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isNotNull&gt;</span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 299pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="399"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">프로퍼티가 <span lang="EN-US">null</span>이 아닌지 체크</span></p></td></tr><tr style="mso-yfti-irow: 4"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 137pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="183"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isEmpty&gt;</span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 299pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="399"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span lang="EN-US">Collection, </span>문자열 또는 <span lang="EN-US">String.valueOf() </span>프로퍼티가 <span lang="EN-US">null</span>이거나 <span lang="EN-US">empty(</span><span style="FONT-FAMILY: 돋움"><span lang="EN-US" style="FONT-FAMILY: ’Times New Roman’; mso-ascii-font-family: 바탕">“”</span><span lang="EN-US"> or size() &lt; 1)</span>인지 체크</span></span></p></td></tr><tr style="mso-yfti-irow: 5; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 137pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="183"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">&lt;isNotEmpty&gt;</span></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 299pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="399"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-INDENT: -10pt; mso-char-indent-count: -1.0"><span style="FONT-SIZE: 100%"><span lang="EN-US">Collection, </span>문자열 또는 <span lang="EN-US">String.valueOf() </span>프로퍼티가 <span lang="EN-US">null </span>이아니거나 <span lang="EN-US">empty(</span><span style="FONT-FAMILY: 돋움"><span lang="EN-US" style="FONT-FAMILY: ’Times New Roman’; mso-ascii-font-family: 바탕">“”</span><span lang="EN-US"> or size() &lt; 1)</span>가 아닌지 체크</span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-INDENT: -10pt; mso-char-indent-count: -1.0">&nbsp;</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-INDENT: -10pt; mso-char-indent-count: -1.0"><span style="FONT-SIZE: 100%">사용법 예제<span lang="EN-US">)</span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-INDENT: -10pt; mso-char-indent-count: -1.0"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%; FONT-FAMILY: 바탕">&lt;isNotEmpty prepend="AND" property="firstName"&gt;</span></o:P></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-INDENT: -10pt; mso-char-indent-count: -1.0"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%; FONT-FAMILY: 바탕">&nbsp; FIRST_NAME = #firstName#</span></o:P></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-INDENT: -10pt; mso-char-indent-count: -1.0"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%; FONT-FAMILY: 바탕">&lt;/isNotEmpty&gt;</span></o:P></span></p></td></tr></tbody></table></p><p>&nbsp;</p><p>다른 요소들</p><p>Parameter Present : 파라미터 객체가 존재하는지 체크</p><p>Parameter Present Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분</p><p><table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="151"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">&lt;isParameterPresent&gt;</span></o:P></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 321.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="429"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">파라미터 객체가 존재(not null)하는지 체크</span></o:P></span></p></td></tr><tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">&lt;isNotParameterPresent&gt;</span></o:P></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #f1f0ee; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 321.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">파라미터 객체가 존재하지(null) 않는지 체크</span></o:P></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P></o:P></span>&nbsp;</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">사용법 예제)</span></o:P></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">&lt;isNotParameterPresent prepend="AND"&gt;</span></o:P></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">EMPLOYEE_TYPE = ’DEFAULT’</span></o:P></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">&lt;/isNotParameterPresent&gt;</span></o:P></span></p></td></tr></tbody></table></p><p>&nbsp;</p><p>Iterate : 이 태그는 Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다.</p><p>Iterate Attributes :</p><p>&nbsp; prepend - the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션)</p><p>&nbsp; property - 반복되기 위한 java.util.List타입의 프로퍼티 (필수)</p><p>&nbsp; open - 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션)</p><p>&nbsp; close - 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션)</p><p>&nbsp; conjunction - 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)</p><p><table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 4cm; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="151"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:P><span style="FONT-SIZE: 100%">&lt;iterate&gt;</span></o:P></span></p></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #f1f0ee; WIDTH: 321.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="429"><p>java.util.List 타입의 프로퍼티 반복</p><p>&nbsp;</p><p>사용법 예제)</p><p>&lt;iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR"&gt;</p><p>username = #userNameList[]#</p><p>&lt;/iterate&gt;</p><p>&nbsp;</p><p>주의:iterator요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다.</p></td></tr></tbody></table></p><p>&nbsp;</p><br/><br/>tag : <a href="/tag/ibatis" rel="tag">ibatis</a>			 ]]> 
		</description>
		<category>JAVA</category>
		<category>ibatis</category>

		<comments>http://ggwangs.egloos.com/1350196#comments</comments>
		<pubDate>Fri, 06 Feb 2009 01:58:15 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 2009 CORVETTE ZR1: THE KING RETURNS ]]> </title>
		<link>http://ggwangs.egloos.com/1337637</link>
		<guid>http://ggwangs.egloos.com/1337637</guid>
		<description>
			<![CDATA[ 
  <h3><strong><a id="specs" name="specs"></a>SPECIFICATIONS </strong></h3><p><strong>Overview </strong></p><p><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top" width="172"><p>Model: </p></td><td valign="top" width="346"><p>Chevrolet Corvette ZR1 </p></td></tr><tr><td valign="top" width="172"><p>Body styles / driveline: </p></td><td valign="top" width="346"><p>two-door hatchback coupe with fixed roof; rear-wheel drive </p></td></tr><tr><td valign="top" width="172"><p>Construction: </p></td><td valign="top" width="346"><p>composite and carbon-fiber body panels, hydroformed aluminum frame with aluminum and magnesium structural and chassis components </p></td></tr><tr><td valign="top" width="172"><p>Manufacturing location: </p></td><td valign="top" width="346"><p>Bowling Green, Ky. </p></td></tr></tbody></table></p><p><strong>Engine </strong></p><p><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top" width="172"><p>&nbsp; </p></td><td valign="top" width="348"><p><strong>6.2L SUPERCHARGED V-8 (LS9)</strong><strong></strong></p></td></tr><tr><td valign="top" width="172"><p>Displacement (cu in / cc): </p></td><td valign="top" width="348"><p>376 / 6162 </p></td></tr><tr><td valign="top" width="172"><p>Bore &amp; stroke (in / mm): </p></td><td valign="top" width="348"><p>4.06 x 3.62 / 103.25 x 92 </p></td></tr><tr><td valign="top" width="172"><p>Block material: </p></td><td valign="top" width="348"><p>cast aluminum </p></td></tr><tr><td valign="top" width="172"><p>Cylinder head material: </p></td><td valign="top" width="348"><p>cast aluminum </p></td></tr><tr><td valign="top" width="172"><p>Valvetrain: </p></td><td valign="top" width="348"><p>overhead valve, two valves per cylinder </p></td></tr><tr><td valign="top" width="172"><p>Fuel delivery: </p></td><td valign="top" width="348"><p>SFI (sequential fuel injection) </p></td></tr><tr><td valign="top" width="172"><p>Compression ratio: </p></td><td valign="top" width="348"><p>9.1:1 </p></td></tr><tr><td valign="top" width="172"><p>Horsepower / kW: </p></td><td valign="top" width="348"><p>638 / 476 @ 6500* </p></td></tr><tr><td valign="top" width="172"><p>Torque (lb-ft / Nm): </p></td><td valign="top" width="348"><p>604 / 819 @ 3800* </p></td></tr><tr><td valign="top" width="172"><p>Recommended fuel: </p></td><td valign="top" width="348"><p>premium required </p></td></tr><tr><td valign="top" width="172"><p>EPA estimated fuel economy (city / hwy): </p></td><td valign="top" width="348"><p>14 / 20 </p></td></tr></tbody></table></p><p><strong>Transmission </strong></p><p><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td width="33%"><p>&nbsp; </p></td><td width="66%"><p><strong>close-ratio six-speed manual </strong></p></td></tr><tr><td width="33%"><p>Gear ratios (:1): </p></td><td width="66%"><p>&nbsp; </p></td></tr><tr><td width="33%"><p>First: </p></td><td width="66%"><p>2.29 </p></td></tr><tr><td width="33%"><p>Second: </p></td><td width="66%"><p>1.61 </p></td></tr><tr><td width="33%"><p>Third: </p></td><td width="66%"><p>1.21 </p></td></tr><tr><td width="33%"><p>Fourth: </p></td><td width="66%"><p>1.00 </p></td></tr><tr><td width="33%"><p>Fifth: </p></td><td width="66%"><p>0.81 </p></td></tr><tr><td width="33%"><p>Sixth: </p></td><td width="66%"><p>0.67 </p></td></tr><tr><td width="33%"><p>Reverse: </p></td><td width="66%"><p>3.11 </p></td></tr><tr><td width="33%"><p>Final drive ratio: </p></td><td width="66%"><p>3.42 </p></td></tr></tbody></table></p><p><strong>Chassis / Suspension</strong><strong></strong></p><p><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top" width="172"><p>Front: </p></td><td valign="top" width="348"><p>short/long arm ( SLA) double wishbone, cast aluminum upper &amp; lower control arms, transverse-mounted composite leaf spring, monotube shock absorber </p></td></tr><tr><td valign="top" width="172"><p>Rear: </p></td><td valign="top" width="348"><p>short/long arm ( SLA) double wishbone, cast aluminum upper &amp; lower control arms, transverse-mounted composite leaf spring, monotube shock absorber </p></td></tr><tr><td valign="top" width="172"><p>Traction control: </p></td><td valign="top" width="348"><p>electronic traction control; active handling (Magnetic Selective Ride Control) </p></td></tr></tbody></table></p><p><strong>Brakes </strong></p><p><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top" width="172"><p>Type: </p></td><td valign="top" width="348"><p>front and rear power-assisted carbon-ceramic disc with 6-piston front and four-piston rear calipers, cross-drilled rotors; ABS std. </p></td></tr><tr><td valign="top" width="172"><p>Rotor diameter (in / mm): </p></td><td valign="top" width="348"><p>front: 15.5 / 394<br>rear: 15 / 380 </p></td></tr></tbody></table></p><p><strong>Wheels &amp; Tires </strong></p><p><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top" width="172"><p>Wheel size: </p></td><td valign="top" width="348"><p>front: 19-inch x 10-inch <br>rear: 20-inch x 12-inch </p></td></tr><tr><td valign="top" width="172"><p>Tires: </p></td><td valign="top" width="348"><p>Michelin Pilot Sport 2 <br>front: P285/30ZR19 <br>rear: P335/25ZR20 </p></td></tr></tbody></table></p><p><strong>Dimensions </strong></p><p><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top" width="172"><p><strong>Exterior </strong></p></td><td valign="top" width="348"><p>&nbsp; </p></td></tr><tr><td valign="top" width="172"><p>Wheelbase (in / mm): </p></td><td valign="top" width="348"><p>105.7 / 2685 </p></td></tr><tr><td valign="top" width="172"><p>Overall length (in / mm): </p></td><td valign="top" width="348"><p>176.2 / 4476 </p></td></tr><tr><td valign="top" width="172"><p>Overall width (in / mm): </p></td><td valign="top" width="348"><p>75.9 / 1928 </p></td></tr><tr><td valign="top" width="172"><p>Overall height (in / mm): </p></td><td valign="top" width="348"><p>49 / 1244 </p></td></tr><tr><td valign="top" width="172"><p>Curb weight (lb / kg): </p></td><td valign="top" width="348"><p>3324 / 1507 </p></td></tr><tr><td valign="top" width="172"><p><strong>Interior</strong></p></td><td valign="top" width="348"><p>&nbsp; </p></td></tr><tr><td valign="top" width="172"><p>Seating capacity </p></td><td valign="top" width="348"><p>2 </p></td></tr><tr><td valign="top" width="172"><p>Interior volume (cu ft / L): </p></td><td valign="top" width="348"><p>52 / 1475 (all models) </p></td></tr><tr><td valign="top" width="172"><p>Headroom (in / mm): </p></td><td valign="top" width="348"><p>38 / 962 (all models) </p></td></tr><tr><td valign="top" width="172"><p>Legroom (in / mm): </p></td><td valign="top" width="348"><p>43 / 1092 (all models) </p></td></tr><tr><td valign="top" width="172"><p>Shoulder room&nbsp;(in / mm): </p></td><td valign="top" width="348"><p>55 / 1397 (all models) </p></td></tr><tr><td valign="top" width="172"><p>Hip room (in / mm): </p></td><td valign="top" width="348"><p>54 / 1371 (all models) </p></td></tr></tbody></table></p><p><strong>Capacities </strong></p><p><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td width="172"><p>Cargo volume (cu ft / L): </p></td><td width="348"><p>22 / 634 </p></td></tr><tr><td width="172"><p>Fuel tank (gal / L): </p></td><td width="348"><p>18 / 68.1 </p></td></tr><tr><td width="172"><p>Engine oil (qt / L): </p></td><td width="348"><p>10.5 / 9.9 </p></td></tr></tbody></table></p><p>*SAE certified. <br>Note: Information shown is current at time of publication. </p><br/><br/>tag : <a href="/tag/콜벳ZR1" rel="tag">콜벳ZR1</a>,&nbsp;<a href="/tag/시보레" rel="tag">시보레</a>			 ]]> 
		</description>
		<category>콜벳ZR1</category>
		<category>시보레</category>

		<comments>http://ggwangs.egloos.com/1337637#comments</comments>
		<pubDate>Fri, 30 Jan 2009 06:16:21 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[ GM시보레·콜벳 Z06 ]]> </title>
		<link>http://ggwangs.egloos.com/1337521</link>
		<guid>http://ggwangs.egloos.com/1337521</guid>
		<description>
			<![CDATA[ 
  【 Z06 】<br>전체 길이×전체 폭×전체 높이=4465mm×1935mm×1250 mm, 휠 베이스=2685 mm, 차량중량=1440 kg, 구동 방식=FR, 엔진=7 리터 V형 8 기통 OHV[376 kW(511 ps)/6300 rpm, 637 Nm(64.9 kg-m) /4800rpm], 트랜스미션=6단MT<br><br>7리터! 500마력 이상의 광기??<br>콜벳 사상 최강의 모델, Z06의 힘은 7리터 8기통 511마력,637Nm!!<br>화석연료의 고갈과 지구온난화문제가 사회적으로 커다란 문제가 되고있는 이시대에, 이런종류의 괴물이 꼭 필요한지? 라는 의문을 갖는 사람도 물론있겠다. 강력한 군사력과 자본력으로 세계의 석유를 모아서 소비하고, 이산화탄소를 뿌려대는 오만한 미국과 Z06을 합해서 욕하는 이도 있을것이다.<br><br><p>그러나, 이러한류의 괴물이 없다면 세상은 따분하지 않겠는가? 우리에게는 지구 환경을 지켜야할 의무와 책임이 있다. 그러나, 그렇다고해서 이런자동차를 나쁘다고만 평가할수는 없는것이 아닌가, 물론 현실적인 문제로써의 Z06은 쓸데없는 존재이긴하다. 그 담보로써 배기량에 알맞는 세금을 내고 있지 않은가... 세금이 너무 적다고??<br>그럼 세금을 올려도 괜찮다. 그결과로 구매자가 줄어든다고 해도 그것은 어쩔수없는일이 아닌가...<br>그러나 "이런 자동차는 세상에서 없애버려야 한다"라는 생각만 가지는 사람이 있는것은 아니다, 무언가를 동경한다는것.. 인류가 낳은 문화문명의 하나로써 봐달라!! 보고 타고 달리게 해보면 이 Z06이 포르쉐나 페라리에도 필적할만한 임팩트를 가지는 자동차라고 이야기 하는것을 확인해볼수가 있을것이다...<br><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5NS5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5NS5qcGc=" width="700"></a> <p class="cap1">보디는 범퍼 윗부분에 에어스쿠프가 추가되어있고, 앞뒤 휀더도 부풀어있으며, 하이마운트 스톱램프가 부착된 리어 스포일러도 기본형보다 커졌다</p></div><p></p><p><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5Ni5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5Ni5qcGc=" width="700"></a> <p class="cap1">듀얼 이그저스트 파이프도 Z06전용이다. 바디컬러는 사진에서 보이는 빅토리 레드 이외에, 검정.그레이.물색.황색.오렌지의 6가지 색상과 인테리어는 검정.검정/빨강. 검정/회색의 3가지를 선택할수있다.</p></div>　<br>Z06의 스펙은 대단해서 어찌되었건간에 500마력을 넘어서는 커다란 엔진을 1.5톤도 되지않는 2시터 보디에 밀어 넣었다. 그 결과 파워/웨이트레이션은 2.8/ps에 이르렀다 이것은 911 까레라 GT2나 페라리 599 정도의 오리지널 스포츠카 메이커의 정상모델에 필적할만한 수치다.<br><br>7리터 V8의 밸브구동방식은 OHV. DOHC가 당연한 이시대에보면 낡은인상도 있지만, 이만큼의 배기량이 있으면 고회전화할 필요성이 별로 없고, 그렇다면 중심을 낮게 가져갈수있는 OHV쪽이 운동성능면에서는 유리한면이 있다는것이 GM의 주장이다. 또한 Z06에선 티타늄제 콘로드나, 인테이크 밸브, 알루미늄단조제 피스톤단강제 크랭크샤프트라고 하는 레이싱엔진에 쓰이는 직결 테크놀로지는 적용. 그 결과 511마력의 최고출력을 6300rpm에서 발휘하면서 최고허용엔진수도 7100rpm까지 가져갈수있다.&nbsp; 제로백 3.7초 최고속도 317km/h을 만들어냈다.<br><br>그렇다고해도 가속은 굉장하지만, 핸들링은 개판(?)이라는것이 아메리칸 머슬의 전통이 아니던가?? 그러나 콜벳만큼은 다르다는것도 매니아들의 상식이다. 특히, 콜벳은 지난모델부더 포르쉐나 페라리를 벤치마크로 내걸고서 뉘르부르그링에 뛰어들어 주행성능을 다져왔다. 지금의 모델역시 열심히 다져오면서 발전시켜왔다. 구체적으로 살펴보면 엔진의 올 알루미늄화. 기어박스를 엔진으로 분리해서 리어로 이동시켜서 전후 무게중량배분의 개선을 가져왔으며, 마그네슘과 카본파이버등의 사용으로인한 경량화도 가져왔다.<br><br>Z06은 그러한 콜벳의 컨셉에서 한층더 발전해서 노멀모델보다 더커다란 엔진을 얹고있지만, 경량화에 철저히 신경을 써서 노멀보다 60kg더 가볍게 만들어냈다. 이것은 2리터 배기량의 미니밴보다도 더 낮은 수치이다. 게다가 전후무게배분도 51대 49라는 이상적인 값에 가까워졌다. <p></p><p>그 결과 Z06은 뉘르브르그링의 기록이 7분43초라는 경이적인 랩타임을 기록했다. 덧붙여 GTR의 랩타임은 7분38초. 불과 5초차이라는것을 보면 Z06가 "직빨의 황제"만은 아니라는것을 보여주는기록이다.<br><br></p><p><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyOC5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyOC5qcGc=" width="700"></a> <p class="cap1">Z06에 탑재되는엔진은 「LS7형」이라고 하는 7리터 V8. 오일윤활시스템에는 레이싱엔진에 폭넓게 사용되고있는 드라이섬프식을 채용. 코너링시 발생하는 횡G에도 원활한 윤활성능을 발휘한다. 6단 500rpm에서도 가속을 받아들이는 유연한 토크를 가져 저회전영역에서의 실용성도 갖췄다.</p></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyMi5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyMi5qcGc=" width="700"></a> <p class="cap1">6단 수동변속기는 오일쿨러를 장착하고있다.</p></div><br>타이트한 운전석에 탑승하는것은 편안한 자세는 아니다. 시트의 사이드 서포트가 부드러운 관계로 엉덩이를 밀어 넣으면 의외로 편안하게 탈수도 있지만, 어딘가 아쉬운부분은 어쩔수가 없다.<br>기어박스는 6단 수동만 존재한다. <br>엔진의 진동이 상당히 스트레이트하게 전해져오는것에서 마운트를 상당히 단단하게<span id="callbacknestcaranddrivingtistorycom1872195" style="FLOAT: left; WIDTH: 226px; HEIGHT: 196px"><object id="caranddrivingtistorycom1872195" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" height="100%" width="100%" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"><param name="_cx" value="5080"><param name="_cy" value="5080"><param name="FlashVars" value=""><param name="Movie" value="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestcaranddrivingtistorycom1872195&amp;id=187&amp;callbackId=caranddrivingtistorycom1872195&amp;host=http://caranddriving.tistory.com&amp;float=left&amp;"><param name="Src" value="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestcaranddrivingtistorycom1872195&amp;id=187&amp;callbackId=caranddrivingtistorycom1872195&amp;host=http://caranddriving.tistory.com&amp;float=left&amp;"><param name="WMode" value="Transparent"><param name="Play" value="0"><param name="Loop" value="-1"><param name="Quality" value="High"><param name="SAlign" value="LT"><param name="Menu" value="-1"><param name="Base" value=""><param name="AllowScriptAccess" value=""><param name="Scale" value="NoScale"><param name="DeviceFont" value="0"><param name="EmbedMovie" value="0"><param name="BGColor" value=""><param name="SWRemote" value=""><param name="MovieData" value=""><param name="SeamlessTabbing" value="1"><param name="Profile" value="0"><param name="ProfileAddress" value=""><param name="ProfilePort" value="0"><param name="AllowNetworking" value="all"><param name="AllowFullScreen" value="false">    <embed width="100%" height="100%" wmode="transparent" id="caranddrivingtistorycom1872195" src="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestcaranddrivingtistorycom1872195&id=187&callbackId=caranddrivingtistorycom1872195&host=http://caranddriving.tistory.com&float=left&" allowscriptaccess="always" menu="false" type="application/x-shockwave-flash"  ></embed></object></span>가져간것 같다.<br>1단을 넣고 무거운 클러치를 미트시켜본다. 7리터라고 하는 배기량에 비해서 클러치의 미트특성은 예민하고, 아이들링부근에서 거칠게 이어주면 어이없이 스톨해버린다 다만, 익숙해져버리면 다루기 편안함은 아주 좋다.<br>1000rpm부근만 넘어가면 유들유들한 토크를 발생하기때문에, 도로에서도 빈번한 쉬프트체인지는 필요가 없다. 극단적인 이야기로 3단에 넣어놓으면 거의 오토매틱감각으로 탈수도 있다. 그러나, 악셀을 깊게 밟는순간 성격은 순간적으로 변한다. V8엔진의 울부짖음과 동시에 가속이 시작되면 몸전체와 목 그리고 안구에까지 강렬한 G를 가져다준다. 확실히 마약적인 감각이다. "속도는 익숙해진다"라는 말도 있지만, 그것은 Z06에는 맞지 않는다. Z06을 모는 드라이버는 몇년이 지나도 강렬한 자극에 질릴일은 없다 라고 단언할수있다.<br><br>서스펜션은 노멀과 비교해보면 분명히 단단하다. 가속을하면 약간 인공적인 무게를 느께기도 하지만, 스티어링은 부드럽고 정확한감이다. 브레이크의 처프함도 미국차로써는 이례적이다. 꽤나 혹사를 시켜도 제동력이 떨어지지 않는다. 이처럼 기초를 단단하게 다져놓았기때문에 드라이버는 머릿속을 비워놓고 달리기에만 열중할수있다<br>이것이 Z06을 본격적인 스포츠카 라고 주장하는 최대의 근거이다!!<br><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyMy5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyMy5qcGc=" width="700"></a> <p class="cap1">전용 타이어사이즈는 (앞) 275/35 ZR18(뒤) 325/30ZR19. 브레이크시스템역시 Z06전용으로 앞 6 뒤 4피스톤 캘리퍼를 채용했다. 런플렛타이어는 표준사양!</p></div><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5Ny5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5Ny5qcGc=" width="700"></a> <p class="cap1">Z06의 보디 프레임은 전부 알루미늄제이고, 엔진하부에는 마그네슘을 프런트 휀더나 조수서 플로어는 카본파이버를 사용한다. 노멀모델과 동일하게 전면유리에는 속도,회전수,연료,레이스모드에서는 횡G까지도 표시되는 헤드업디스플레이를 장치해놨다! </p></div><br>이차의 매력은 리얼스포츠이면서 어딘가모를 상냥함이랄까? 노멀의 콜벳보다는 딱딱하지만, 머리가 흔들리는 불괘한 진동이 없는것은 탄탄한 보디에 진동의 감쇄가 편안하게 되어있다는점, 초고성능 스포츠모델로써는 부드러운 시트가 제2위 서스펜션을 하고있다는점, 이러한 이유로부터 쾌적함은 의외로 괜찮다 스티어링의 조작감도 부드럽고 솔직한 느낌도 좋다. 특히 고속도로에서의 편안한 주행도 이차를 높이사는 이유중 하나이다.<br><br>미국적인 느낌이랄까? 넓은 대륙을 쾌적하게 달리는것에의 배려도 놓치지 않았다. 이것이 하이 퍼포먼스와 쾌적함을 양립시켜놓은 Z06의 개성이면서 매력이기도 하다!<br><br>자동차탄생 100년남짓! 지금까지 수많은 명차가 태어나 많은이들의 마음을 빼앗아왔다. 그리고 그중 압도적으로 많은 숫자는 괴물 스포츠카였다. 그것은 스포츠카가 우리마음속에 숨겨진 어떠한 종류의 욕망을 가장 잘 대변해주는 존재이기때문이 아닐까? 스포츠카는 그 자동차를 낳은 나라의 문화 문명을 가장 스트레이트하게 표현하는 공업제품이기도 하다. 그러한의미에서 봤을때, Z06은 넘치는 힘과 이해하기 쉬움, 그리고 쾌적함을 추구하는 미국 그 자체이다! <br><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyOS5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyOS5qcGc=" width="700"></a> <p class="cap1">Z06의 시트는 히팅기능도 된다. 운전석은 6웨이 파워시트 &amp; 럼버서포트도 장착되어있다.</p></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5OC5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5OC5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyNC5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyNC5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5OS5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8wLzEyMDAwMDAwMDA5OS5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8xLzEyMDAwMDAwMDEwMC5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8xLzEyMDAwMDAwMDEwMC5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAzMC5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAzMC5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyNS5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyNS5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAzMS5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAzMS5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyNi5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyNi5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyNy5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyNy5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAzMi5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczYudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAzMi5qcGc=" width="700"></a></div><p></p><p><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8xLzEyMDAwMDAwMDEwMS5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8xLzEyMDAwMDAwMDEwMS5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyOC5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczQudGlzdG9yeS5jb206L2F0dGFjaC8wLzEzMDAwMDAwMDAyOC5qcGc=" width="700"></a></div><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><a href="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8xLzEyMDAwMDAwMDEwMi5qcGc=" target="_blank" rel="lightbox"><img style="CURSOR: pointer" height="466" alt="사용자 삽입 이미지" src="http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzE0MzgyNEBmczUudGlzdG9yeS5jb206L2F0dGFjaC8xLzEyMDAwMDAwMDEwMi5qcGc=" width="700"></a></div><br/><br/>tag : <a href="/tag/z06" rel="tag">z06</a>,&nbsp;<a href="/tag/콜벳" rel="tag">콜벳</a>			 ]]> 
		</description>
		<category>z06</category>
		<category>콜벳</category>

		<comments>http://ggwangs.egloos.com/1337521#comments</comments>
		<pubDate>Fri, 30 Jan 2009 05:20:29 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 자바프로그래밍의 신기술 Framework  ]]> </title>
		<link>http://ggwangs.egloos.com/1254470</link>
		<guid>http://ggwangs.egloos.com/1254470</guid>
		<description>
			<![CDATA[ 
  <div><span class="ct lh">Struts 2<br>=========</span></div><div><span class="ct lh">Struts 2 Framework 은 WebWork Framework 에 기반을 두고 있습니다. WebWork Framework 은 여러해동안 좋은 아키텍처로 Framework 를 정립하여, 웹 어플리케이션 개발에 많이 활용되어 왔습니다.</span></div><div><span class="ct lh">이에 Struts Communites 와 WebWork Communities 들이 모여서 WebWork Framework 을 Struts 2 Framework 으로 명명하여 Framework 를 발전시키고자 합의를 하였습니다.<br>따라서 Struts 2 Framework 는 대부분 WebWork Framework 를 따르고 있으며, 초기의 Struts 2 Framework 는 WebWork Framework 와 같다고 여겨도 됩니다.</span></div><div><span class="ct lh"><br>Struts 2 Framework 는 Struts 1.x Framework 와는 전혀 다른 아키텍처로 구성되어 있습니다. 일반적으로 Framework 든 어플리케이션이든, 버전업이 되면 기존에 있는 기능에 더 많은 기능을 추가하고, 부족한 기능을 보완하여 버전업을 합니다.</span></div><div><span class="ct lh"><br>하지만 Struts 2 Framework 는 처음부터 Struts 1.x Framework 에 기반하지 않고, 전혀 다른 WebWork Framework 을 이름을 바꾸어서 새로운 아키텍처로 구성된 Struts 2 Framework 을 만들었습니다. 따라서 개발자들은 Struts 1.x Framework 와 다른 Struts 2 Framework 를 다시 익혀야 됩니다.</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">ibatis<br>=========</span></div><div><span class="ct lh">iBATIS는 간단한 XML서술자를 사용해서 간단하게 자바빈즈를 SQL statement에 맵핑시킨다. 간단함(Simplicity)이란 다른 프레임워크와 객체관계맵핑툴에 비해 iBATIS의 가장 큰 장점이다. iBATIS Data Mapper를 사용하기 위해서 당신은 자바빈즈와 XML 그리고 SQL에 친숙할 필요가 있다. 여기엔 배워야 할것도 거의 없고 테이블을 조인하거나 복잡한 쿼리문을 수행하기 위해 필요한 복잡한 스키마도 없다.<br>Data Mapper를 사용하면 당신은 실제 SQL문의 모든 기능을 가질수 있다. JDBC 로만 프로그래밍 할 때의 번거로움을 줄여주기 위해 재사용 모듈로 개발된 것이다.</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">Spring<br>=========</span></div><div><span class="ct lh">Spring를 이해하기 위해서는 IOC를 먼저 이해해야한다. IOC 란 인스턴스 생성의 제어를&nbsp; 개발자 본인이 아닌 다른 누군가에게 반환 준다는 개념이다. 여기서 말하는 다른 누군가란 EJB, Servlet 등 bean을 관리해 주는 컨테이너이다. 즉 IOC 란 인스턴스의 생성부터 소멸까지의 인스턴스의 생명주기 관리를 내가 아닌 컨테이너가 대신 해준다는 뜻이다.</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">Spring 컨테이너란 ?<br>Spring 컨테이너는 IOC를 지원한다. Spring 컨테이너란 beans 를 관리하고 애플리케이션 중요 부분을 형성한다. 즉 Spring 컨테이너는 메타데이터(xml 설정)를 통해&nbsp; bean를 인스턴스화 하고 이를 조합하여 관리하는 역할을 한다. 컨테이너는 관리되는 bean 들을 의존성 삽입(Dependency Injection)을 통해 IOC 를 지원한다.</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh"><br>Highber nate<br>=============</span></div><div><span class="ct lh">Hibernate는 java환경의 object/relational mapping tool 이다. object/relational mapping(ORM) 이란 말은 object model로써 표현된 데이터를 relational, 즉 SQL base의 구조를 갖는 데이터에 대응시키기 위한 기술을 말한다.</span></div><div><span class="ct lh">&nbsp;</span></div><div><span class="ct lh">Hibernate는 java class 데이터 베이스의 테이블에 mapping을 할뿐만 아니라, 데이터의 쿼리와 복원 기능도 제공하고 있다. 이덕분에 SQL과 JDBC에 의해 수작업으로 데이터를 조작했던 방식과 비교해서 개발기간을 급격히 줄일수가 있다</span></div><br/><br/>tag : <a href="/tag/java" rel="tag">java</a>,&nbsp;<a href="/tag/struts2" rel="tag">struts2</a>,&nbsp;<a href="/tag/ibatis" rel="tag">ibatis</a>,&nbsp;<a href="/tag/spring" rel="tag">spring</a>			 ]]> 
		</description>
		<category>JAVA</category>
		<category>java</category>
		<category>struts2</category>
		<category>ibatis</category>
		<category>spring</category>

		<comments>http://ggwangs.egloos.com/1254470#comments</comments>
		<pubDate>Fri, 19 Dec 2008 03:46:36 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Eclipse 단축키 많이 사용되는 것 ]]> </title>
		<link>http://ggwangs.egloos.com/1254456</link>
		<guid>http://ggwangs.egloos.com/1254456</guid>
		<description>
			<![CDATA[ 
  <div style="FONT-SIZE: 10pt">Ctrl + Shift + O&nbsp; : 자동&nbsp; Class Organise<br>Ctrl + Shift + F : Code Formatter(코드 규칙에 맞게 재구성)<br>Ctrl + Shift + R : Resource 검색, 해당 클래스를 검색하고 싶을떄 사용 (wildcard문자도 사용가능)<br>Ctrl + Shift + C : 선택한 영역 주석 달기<br>Ctrl + Space : 자동완성 (가장 많이 사용)<br><br>Ctrl + 1 : warnning, error 때 무언가 제언사항 나옴<br>Ctrl + D : 한줄 삭제<br><br>Alt + Shift + S : Source Make<br>Alt + Shift + X, T : Junit Test 실행<br>Alt + Shift + X, J : Java Application 실행<br>Ctrl 누를채로 메소드 클릭하면 링크 따라서 함수 구현부분으로 이동한다.<br>Ctrl + Alt + H : 해당 메소드를 호출하고 있는 부분을 검색해서 보여준다.<br><br>Ctrl + O : 현재 클래스의 구조를 보여준다. (좋네?)<br>Alt + &gt;, Alt + &lt; : 이전 단계, 다음 단계<br>Ctrl + F7 : 뷰간 화면 전환<br>Ctrl + F8 : 퍼스펙티브간 화면 전환<br>Ctrl + / : 주석달기, 주석 제거<br>Ctrl + K : 선택된 문장 검색. (현재 파일 내)<br>Ctrl + F : 현재 에디터에서 찾기<br>Ctrl + H : 고급 찾기<br>Ctrl + S : 저장하기</div><br/><br/>tag : <a href="/tag/eclipse" rel="tag">eclipse</a>			 ]]> 
		</description>
		<category>JAVA</category>
		<category>eclipse</category>

		<comments>http://ggwangs.egloos.com/1254456#comments</comments>
		<pubDate>Fri, 19 Dec 2008 03:38:23 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[ iBATIS의 개념 ]]> </title>
		<link>http://ggwangs.egloos.com/1062220</link>
		<guid>http://ggwangs.egloos.com/1062220</guid>
		<description>
			<![CDATA[ 
  <div><strong><span style="FONT-SIZE: 11pt">iBATIS의 개념</span></strong></div><div>&nbsp;</div><p class="HStyle0">iBATIS는 간단한 XML서술자를 사용해서 간단하게 자바빈즈를 SQL statement에 맵핑시킨다. 간단함(Simplicity)이란 다른 프레임워크와 객체관계맵핑툴에 비해 iBATIS의 가장 큰 장점이다. iBATIS Data Mapper를 사용하기 위해서 당신은 자바빈즈와 XML 그리고 SQL에 친숙할 필요가 있다. 여기엔 배워야 할것도 거의 없고 테이블을 조인하거나 복잡한 쿼리문을 수행하기 위해 필요한 복잡한 스키마도 없다. Data Mapper를 사용하면 당신은 실제 SQL문의 모든 기능을 가질수 있다. JDBC 로만 프로그래밍 할 때의 번거로움을 줄여주기 위해 재사용 모듈로 개발된 것인데 그 주요한 어려움을 ibatis 개발자 가이드에서 다음과 같이 정리하고 있다.</p><div>&nbsp;</div><div>&nbsp;</div><div><span style="FONT-SIZE: 11pt"><strong>iBATIS의 역사와 사용</strong></span></div><ul><li>SQL 문장과 프로그래밍 코드의 분리 <li>JDBC 라이브러리를 통해 매개변수를 전달하고 결과를 추출하는 일 <li>데이터베이스 접근 클래스와 비즈니스 로직을 담은 클래스의 분리 <li>자주 쓰이는 데이터를 변경되지 않는 동안에 임시 보관(Cache) <li>트랜젝션과 쓰레드 관리</li></ul><div>&nbsp;</div><div>이러한 사항들에 대해서 한번쯤 생각해볼 필요가 있다.</div><li>SQL 문장과 프로그래밍 코드의 분리 <div>SQL문과 프로그램 코드는 꼭 분리해야 할까? 우선 프로그램이 작은 경우는 굳이 분리할 필요가 없어 보인다. 파일만 두개로 분리되기 때문에 관리에 불편함이 가중될 수 있다. 프로그램이 커져도 분리하는 것이 꼭 유리한 것만은 아니다. SQL을 사용하는 클래스가 1000개라면 분리했을 때 2000개가 되어서 더 복잡해질 수도 있다. 그럼에도 불구하고 ibatis에서는 SQL을 분리하는 이유는 무엇일까? </div><div><strong>Separation of Concern</strong>!! 할 일의 명확한 분리. 아마도 이것이라 짐작된다. 자바 코드에서 SQL을 없애서 순수 OO로 만들어놓기. 이것은 결벽증이나 지나친 원리집착이<span style="BACKGROUND-COLOR: #ffff99">아니라 체계가 다른 것을 나누어 보관하는 것이다. 논리적으로 정연한 흐름을 만들어 둘 수 있고, 객체지향 입장에서 데이터에 해당하는 <u><strong>도메인 모델(Domain model)</strong> 혹은 <strong>도메인 객체(Domain object)</strong>와 관계형 데이터베이스의 <strong>테이블(Table)</strong>을 느슨한 관계(loosely coupled)</u>로 만들어</span>서 변화에 대한 유연성을 확보할 수도 있다. 즉, <u>정규화를 위해서 혹은 데이터 접근의 효율성을 위해서 테이블 구조를 바꾸어도 프로그램 코드 안에 있는 SQL을 수정할 필요가 없어진다</u>. </div><div>&nbsp;</div><li>JDBC 라이브러리를 통해 매개변수를 전달하고 결과를 추출하는 일 <div>select 등를 할 때 조건에 해당하는 매개변수를 설정하거나, insert 문에서 값을 할당하기 위해 매개변수를 설정하는 일은 무척 번거로운 일이다. 단순한 일이면서도 오류가 잦은 부분이다. 때문에 프로젝트를 몇 차례 겪고 나면 자신만의 라이브러리를 만들거나 공통팀에서 유틸리티를 제공하는 일을 흔하게 볼 수 있다. Apache Commons의 DB Utils 나 Spring의 JDBC Template 등은 이러한 작업을 용이하게 하려고 등장했고, ibatis 역시 이러한 작업을 훨씬 부드럽게 해준다.</div><div>&nbsp;</div><li>데이터베이스 접근 클래스와 비즈니스 로직을 담은 클래스의 분리 <div>이른바 DAO(Data Access Object) 패턴이 이러한 일을 담당한다. ibatis는 DAO 계층 구현을 위한 유틸리티 성격이면서 동시에 best practice 역할도 수행한다.</div><div>&nbsp;</div><li>자주 쓰이는 데이터를 변경되지 않는 동안에 임시 보관(Cache) <div>ibatis 에선 XML 설정만으로 캐시를 할 수 있다.</div><div>&nbsp;</div><li>트랜젝션과 쓰레드 관리 <div>트랜젝션 처리 역시 용이하다.</div><br><br><p><span style="FONT-SIZE: 11pt"><strong>iBATIS의 주요기능</strong></span>&nbsp;</p><p><font size="3"><span style="BACKGROUND-COLOR: #ffffff"><span style="COLOR: #000000"><strong><span style="FONT-SIZE: 11pt">Data Mapper</span></strong><span style="FONT-SIZE: 11pt"> (com.ibatis.sqlmap.*)</span></span></span></font></p><br><p><strong>개념</strong><br>iBATIS Data Mapper API는 프로그래머에게 자바빈즈 객체를 PreparedStatement파라미터와 ResultSets으로 쉽게 맵핑할 수 있도록 한다. Data Mapper의 기본적인 생각은 간단함(simple)이다. 이는 자바코드의 20%를<span id="callbacknestwwwthlifenet6843474" style="FLOAT: left; WIDTH: 226px; HEIGHT: 196px"><object id="wwwthlifenet6843474" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" height="100%" width="100%" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"><param name="_cx" value="5080"><param name="_cy" value="5080"><param name="FlashVars" value=""><param name="Movie" value="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestwwwthlifenet6843474&amp;id=684&amp;callbackId=wwwthlifenet6843474&amp;host=http://www.thlife.net&amp;float=left&amp;"><param name="Src" value="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestwwwthlifenet6843474&amp;id=684&amp;callbackId=wwwthlifenet6843474&amp;host=http://www.thlife.net&amp;float=left&amp;"><param name="WMode" value="Transparent"><param name="Play" value="0"><param name="Loop" value="-1"><param name="Quality" value="High"><param name="SAlign" value="LT"><param name="Menu" value="-1"><param name="Base" value=""><param name="AllowScriptAccess" value=""><param name="Scale" value="NoScale"><param name="DeviceFont" value="0"><param name="EmbedMovie" value="0"><param name="BGColor" value=""><param name="SWRemote" value=""><param name="MovieData" value=""><param name="SeamlessTabbing" value="1"><param name="Profile" value="0"><param name="ProfileAddress" value=""><param name="ProfilePort" value="0"><param name="AllowNetworking" value="all"><param name="AllowFullScreen" value="false">    <embed width="100%" height="100%" wmode="transparent" id="wwwthlifenet6843474" src="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestwwwthlifenet6843474&id=684&callbackId=wwwthlifenet6843474&host=http://www.thlife.net&float=left&" allowscriptaccess="always" menu="false" type="application/x-shockwave-flash"  ></embed></object></span>사용하여 JDBC기능의 80%를 제공하는 간단한 프레임워크라는 뜻이다.</p><br><p><strong>작동원리</strong><br>Data Mapper는 자바빈즈, Map구현, 원시래퍼타입(String, Integer…) 그리고 SQL문을 위한 XML문서를 맵핑하기 위한 XML서술자를 사용하는 매우 간단한 프레임워크를 제공한다. </p><p>다음은 생명주기에 대한 높은 레벨의 서술이다.</p><p><br>1) 파라미터(자바빈즈, Map 또는 원시래퍼)로써 객체를 제공한다. 파라미터 객체는 update문내에 입력값을 셋팅하기 위해 사용되거나 쿼리문의 where절을 셋팅하기 위해서 사용된다.<br></p><p>2) 맵핑된 statement을 실행한다. 이 단계는 마법이 일어나는곳이다. Data Mapper프레임워크는<br>PreparedStatement 인스턴스를 생성할것이고 제공된 파라미터객체를 사용해서 파라미터를 셋팅한다. 그리고 statement를 실행하고 ResultSet으로부터 결과 객체를 생성한다.<br></p><p>3) update의 경우에 영향을 미친 rows의 숫자를 반환한다. 조회문일경우에 한 개(single)의 객체 또는 컬렉션 객체를 반환한다. 파라미터처럼 결과 객체는 자바빈즈, Map 원시타입래퍼또는 XML이 될수 있다.</p></li><br/><br/>tag : <a href="/tag/iBATIS" rel="tag">iBATIS</a>,&nbsp;<a href="/tag/sql" rel="tag">sql</a>,&nbsp;<a href="/tag/java" rel="tag">java</a>			 ]]> 
		</description>
		<category>JAVA</category>
		<category>iBATIS</category>
		<category>sql</category>
		<category>java</category>

		<comments>http://ggwangs.egloos.com/1062220#comments</comments>
		<pubDate>Thu, 06 Nov 2008 07:13:55 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [ORACLE] Nested Loop Join과 Sort Merge 조인 ]]> </title>
		<link>http://ggwangs.egloos.com/1016404</link>
		<guid>http://ggwangs.egloos.com/1016404</guid>
		<description>
			<![CDATA[ 
  &nbsp;<div class="post-sub ptr" id="sendPost_kitchen_60025941615" style="DISPLAY: none"><p><span class="pcol2" id="sendPost_kitchenH_60025941615"></span></p></div><!-- delete something | 20071116 AjaxUI --><div class="post-view pcol2" id="post-view"><p><font face="verdana" size="3"><strong>Nested Loop Join과 Sort Merge Join</strong></font></p><p><span style="FONT-FAMILY: verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: verdana; BACKGROUND-COLOR: #e4e4e4"><strong>Nested Loop Join</strong></span></p><p><span style="FONT-FAMILY: verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: verdana">Nested Loop Join이란 먼저 어떤 테이블의 처리범위를 하나씩 액세스하면서 그 추출된 값으로 연결할 테이블을 조인하는 방식이다.</span></p><p><span style="FONT-FAMILY: Verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: verdana"><strong>1. 특징</strong></span></p><p><span style="FONT-FAMILY: verdana">1) 순차적으로 처리된다. 선행테이블(Driving table)의 처리범위에 있는 각각의 로우들이 순차적으로 수행될 뿐만 아니라 테이블간의 연결도 순차적이다.</span></p><p><span style="FONT-FAMILY: verdana">2) 먼저 액세스되는 테이블(Driving Table)의 처리범위에 의해 처리량이 결정된다.</span></p><p><span style="FONT-FAMILY: verdana">3) 나중에 처리되는 테이블은 앞서 처리된 값을 받아 액세스된다. 즉, 자신에게 주어진 상수값에 의해 스스로 범위를 줄이는 것이 아니라 값을 받아서 처리범위가 정해진다.</span></p><p><span style="FONT-FAMILY: verdana">4) 주로 랜덤 액세스 방식으로 처리된다. 선행 테이블의 인덱스 액세스는 첫번째 로우만 랜덤 액세스이고 나머지는 스캔이며 연결작업은 모두 랜덤 액세스이다.</span></p><p><span style="FONT-FAMILY: verdana">5) 주어진 조건에 있는 모든 컬럼들이 인덱스를 가지고 있더라도 모두가 사용되는 것은 아니다. 연결되는 방향에 따라 사용되는 인덱스들이 전혀 달라질 수 있다.</span></p><p><span style="FONT-FAMILY: verdana">6) 연결고리가 되는 인덱스에 의해 연결작업이 수행되므로 연결고리 상태가 매우 중요하다. 연결고리의 인덱스 유무에 따라 액세스 방향 및 수행속도에 많은 차이가 발생된다.</span></p><p><span style="FONT-FAMILY: verdana">7) 연결작업 수행 후 마지막으로 check되는 조건은 부분범위처리를 하는 경우에는 조건의 범위가 넓을수록, 아예 없다면 오히려 빨라진다.</span></p><p><span style="FONT-FAMILY: Verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: verdana"><strong>2. 사용기준</strong></span></p><p><span style="FONT-FAMILY: verdana">1) 부분범위처리를 하는 경우에 주로 유리해진다.</span></p><p><span style="FONT-FAMILY: verdana">2) 조인되는 어느 한쪽이 상대방 테이블에서 추출된 결과를 받아야 처리범위를 줄일 수 있는 상태라면 항상 유리해진다.</span></p><p><span style="FONT-FAMILY: verdana">3) 주로 처리량이 적은 경우(많더라도 부분범위처리가 가능한 경우)에 유리해진다. 그것은 처리방식이 주로 랜덤 액세스방식이므로 많은 양의 랜덤 액세스가 발생한다면 수행속도가 당연히 나빠지기 때문이다.</span></p><p><span style="FONT-FAMILY: verdana">4) 가능한 한 연결고리 이상 상태를 만들지 않도록 주의해야 한다.</span></p><p><span style="FONT-FAMILY: verdana">5) 순차적으로 처리되기 때문에 어떤 테이블이 먼저 액세스되느냐에 따라 수행속도에 많은 영향을 미치므로 최적의 액세스 순서가 되도록 적절한 조치가 요구된다.</span></p><p><span style="FONT-FAMILY: verdana">6) 부분범위처리를 하는 경우에는 운반단위 크기가 수행속도에 많은 영향을 미칠 수 있다. 운반단위가 적을 수록 빨리 운반단위를 채울 수 있으나, 폐치(Fetch) 횟수에서는 불리해지는 이중성을 가지고 있다.</span></p><p><span style="FONT-FAMILY: verdana">7) 선행 테입ㄹ의 처리 범위가 많거나 연결 테이블의 랜덤 액세스의 양이 아주 많다면 Sort Merge 조인보다 불리해지는 경우가 많다.</span></p><p><span style="FONT-FAMILY: verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: verdana; BACKGROUND-COLOR: #e4e4e4"><strong>Sort Merge Join</strong></span></p><p><span style="FONT-FAMILY: verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: verdana">Sort Merge Join이란 양쪽 테이블의 처리범위를 각자 액세스하여 정렬한 결과를 차례로 스캔하면서 연결고리의 조건으로 머지해 가는 방식을 말한다. 이 방식은 경우에 따라 Nested Loop Join보다 훨씬 빨라지는 경우도 많이 있으며 랜덤 액세스가 줄어들어 시스템의 부하를 감소시키지만 일반적으로 Nested Loop Join 보다는 사용되는 빈도가 적은 편이다. </span></p><p><span style="FONT-FAMILY: verdana">이 방식의 가장 큰 특징은 상대방에게 아무런 값도 받지 않고 자신이 가지고 있는 조건만으로 처리범위가 정해지며, 랜덤 액세스를 줄일 수는 있으나 항상 전체범위처리를 한다는 것이다. </span></p><p><span style="FONT-FAMILY: Verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: verdana"><strong>1. 특징</strong></span></p><p><span style="FONT-FAMILY: verdana">1) 동시적으로 처리된다. 테이블 각자가 자신의 처리범위를 액세스하여 정렬해 둔다.</span></p><p><span style="FONT-FAMILY: verdana">2) 각 테이블은 다른 테이블에서 어떠한 상수값도 제공받지 않는다. 즉, 자신에게 주어진 상수값에 의해서만 범위를 줄인다.</span></p><p><span style="FONT-FAMILY: verdana">3) 결코 부분범위처리를 할 수가 없으며, 항상 전체범위처리를 한다.</span></p><p><span style="FONT-FAMILY: verdana">4) 주로 스캔방식으로 처리된다. 자신의 처리범위를 줄이기 위해 인덱스를 사용하는 경우만 랜덤 액세스이고 머지작업은 스캔방식이다.</span></p><p><span style="FONT-FAMILY: verdana">5) 주어진 조건에 있는 모든 컬럼들이 인덱스를 가지고 있더라도 모두가 사용되는 것은 아니다. 연결고리가 되는 컬럼은 인덱스를 전혀 사용하지 않는다. </span></p><p><span style="FONT-FAMILY: verdana">6) 조인의 방향과는 전혀 무관하다.</span></p><p><span style="FONT-FAMILY: verdana">7) 스스로 자신의 처리범위를 줄이기 위해 사용되는 인덱스는 대개 가장 유리한 한가지만 사용되어진다. 그러나 그 외의 조건들은 비록 인덱스를 사용하지 못하더라도 작업대상을 줄여 주기 때문에 중요한 의미를 가진다. </span></p><p><span style="FONT-FAMILY: Verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: verdana"><strong>2. 사용기준</strong></span></p><p><span style="FONT-FAMILY: verdana">1) 전체범위처리를 하는 경우에 주로 유리해진다.</span></p><p><span style="FONT-FAMILY: verdana">2) 상대방 테이블에서 어떤 상수값을 받지 않고도 처리범위를 줄일 수 있는 상태인 경우 주로 유리해 질 수 있다. 상수값을 받아 처리(Nested Loop Join)한 범위의 크기와 처리범위를 줄여 처리(Sort Merge Join)한 범위의 크기를 대비해보아 상수값을 받아 줄여진 범위가 약 30% 이상이라면 Sort Merge Join이 일반적으로 유리해진다. 그러나 부분범위처리가 되는 경우라면 전혀 달라질 수 있다. 이런 경우는 처리할 전체범위를 비교하지 말고 첫번째 운반단위에 도달하기 위해 액세스하는 범위애 대해서 판단해야 한다.</span></p><p><span style="FONT-FAMILY: verdana">3) 주로 처리량이 많은 경우 (항상 전체범위처리를 해야 하는 경우)에 유리해진다. 그것은 처리방식이 주로 스캔방식이므로 많은 양의 랜덤 액세스를 줄일 수가 있기 때문이다.</span></p><p><span style="FONT-FAMILY: verdana">4) 연결고리 이상 상태에 영향을 받지 않으므로 연결고리를 위한 인덱스를 생성할 필요가 없을 때 유용하게 사용할 수 있다.</span></p><p><span style="FONT-FAMILY: verdana">5) 스스로 자신의 처리범위를 어떻게 줄일 수 있느냐가 수행속도에 많은 영향을 미치므로 보다 효율적으로 액세스할 수 잇는 인덱스 구성이 중요한다.</span></p><p><span style="FONT-FAMILY: verdana">6) 전체범위처리를 하므로 운반단위의 크기가 수행속도에 영향을 미치지 않는다. 가능한 운반단위를 크게 하는 것이 페치(Fetch) 횟수를 줄여준다. 물론 지나치게 큰 운반단위는 시스템에 나쁜 영향을 미친다.</span></p><p><span style="FONT-FAMILY: verdana">7) 처리할 데이터량이 적은 온라인 애플리케이션에서는 Nested Loop Join이 유리한 경우가 많으므로 함부로 Sort Merge Join을 사용하지 말아야 한다.</span></p><p><span style="FONT-FAMILY: verdana">8) 옵티마이저 목표(Goal)가&nbsp; "ALL_ROWS"인 경우는 자주 Sort Merge Join으로 실행계획이 수립되므로 부분범위처리를 하고자 한다면 이 옵티마이져 목표가 어떻게 지정되어 있는지에 주의하여야 한다.</span></p><p><span style="FONT-FAMILY: Verdana"></span>&nbsp;</p><p><span style="FONT-FAMILY: Verdana">================================================</span></p><p><span style="FONT-FAMILY: Verdana">"대용량 데이터베이스" 책에서 발췌한 겁니다.</span></p><p><span style="FONT-FAMILY: Verdana">잘 기억이 안나고 헛갈려서요 ^^;;;</span></p><div class="autosourcing-stub"><p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 11px 0px 7px; PADDING-TOP: 0px; FONT-STYLE: normal; FONT-FAMILY: Dotum"><strong style="PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">[출처]</strong> <a href="http://blog.naver.com/dazzilove/60025941615" target="_blank">[ORACLE] Nested Loop Join과 Sort Merge 조인</a><span style="PADDING-RIGHT: 7px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">|</span><strong style="PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">작성자</strong> <a href="http://blog.naver.com/dazzilove" target="_blank">다찌</a></p></div></div><br/><br/>tag : <a href="/tag/oracle" rel="tag">oracle</a>,&nbsp;<a href="/tag/오라클" rel="tag">오라클</a>,&nbsp;<a href="/tag/join" rel="tag">join</a>			 ]]> 
		</description>
		<category>ORACLE</category>
		<category>oracle</category>
		<category>오라클</category>
		<category>join</category>

		<comments>http://ggwangs.egloos.com/1016404#comments</comments>
		<pubDate>Mon, 27 Oct 2008 08:05:25 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
	<item>
		<title><![CDATA[ iBATIS in Action (쉽고 강력한 SQL 매핑 프레임워크 아이바티스) ]]> </title>
		<link>http://ggwangs.egloos.com/1003568</link>
		<guid>http://ggwangs.egloos.com/1003568</guid>
		<description>
			<![CDATA[ 
  <span style="FONT-SIZE: 130%"><strong>네이버 블로그 날개님이 작성하신 글입니다. ^^: <br></strong><br>iBATIS in Action<br>(쉽고 강력한 SQL 매핑 프레임워크 아이바티스)</span> <p><br>위 책의 필요한&nbsp;사전 배경지식:&nbsp;Java, JDBC(매핑+), SQL, XML</p><p>외부 링크 : 아이바티스 커뮤니티(<a class="con_link" title="http://ibatis.apache.org" href="http://ibatis.apache.org/" target="_blank"><span style="COLOR: #568942">http://ibatis.apache.org</span></a>)</p><p style="MARGIN-LEFT: 2em">SVN : Subversion Source Control</p><p style="MARGIN-LEFT: 2em">JIRA: for 이슈 트래킹(아틀라시안)</p><p style="MARGIN-LEFT: 2em">Confluence : wiki 문서 작성</p><p>&nbsp;소스 코드 : 매닝 출판사 웹 사이트(<a class="con_link" href="http://www.manning.com/begin" target="_blank"><span style="COLOR: #568942">www.manning.com/begin</span></a>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;위키북스 오픈소스 &amp; 웹 시리즈 에디터 일래스틱 온라인(<a class="con_link" href="http://web2.0business.or.kr/" target="_blank"><span style="COLOR: #568942">http://web2.0business.or.kr/</span></a>)</p><p>&nbsp;</p><ul><li><p>머리말</p><ul><li>프레임워크 - 사전적 의미(뼈대, 틀, 골자) <li>향상 : 가독성, 유지보수성, 생산성 <li><p>퍼시스턴스 계층에 적용할 프레임워크</p><ul><li>아이바티스 - JDBC <li>객체 관계 매핑 툴(ORM) - &nbsp;하이버네이트 / TopLink </li></ul><li><p>&nbsp;iBATIS : 더 빠른 JDBC 코딩을 위한 일반화된 프레임워크</p><ul><li>SQL 매퍼 + DAO 프레임워크 </li></ul></li></ul></li></ul><p>&nbsp;</p><h4>&nbsp;요약 (iBATIS)</h4><ul><li>SQL 매핑으로 객체를 관계형 데이터베이스에 저장 <li>애플리케이션이 퍼시스턴스 계층에 일관성있게 접근하는 것을 도와줌 <li>전사적인 수준의 퍼스스턴스 계층에 보다 적함(소규모 시스템에 비교하여) <li><p>특징</p><ul><li>간단함 - 간단한 퍼시스턴스 프레임워크 <li>생산성 - 62%정도 줄어드는 코드(JDBC와 비교하여), 간단한 설정(근거: <span class="external">이탈리안 자바 사용자 그룹의 연구</span>) <li><p>성능 - 구조적 강점(데이터 접근 속도 높여주는 JOIN매핑)</p><ul><li>여러가지 방식의 데이터 가져오기 전략(가져오기 미루기, SQL 줄이기 기법) </li></ul><li><p>관심사의 분리 - 설계를 향상(차후 유지보수성 위해)</p><ul><li>리소스를 관리하여 계층화를 지원(커넥션, PreparedStatement, 결과셋) </li></ul><li><p>작업의 분배 - 팀을 세분화하는 것을 도움</p><ul><li>SQL 문이 애플리케이션 소스 코드로부터 완전히 분리 </li></ul><li><p>이식성 - 어떤 프로그래밍언어로도 구현 가능</p><ul><li>예) 자바, C#(iBATIS.NET), Ruby(RBATIS) </li></ul><li>오픈소스 - 무료+ 커뮤니티티 </li></ul><li><p>언제 사용하지 말아야 하나?</p><ul><li><p>개발자가 모든 것에 대해 영원한 결정권 소유</p><ul><li>애플리케이션 설계와 데이터베이스 설계에 대한 모든 결정권 보유 <li>iBATIS는 관계형 데이터베이스를 위해 설계 <li>=&gt; 관계 매핑 솔루션(ORM;하이버네이트..) 사용 - 설계시 이점, 생산성 향상<br>예) JIRA(이슈 트래킹 패키지 소프트웨어 제품) </li></ul><li><p>완전히 동적인 SQL을 요구시</p><ul><li>애플리케이션의 핵심 기능 : SQL을 동적으로 생성일 경우 <li>iBATIS의 사용이유: 수작업 SQL 구문 작성, 관리 <li>애플리케이션 -&gt; 대부분의 SQL 구문이 SQL 자동 생성 클래스 로부터 동적으로 생성시 위의 장점은 무의미 </li></ul><li><p>비 관계형 데이터베이스 사용</p><ul><li>파일, 엑셀, XML <li>=&gt; 순수한 JDBC, 저수준 파일 입출력 API 권장장 </li></ul><li>요구사항과 상반되는 개발 방향, 설계지침 - 복잡도 증가, 프레임워크 자체의 역할 범위 넘어서는 것 </li></ul><li><p>(주로)관계형 데이터베이스를 위해 설계</p><ul><li>비-관계형 기술(일반적 파일, XML, 엑셀 스프레드 시트)사용시 타 API 이용이 효과적 </li></ul><li>객체 관계 매퍼(ORM) - 애플리케이션~데이터베이스에 대한 결정권 보유 <li>JDBC - 주로 동적으로 생성되는 SQL 코드로 작업하는 애플리케이션 </li></ul><p>&nbsp;</p><h4>x설치와 설정 (iBATIS)</h4><ul><li><p>배포판 얻기</p><ol><li><p>바이너리 배포판: 가장 빠르고 쉬운 방법</p><ul><li>컴파일된 상태 -&gt; <a class="con_link" title="다운" href="http://ibatis.apache.org/javadownloads.cgi" target="_blank"><span style="COLOR: #568942">다운</span></a>받아 압축을 풀고 사용 </li></ul><li><p>소스로부터 빌드하기</p><ul><li>프레임워크를 확장, 버그 수정 <li>소스코드를 직접 컴파일 결과 확인시 </li></ul></li></ol><ul><li><p>배포판의 구조</p><ul><li><img id="userImg4633442" style="CURSOR: pointer" onclick="popview(this)" src="http://namoda.springnote.com/pages/586397/attachments/261499" onload="'setTimeout(" ?resizeImage(4633442)?,200)?> <li>2.3.0.677에서는 jar 파일들(/lib 디렉토리내)가 ibatis-2.3.0.677.jar로 하나로 통합되었다. <li><p>/doc</p><ul><li>user-javadoc.zip : for iBATIS 프레임워크를 사용해서 개발을 하는 사용자들 <li>dev-javadoc.zip : for iBATIS 프로젝트의 모든 JavaDoc 문서를 포함하고 있는 파일 </li></ul><li><p>/lib</p><ul><li>ibatis-common-2.jar : SQL Maps와 DAO 프레임워크 모두가 사용하는 공통 컴포넌트 포함 <li>ibatis-sqlmap-2.jar : SQL Maps 프레임워크의 컴포넌트들을 포함하고 있는 파일 <li>ibatis-dao-2.jar : DAO 프레임워크 컴포넌트들을 포함하고 있는 파일 </li></ul><li><p>/src</p><ul><li>ibatis-src.zip : 프레임워크의 JAR파일을 빌드하는데 사용된 전체 소스를 포함하고 있는 파일 </li></ul></li></ul></li></ul><li><p>애플리케이션에 iBATIS 붙이기</p><ul><li><p>클래스패스 추가(iBATIS 파일 경로 컴파일시, 실행시)</p><ul><li><p>단독 실행 애플리케이션</p><ul><li><p>클래스패스 옵션 추가</p><ol class="code"><li>java <strong>-cp</strong> ibatis-sqlmap-2.jar:ibatis-common-2.jar:. <em>MyMainClass</em> </li></ol></li></ul><li><p>웹 애플리케이션</p><ul><li>iBATIS의 jar 파일들을 WEB-INF/lib 디렉토리에 둔다 </li></ul></li></ul><li><p>JRE 공유 디렉토리(lib/ext 디렉토리)에 올려서 사용가능하지만 가급적 피할 것</p><ol><li>애플리케이션 변경되어 파일 수정시 공유하고 잇는 파일을 참조하는 모든 애플리케이션을 테스트 필요 <li>클래스로더 문제((두 개의 서로 다른 클래스로더가 읽으면 서로 다른 클래스로 간주: 정적변수 공유 X) </li></ol></li></ul></li></ul><p>&nbsp;</p><ul><li><p>SQL Maps 설정 파일</p><ul><li><p>&lt;SqlMapConfig.xml&gt;</p><ol class="code"><li>&lt;!SqlMapConfig.xml SQL Map configuration file--&gt;<br><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;!-- 유효성 체크를 위한 DOCTYPE과 DTD를 적는다 --&gt;<br>&lt;!DOCTYPE sql-map-config<br>&nbsp;&nbsp; &nbsp;PUBLIC "-//iBATIS.com//DTD SQL Map Config 1.0//EN"<br>&nbsp;&nbsp; "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"&gt;<br>&lt;sql-map-config&gt;<br>&nbsp;&nbsp; &nbsp;&lt;<span style="COLOR: rgb(255,51,153)">properties</span> resource="db.properties" /&gt;<br>&lt;!-- 전체 설정 옵션 --&gt;<br>&nbsp;&nbsp; &nbsp;&lt;<span style="COLOR: rgb(255,51,153)">settings</span><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;useStatementNamespaces='false'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;cacheModelsEnabled='true'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;enhancementEnabled='true'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;lazyLoadingEnabled='true'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;maxRequests="32"<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;maxSessions="10"<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;maxTransactions="5"<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;/&gt;<br>&lt;!-- 트랜잭션 매니저 --&gt;<br>&nbsp;&nbsp; &nbsp;&lt;<span style="COLOR: rgb(255,51,153)">transactionManager</span> type="JDBC" &gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;dataSource type="SIMPLE"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="JDBC.Driver" value="${driver}"/&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="JDBC.ConnectionURL" value="${url}"/&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="JDBC.Username" value="${user}"/&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="JDBC.Password" value="${pword}"/&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/dataSource&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/transactionManager&gt;<br>&lt;!-- SQL Map을 기술 --&gt;<br>&nbsp;&nbsp; &nbsp;&lt;<span style="COLOR: rgb(255,51,153)">sql-map</span> resource="sqlMap.xml" /&gt;<br>&nbsp;<br>&lt;/sql-map-config&gt; </li></ol><li><p>&lt;<span style="COLOR: rgb(255,51,153)">properties</span>&gt; 요소 - 외부에서 이름/값 쌍의 리스트를 제공</p><ul><li>장점 : 공통 설정 부분은 모두 한 곳에 두고 각 환경별로 다른 값들을 properties 파일에 독립 가능 <li><p>속성</p><ul><li><p>resource - 클래스 패스상에 있는 리소스(or 파일)</p><ul><li>클래스 로더가 애플리케이션의 클래스패스에서 그 리소스를 찾으려는 시도 함 <li><p>소스(db.properties)</p><ul><li><div>driver=oracle.jdbc.driver.OracleDriver<br>url=jdbc:oracle:thin:@localhost:1521:orcl<br>user=scott<br>pword=tiger</div></li></ul></li></ul><li>url - URL, java.net.URL에 의해 처리 </li></ul></li></ul><li><p>&lt;<span style="COLOR: rgb(255,51,153)">setting</span>&gt; 요소</p><ul><li>useStatementNamespaces - 매핑 구문이 적절한 이름을 가지고 있어야 iBATIS가 실행 가능하도록 하는 옵션, 값(true/<strong>false</strong>) <li>cacheModelsEnabled - 캐시(차후 참조 가정-&gt;메모리 계속 저장), 값(<strong>true</strong>/false) <li>enhancementEnabled - CGLIB(실행 시간에 코드를 생성하는 라이브러리)에 최적화된 클래스-&gt; 적재 지연 성능 향상 여부 지정, 값(<strong>true</strong>/false) <li>lazyLoadingEnabled - 적재 지연(필요할 때만 정보를 읽어들이는 기술), 값(<strong>true</strong>/false) <li>maxRequests - SQL작업(입력/수정/삭제/저장 프로시저 호출)의 한번에 수행가능한 개수, 기본값: 512 <li>maxSessions - 세션(스레드, 관련되어 있는 트랜잭션과 요청의 묶음에 대한 정보 추적 사용), 기본값: 128 <li>maxTransactions - 데이터 트랜잭션의 개수, 기본값: 32 </li></ul><li><p>&lt;<span style="COLOR: rgb(255,51,153)">typeAlias</span>&gt; 요소 - FQCN(완전한 형태의 클래스 이름, Fully Qualified Class Name) 대신 별칭을 붙임</p><ul><li><p>예)</p><ul><li>&lt;typeAlias alias="Account"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="org.apache.ibatis.jgamestore.domain.Account" /&gt; </li></ul><li><p>기본 내장 별칭들</p><ul><li><p>트랜잭션 매니저의 별칭</p><ul><li>JDBC &lt;- com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig <li>JTA &lt;- com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig <li>EXTERNAL &lt;- com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig </li></ul><li><p>데이터 타입</p><ul><li>string &lt;- java.lang.String <li>byte &lt;- java.lang.Byte <li>long &lt;- java.lang.Long <li>short &lt;- java.lang.Short <li>int &lt;- java.lang.Integer <li>integer &lt;- java.lang.Integer <li>double &lt;- java.lang.Double <li>float &lt;- java.lang.Float <li>boolean &lt;- java.lang.Boolean <li>decimal &lt;- java.math.BigDecimal <li>object &lt;- java.lang.Object <li>map &lt;- java.util.Map <li><span style="BACKGROUND-COLOR: rgb(174,255,102)">hashmap</span> &lt;- java.util.HashMap <li>list &lt;- java.util.List <li>arraylist &lt;- java.util.ArrayList <li>collection &lt;- java.util.Collection <li>iterator &lt;- java.util.Iterator </li></ul><li><p>데이터 소스 팩토리 타입</p><ul><li>SIMPLE &lt;- com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory <li>DBCP &lt;- com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory <li>JNDI &lt;- com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory </li></ul><li><p>캐시 컨트롤러 타입</p><ul><li>FIFO &lt;- com.ibatis.sqlmap.engine.cache.fifo.FifoCacheController <li>LRU &lt;- com.ibatis.sqlmap.engine.cache.Iru.LruCacheController <li>MEMORY &lt;- com.ibatis.sqlmap.engine.cache.memory.MemoryCacheController <li>OSCACHE &lt;- com.ibatis.sqlmap.engine.cache.OSCacheController </li></ul><li><p>XML 결과 타입</p><ul><li>Dom &lt;- com.ibatis.sqlmap.engine.type.DomTypeMarker <li>domCollection &lt;- com.ibatis.sqlmap.engine.type.DomCollectionTypeMarker <li>Xml &lt;- com.ibatis.sqlmap.engine.type.XmlTypeMarker <li>XmlCollection &lt;- com.ibatis.sqlmap.engine.type.XmlCollectionTypeMarker </li></ul></li></ul></li></ul><li><p>&lt;<span style="COLOR: rgb(255,51,153)">transactionManager</span>&gt; 요소</p><ul><li><p>type - 어떤 트랜잭션 관리자르 사용할지 결정</p><ul><li><strong>JDBC</strong> : 간단한 JDBC 기반 트랜잭션 관리 기능 제공 <li>JTA : 컨테이너 기반한 트랜잭션 관리 기능 제공 <li>EXTERNAL : 트랜잭션 관리자를 제공하지 않고 iBATIS 대신 애플리케이션이 직접 트랜잭션을 관리한다고 가정 </li></ul><li>commitRequired - 커넥션을 닫기 전에 commit/rollback 제어시, 기본값: false <li>&lt;property&gt; 요소 - 각 트랜잭션 관리자 서로 다른 설정 옵션 가능 <li>&lt;dataSource&gt; 요소 - javax.sql.DataSource 객체를 사용 -&gt; 커넥션 풀 작업을 표준화 <li><p>type 속성 - 어떤 클래스의 객체를 생성해서 데이터 소스 팩토리를 얻어올지를 정하는 속성</p><ul><li><strong>SIMPLE</strong> - 간단한 커넥션 풀을 내장한 데이터 소스를 설정하고자 할 때(JDBC 드라이버만 빼고 데이터 소스에 필요한 모든 것을 자체 내장) <li>DBCLP - <a class="con_link" title="Jakarta Commons Database Connection Pool" href="http://jakarta.apache.org/commons/dbcp" target="_blank"><span style="COLOR: #568942">Jakarta Commons Database Connection Pool</span></a> 구현을 제공 <li>JNDI - JNDI(Java Naming and Directory Interface)를 통해 할당된 컨테이너 기반의 데이터 소스를 공유하도록 사용 </li></ul><li><p>&lt;typeHandler&gt;</p><ul><li>타입 핸들러 이용: JDBC 데이터베이스 전용 데이터형 -&gt; 애플리케이션의 데이터형 변환(번역기) </li></ul></li></ul><li><p>&lt;<span style="COLOR: rgb(255,51,153)">sqlMap</span>&gt; 요소</p><ul><li>resource - SQL Map 파일을 자바 클래스패스에 두고 리소스로서 참조 <li>url - java.net.URL 클래스가 인식하는 임의의 URL 값 이용 </li></ul></li></ul></li></ul><p>&nbsp;</p><ul><li><p>SQL Map API</p><ul><li><p>SqlMapClient 인터페이스</p><ul><li><p>queryForObject() - 데이터베이스로부터 한 개의 레코드를 가져다가 자바 객체에 저장</p><ul><li><p>Object queryForObject(String id, Object parameter) throws SQLException;</p><ul><li>디폴트 생성자를 가진 객체를 생성(보편적 방법) <li>디폴트 생성자가 없으면 throws "런타임 예외" </li></ul><li><p>Object queryForObject(String id, Object parameter, <span style="COLOR: rgb(0,51,102)">Object result</span>) throws SQLException;</p><ul><li>반환하는 값으로 사용될 객체를 받음 <li>결과값 -&gt; 파라미터의 형태로 객체에 지정 <li>생성자가 protected / 디폴트 생성자가 없어서 객체를 쉽게 생성할 수 없을 때 유용 </li></ul></li></ul><li><p>queryForList() - 한 개 이상의 레코드를 가져와서 자바 객체의 List를 만드는 데 사용</p><ul><li><p>List queryForList(String id, Object parameter) throws SQLException;</p><ul><li>매핑 구문이 반환하는 모든 객체를 반환 </li></ul><li><p>List queryForList(String id, Object parameter, int skip, int max) throws SQLException;</p><ul><li>전체 결과의 일부만을 반환 <li>skip : 지정된 개수만큼 건너뛰고 <li>max : 지정된 개수의 레코드만 반환 <li>2.3버전부터 비권장 </li></ul></li></ul><li><p><a class="con_link" title="queryForMap()" href="http://openframework.or.kr/JSPWiki/Wiki.jsp?page=QueryForMapExample" target="_blank"><span style="COLOR: #568942">queryForMap()</span></a> - 데이터베이스로부터 한 개 혹은 그 이상의 레코드를 가져올 때 자바 객체의 Map을 반환</p><ul><li><p>Map queryForMap(String id, Object parameter, String key) throws SQLException;</p><ul><li>퀴리 실행후 Map 객체를 생성하여 반환 <li><p>key : 결과 객체를 가리키는 키, -&gt; 지정된 프로퍼티의 값</p><ul><li><div>Map accountMap = sqlMap.queryForMap(<br>&nbsp;&nbsp; "Account.getAll", null, "accountId");<br>System.out.println(accountMap);</div></li></ul></li></ul><li><p>Map queryForMap(String id, Object parameter, String key, String value) throws SQLException;</p><ul><li><p>결과값 객체 -&gt; value 파라미터에 지정된 프로퍼티 값이 됨</p><ul><li><div>accountMap = sqlMap.queryForMap(<br>&nbsp;&nbsp; "Account.getAll", null, "accountId", "username");<br>System.out.println(accountMap);</div></li></ul></li></ul></li></ul></li></ul></li></ul><li><p>non-query 구문</p><ul><li><p>데이터 갱신</p><ul><li><p>insert 메소드</p><ul><li><p>Object inser(String id, Object parameterObject) throws SQLException;</p><ul><li>파라미터 : 실행할 매핑 구문의 이름, 파라미터 객체(데이터베이스에 데이터 삽입하는 데 사용) <li>반환 : 객체 </li></ul></li></ul><li><p>update 메소드</p><ul><li><p>int update(String id, Object parameterObject) throws SQLException;</p><ul><li>파라미터: 실행할 매핑 구문의 이름, 값을 제공하는 데 사용할 파라미터 객체 <li>반환: update 구문에 의해 영향을 받은 레코드의 개수 </li></ul></li></ul><li><p>delete 메소드</p><ul><li><p>int delete(String id, Object parameterObject) throws SQLException;</p><ul><li>파라미터: 실행할 매핑 구문의 이름, 값을 제공하는 데 사용할 파라미터 객체 <li>반환: 삭제된 레코드의 개수 </li></ul></li></ul></li></ul><li><p>매핑 구문</p><ul><li><p>&lt;insert&gt; | id, parameterClass, parameterMap</p><ol class="code"><li>&lt;parameterMap id="fullParameterMapExample" class="Account"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter property="accountId" jdbcType="NUMBER" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;parameter property="username" jdbcType="VARCHAR" /&gt;<br>&nbsp;&nbsp;&nbsp; ...<br>&lt;/parameterMap&gt;<br><br>&lt;insert id="insertWithExternalInfo"<br>&nbsp;&nbsp;&nbsp; parameterMap="fullParameterMapExample"&gt;<br>&nbsp;&nbsp;&nbsp; insert into account (<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; account Id,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; username, ...<br>&nbsp;&nbsp;&nbsp; ) values (<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ?, ? , ...<br>&nbsp;&nbsp;&nbsp; )<br>&lt;/insert&gt; <li><div>in Java 사용<br>sqlMap.insert("Account.insertWithExternalInfo", account);</div></li></ol><li>&lt;update&gt; | id, parameterClass, parameterMap <li>&lt;delete&gt; | id, parameterClass, parameterMap <li>&lt;procedure&gt; | id, parameterClass, resultClass, parameterMap, resultMap, xmlResultName <li><p>&lt;sql&gt; | id</p><ul><li>매핑 구문은 아니지만, 매핑 구문 내에서 사용될 수 있는 컴포넌트를 만들기 위해 </li></ul><li><p>&lt;include&gt; | refid</p><ul><li>매핑 구문은 아니지만, 매핑 구문에 &lt;sql&gt;타입으로 생성된 컴포넌트를 삽입하기 위해 </li></ul></li></ul></li></ul><li><p>iBATIS에서 XML 사용</p><ul><li><p>XML 파라미터</p><ul><li>&lt;select id="getByXmlId" resultClass="Account" parameterClass="<strong>xml</strong>"&gt;<br>&nbsp;&nbsp; ... </li></ul><li><p>XML로 결과 생성</p><ul><li>&lt;select id="getByValueXml" resultClass=""<strong>xml</strong>" <strong>xmlResultName="account"</strong>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... </li></ul></li></ul></li></ul><h4>MVC 모델</h4><ul><li><img id="userImg4430116" style="CURSOR: pointer" onclick="popview(this)" src="http://namoda.springnote.com/pages/586397/attachments/261244" onload="'setTimeout(" ?resizeImage(4430116)?,200)?> </li></ul><ul><li><p>비지니스 객체 모델(도메인 클래스) : 처리할 도메인을 객체 지향적으로 묘사</p><ul><li>특정 비지니스 로직의 기능을 수행하기 위해 사용 <li>명사 -&gt; 이름 -&gt; 클래스 <li>약간의 로직 포함 가능(다른 계층에 접근하는 코드 금지) <li>퍼시스턴스 계층의 메소드들의 파라미터의 반환값 </li></ul><li><p><strong>프리젠테이션 계층</strong> : 출력(애플리케이션의 데이터/제어화면)하는 역할</p><ul><li>모든 정보의 레이아웃, 출력 형식을 정의 <li>예. HTML + JavaScript <li><p>웹 애플리케이션</p><ul><li>장점: 플래폼에 독립적, 배포와 확장이 쉬움 <li><p>단점: 높은 수준의 사용자 제어 방식, 복잡한 데이터 처리 어려움</p><ul><li>=&gt; 운영 시스템 위젯 사용하는 리치 클라이언트 방식(탭, 표, 트리, 내장 객체) </li></ul></li></ul><li><p>리치 클라이언트 방식</p><ul><li>장점: 강력한 사용자 인터페이스 <li>단점: 배포의 어려움, 성능, 보안에 손이감 <li>예&gt; Swing(자바), WinForms(.NET) </li></ul><li><p>복합적 리치 클라이언트(웹 애플리케이션 + 리치 클라이언트 방식)</p><ul><li>웹 서비스 &lt;= 겉 모양, 비지니스 기능 <li>XML &lt;= 리치 클라이언트와 서버 간의 매개체 <li><p>단점: 애플리케이션의 개발과 배치에 더 많은 소프트웨어 필요</p><ul><li>예) Flex(매크로미디어), Flash 브라우저 플러그인(Laszlo시스템), Ajax(Asynchoronous JavaScript And XML) </li></ul></li></ul></li></ul><li><p><strong>비지니스 로직 계층</strong>(서비스 클래스) - 애플리케이션이 제공하는 포괄적인 서비스들을 표현</p><ul><li>큰 덩어리 비지니스 기능을 관련된 비지니스 객체 모델에서 분리 <li>명사-동사 분리(예. 계좌(도메인) 메소드 분리 -&gt; 은행서비스(비지니스 로직-계좌를 개설하다) <li>서비스를 열어준다는 것은 클래스의 메소드를 사용할 수 있게 권한을 부여한다는 의미가 될 수 있음 </li></ul><li><p><strong>퍼시스턴스 계층</strong> - 객체에 저장된 데이터(저장소, 객체 가져오기)</p><ul><li>데이터 저장 방식은 다양(관계형 데이터베이스 스스템, 쉼표로 분리된 텍스트, XML 등) <li>추상화 필요 - 세부사항(데이터가 어떻게 저장/전송) 숨김 <li><p>내부 계층</p><ul><li><p>추상 계층 : 퍼스스턴스 계층에 일관성 있고 의미 있는 인터페이스 제공</p><ul><li>클래스와 메소드의 집합 <li>세부 구현 사항은 감싸서 꾸며줌 <li>적절히 추상 계층 구현을 도와주는 패턴 존재 : 예) 데이터 접근 객체(DAO;Data Access Object) </li></ul><li><p>퍼시스턴스 프레임워크 : 드라이버(or 인터페이스)와 소통하는 책임</p><ul><li>데이터 저장/가져옴/수정/검색/관리 메소드들 제공 <li>기반 저장소 클래스에 종속적 <li><p>표준API - 반복적이고 부차적인 코드가 필요</p><ul><li>JDBC(자바 애플리케이션 -데이터베이스에 접근~표준 프레임워크) <li>ADO.NET(.NET 애플리케이션을 위한 표준 데이터베이스 퍼시스턴스 프레임워크) </li></ul></li></ul><li><p>드라이버 / 인터페이스</p><ul><li>기반 저장소는 종류 다양(구현, 규모, 행동 상이) -&gt; 소프트웨어 드라이버 사용 <li>드라이버와 통신하여 차이점들을 최소화 간소화하는 역할 </li></ul></li></ul></li></ul></li></ul><p>&nbsp;</p><h4>데이터베이스</h4><ul><li><p>관계형 데이터베이스의 사용 이유? - 무결성, 성능, 보안</p><ul><li><p>무결성 - 데이터의 일관성, 신뢰, 값의 정확성 보장</p><ul><li><div>VARCHAR(25) NOT NULL</div><li>데이터 타입 엄격히 준수 - 예) 값이 문자열 데이터, 길이가 25이하 <li>제약조건 엄수 - 예) UNIQUE <li>트랜잭션 사용 - 연관(관련)된 데이터들의 일관성 있는 수정 방식(여러 사용자) </li></ul><li><p>성능 - 설계, 소프트웨어 튜닝, 하드웨어</p><ul><li>설계: 최고 중요!!! <li>튜닝 고려사항: 캐시, 파일 관리자, 인덱스 알고리즘, 운영체제 등 <li>하드웨어 고려사항: 고속 디스크 어레이, 고속I/O 컨트롤러, 고속 하드웨어 캐시, 네트워크 인터페이스 </li></ul><li>보안 - 기밀 데이터 유지 </li></ul><li><p>데이터베이스 형태(4가지)</p><ul><li><p>애플리케이션 데이터베이스 - 작고 단순한 형태, 외부 영향 적음</p><ul><li>해당 프로젝트의 일보로 애플리케이션과 나란히 설계/구현 <li>예) 웹 애프리케이션 -&gt; 데이터베이스(MySQL,PostgreSQL) -&gt; 리포팅 툴(크리스탈 리포트) </li></ul><li><p>기업용 데이터베이스 - 큰 규모, 외부의 영향 큼</p><ul><li>통합 데이터베이스 - 트랜잭션처리 데이터베이스 - 리포팅 데이터베이스 </li></ul><li>독점적 데이터베이스 - 직접 제작 vs 구입(패키지 소프트웨어) <li><p>레거시 데이터베이스 - 오래된 데이터베이스(보잡성, 뒤죽박죽 설계, 의존성. age)</p><ul><li>수년간에 걸친 수정, 긴급한 수리 작업, 오류 은폐작업, 오류 피해가기, 땜질식 문제 해결, 기술적 제약 극복 패치.. </li></ul></li></ul></li></ul><p>&nbsp;</p><h4>iBATIS</h4><ul><li><p>iBATIS - 데이터 매퍼</p><ul><li><p>매퍼계층: 객체와 데이터베이스 그리고 매퍼 자체를 독립적으로 유지 + 객체와 데이터베이스 간에 데이터를 이동</p><ul><li>SQL 구문의 파라미터와 결과(입력/출력)를 클래스에 매핑 </li></ul><li><p>매핑방법</p><ul><li><p>SQL 구문 - 입력과 출력으로 구분</p><ul><li><p>예) 입력 first_name, last_name / 출력 1234</p><ol class="code"><li>select <strong>first_name</strong>, <strong>last_name</strong><br>from employee<br>where employee_number=<strong>1234</strong>; </li></ol><li><p>XML 서술 파일 : SQL 구문의 입력과 출력을 매핑</p><ol class="code"><li>&lt;select <strong>id</strong>="<span style="BACKGROUND-COLOR: rgb(255,204,102)">getAddress</span>" parameterClass="int" resultClass="<span style="BACKGROUND-COLOR: rgb(174,255,102)">Address</span>"&gt; <li style="MARGIN-LEFT: 2em">select <li style="MARGIN-LEFT: 4em">ADR_ID&nbsp;&nbsp; as id, <li style="MARGIN-LEFT: 4em">ADR_DESCRIPTION as description, <li style="MARGIN-LEFT: 4em">ADR_STREET as street, <li style="MARGIN-LEFT: 4em">ADR_CITY as city <li style="MARGIN-LEFT: 2em">from address <li style="MARGIN-LEFT: 2em">where ADR_ID = <strong>#id#</strong> <li>&lt;/select&gt; </li></ol><ul><li>별칭 idsms id라고 불리는 Address 클래스의 프로퍼티에 매핑 <li>#id# - 파라미터(Integer 형) <li><p>위 코드를 수행하는 자바 코드</p><ol class="code"><li><span style="BACKGROUND-COLOR: rgb(174,255,102)">Address</span> addr = (<span style="BACKGROUND-COLOR: rgb(174,255,102)">Address</span>) sqlMap.queryForObject("<span style="BACKGROUND-COLOR: rgb(255,204,102)">getAddress</span>", new Integer(5)); </li></ol><li><p>위 코드를 수행하는 C# 코드</p><ol class="code"><li><span style="BACKGROUND-COLOR: rgb(174,255,102)">Address</span> addr = (<span style="BACKGROUND-COLOR: rgb(174,255,102)">Address</span>) sqlMap.queryForObject("<span style="BACKGROUND-COLOR: rgb(255,204,102)">getAddress</span>", 5); </li></ol></li></ul></li></ul><li><p>JDBC, ADO.NET 코드 작성 대신</p><ul><li><p>예) JDBC vs iBATIS</p><ul><li><p>JDBC</p><ol class="code"><li>public <span style="BACKGROUND-COLOR: rgb(255,204,102)">Employee</span> getEmployee (<span style="BACKGROUND-COLOR: rgb(174,255,102)">int</span> id) throws SQLException {<br>&nbsp;&nbsp;&nbsp; Employee employee = null;<br>&nbsp;&nbsp;&nbsp; String sql = "<strong>SELECT * from employee</strong> " +<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "<strong>where employee_number</strong> = ?";<br>&nbsp;&nbsp;&nbsp; Connection conn = null;<br>&nbsp;&nbsp;&nbsp; PreparedStatemnent ps = null;<br>&nbsp;&nbsp;&nbsp; ResultSet rs = null;<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn = datasource.getConnection();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ps = conn.prepareStatement(sql);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ps.setInt(1, id);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rs = ps.executeQuery();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (rs.next()) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; employee = new <strong>Employee()</strong>;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; employee.<strong>set</strong>Id(rs.getInt("ID"));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; employee.<strong>set</strong>EmployeeNumber(rs.getInt("EMPLOYEE_NUMBER"));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; employee.<strong>set</strong>FirstName(rs.getString("FIRST_NAME"));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; employee.<strong>set</strong>LastName(rs.getString("LAST_NAME"));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; employee.<strong>set</strong>Title(rs.getString("TITLE"));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(rs != null) rs.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } filnally {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ps != null) ps.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } filnally {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (conn != null) conn.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return employee;<br>} </li></ol><li><p>iBATIS</p><ol class="code"><li>&lt;select id="getEmployee" parameterClass="java.lang.Integer" resultClass="<span style="BACKGROUND-COLOR: rgb(255,204,102)">Employee</span>"&gt; <li style="MARGIN-LEFT: 2em">select <li style="MARGIN-LEFT: 4em">ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as id, <li style="MARGIN-LEFT: 4em">EMPLOYEE_NUMBER&nbsp;&nbsp;&nbsp;as description, <li style="MARGIN-LEFT: 4em">FIRST_NAME&nbsp;&nbsp;&nbsp;as street, <li style="MARGIN-LEFT: 4em">LAST_NAME&nbsp;&nbsp;&nbsp; as city <li style="MARGIN-LEFT: 4em">TITLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as title <li style="MARGIN-LEFT: 2em">from employee <li style="MARGIN-LEFT: 2em">where EMPLOYEE_NUMBER = #empNum# <li>&lt;/select&gt; </li></ol><ul><li><p>실행 코드</p><ol class="code"><li>Employee emp = (Employee) sqlMap.queryForObject("getEmployee", new Integer(5)); </li></ol></li></ul></li></ul></li></ul></li></ul></li></ul><li>(추가내용) </li></ul><p><img style="CURSOR: pointer" onclick="popview(this)" height="311" src="http://namoda.springnote.com/pages/586397/attachments/262371" width="547"></p><p>자바빈즈를 PreparedStatement 파라미터와 ResultSet으로 맵핑시켜주는 기능을 담당</p><p>&nbsp;</p><ul><li><p>디미터 법칙(Law of Demeter) "각 계층은 다른 계층에 대해 오직 제한된 정보만을 가질 수 있다: 오직 현재 계층에 인접한 계층에 대해서만."</p><ul><li>각 계층이 오직 자기 바로 아래 계층과만 소통 가능 <li>의존성이 한 방향으로만 흐르는 것을 조장(스파게티 코드 피하기) <li>iBATIS는 퍼시스턴스 계층 프레임워크(위: 비지니스 로직 / 아래: 데이터베이스) </li></ul></li></ul><h4>Spring과 iBATIS</h4><ul><li><p>왜 iBATIS대신에 Spring을 사용할까?</p><ul><li><p>iBATIS DAO 계층</p><ul><li>장점: 빠르고 쉬운 솔루션 <li>BATIS SQL Maps / iBATIS DAO 계층 분리(2.3~) <li>요구사항: 트랜잭션/커넥션 관리 -&gt; Spring보다 훨씬 간단하게 사용가능한 프레임워크 <li>단점: 간결함 <li><p>DAO 패턴을 사용: 결함도가 낮아짐(decoupling) -&gt; 테스트하기 쉽다</p><ul><li>Action에서 필요한 코드의 구현을 알 필요 없이 오직 필요한 인터페이스만 알면 됨. <li>구현체는 설정을 통해 기워 넣게 됨 </li></ul></li></ul><li>Spring : 커넥션과 트랜잭션 관리, 애플리케이션의 모든 부분에 적용(iBATIS&nbsp;DAO는DAO계층에만 적용) </li></ul><li><p>효율적인 DAO 계층</p><ul><li><p>구현체에서 인터페이스 분리</p><ul><li><p>이유</p><ol><li>구현체 바꿔 치기가 가능(다른 형태의 데이터 접근 지원 가능) <li>테스트가 쉽고 빨리짐(실제 DB에 접근하는 객체 대신 가상의 DAO 객체를 끼워 넣을 수 있으므로) </li></ol><li><p>IDE : 분리 과정 쉽게 처리 가능</p><ul><li>리팩토링 툴(클래스에서 인터페이스를 분리 가능) <li><p>인터페이스를 만들 때 구현 클래스를 어떤 다른 데잍터베이스를 다루는 툴에 종속적인 부분에 노출 가능성 높음</p><ul><li><p>노출: DAO가 아닌 데이터 접근 구현체에 애플리케이션을 묶어버림</p><ul><li><p>예) 'Fast Lane Reader'패턴을 사용하는 웹 애플리케이션 - JDBC 코드가 뷰 계층과 직접 소통 (테스트 어려워짐)</p><ul><li>-&gt; 콜백을 사용해서 코드를 작성(뷰가 요청한 데이터를 처리하는 RowHanlder 같은 것) </li></ul></li></ul><li><p>SQL Maps API를 직접 사용하는 애플리케이션 -&gt; 캡슐화된 API</p><ul><li><p>예) sqlMapClient 객체의 queryForList() 메소드를 호출하는 클래스 - &gt; 작성한 DAO 클래스를 호출하게 리팩토링, 클래스의 메소드에서는 List 객체를 반환</p><ul><li>데이터 사용자 - 작성한 DAO하고만 소통 가능 </li></ul></li></ul></li></ul></li></ul></li></ul><li><p>외부에서 설정된 팩토리(factory)를 사용하여 구현체의 결합도 낮추기</p><ul><li><p>인터페이스와 구현체 둘 다 DAO를 사용하는 클래스에 노출(인터페이스에 대한 의존성을 DAO를 사용하는 클래스에 추가한 셈)시키면 안됨</p><ul><li><p>[구현체]-[DAO]-[interface]-&gt; 구현체를 어떻게 사용할 수 있을 것인가?</p><ol class="code"><li>AccountDao accountDao = new AccountDaoImpl();&nbsp;&nbsp; <span style="COLOR: rgb(0,128,1)">// DAO를 구현에서 분리, 구현체를 직접 참조하고 있음</span> <li>AccountDao accountDao = <strong>(AccountDao)</strong>DaoFactory.get(AccoutDao.class);&nbsp;&nbsp; <span style="COLOR: rgb(0,128,1)">// 초점: DaoFacotry가 AccountDao 인테페이스를 구현한 객체를 반환</span> </li></ol><ul><li><p>DAO factory</p><ul><li><p>public인테피이스는 getInstance()와 getDao() 두개의 메소드로 이루어져 있음</p><ol class="code"><li>public class DaoFactory { <li style="MARGIN-LEFT: 2em">private static DaoFatory instance = new DaoFactory(); <li style="MARGIN-LEFT: 2em">private final String defaultConfigLocation = "DaoFactory.properties";&nbsp;&nbsp; // 프로퍼티 화일(인터페이스, 구현체 이름) <li style="MARGIN-LEFT: 2em">private Properties daoMap; <li style="MARGIN-LEFT: 2em">private Properties instanceMap; <li style="MARGIN-LEFT: 2em">private String configLocation = System.getProperty( <li style="MARGIN-LEFT: 24em"><p>"dao.factory.config",</p><p>defaultConfigLocation</p><p>);</p><li style="MARGIN-LEFT: 2em">private DaoFactory() {&nbsp;&nbsp; <span style="COLOR: rgb(0,128,1)">// 1. private 생성자 선언(single tone; 오직 단 한 개의객체만 생성할 수 있는 클래스</span>) <li style="MARGIN-LEFT: 4em">daoMap = new Properties(); <li style="MARGIN-LEFT: 4em">instanceMap = new Properties(); <li style="MARGIN-LEFT: 4em">try { <li style="MARGIN-LEFT: 6em">daoMap.load(getInputStream(configLocation)); <li style="MARGIN-LEFT: 4em">} catch (IOException e) { <li style="MARGIN-LEFT: 6em">throw new RuntimeException(e); <li style="MARGIN-LEFT: 4em">} <li style="MARGIN-LEFT: 2em">private InputStream getInputStrream(String configLocation) <li style="MARGIN-LEFT: 2em">{ <li style="MARGIN-LEFT: 4em">return Thread <li style="MARGIN-LEFT: 10em">.currentThread() <li style="MARGIN-LEFT: 10em">.getContextClassLoader() <li style="MARGIN-LEFT: 10em">.getResourceAsStream(configLocation); <li style="MARGIN-LEFT: 2em">} <li style="MARGIN-LEFT: 2em">public static DaoFactory <strong>getInstance()</strong> {&nbsp;&nbsp; <span style="COLOR: rgb(0,128,1)">// 2. 간단한 팩토리 메소드를 선언</span> (이 클래스의 유일한 인스턴스 반환) <li style="MARGIN-LEFT: 4em">return instance; <li style="MARGIN-LEFT: 2em">} <li style="MARGIN-LEFT: 2em">public Object <strong>getDao</strong>(Class daoInterface) {&nbsp;&nbsp; <span style="COLOR: rgb(0,128,1)">// 3. DAO를 가져온다</span> (인터페이스의 구현체를 반환) <li style="MARGIN-LEFT: 4em">if (instanceMap.containsKey(daoInterface)) { <li style="MARGIN-LEFT: 6em">return instanceMap.get(daoInterface); <li style="MARGIN-LEFT: 4em">} <li style="MARGIN-LEFT: 4em">return createDao(daoInterface); <li style="MARGIN-LEFT: 2em">} <li style="MARGIN-LEFT: 2em">private synchoronized Object createDao (Class daoInterface) {&nbsp;&nbsp; <span style="COLOR: rgb(0,128,1)">// 4. 타입 별로 단 하나의 DAO만 생성함을 보장</span> <li style="MARGIN-LEFT: 4em">Class implementationClass; <li style="MARGIN-LEFT: 4em">try { <li style="MARGIN-LEFT: 6em">implementationClass = Class.forName((String)daoMap.get(daoInterface)); <li style="MARGIN-LEFT: 6em">Object implementation = implementationClass.newInstance(); <li style="MARGIN-LEFT: 6em">instanceMap.put(implementationClass, implementation); <li style="MARGIN-LEFT: 4em">} catch (Exception e) { <li style="MARGIN-LEFT: 6em">throw new RuntimeException(e); <li style="MARGIN-LEFT: 4em">} <li style="MARGIN-LEFT: 4em">return instanceMap.get(daoInterface);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // DAO에 대한 실제 요청이 발생할 때에 생성 <li style="MARGIN-LEFT: 2em">} <li>} </li></ol><p>&nbsp;</p><ol class="code"></ol></li></ul><li>&nbsp; </li></ul></li></ul></li></ul><li>트랜잭션과 커넥션 관리기능 제공(chap. 7) </li></ul><li><p>스프링: 데이터 매퍼의 두 가지 버전(1.3, 2.0)을 지원</p><ul><li>버전 1.3 :&nbsp;SqlMapXxx (SqlMapTemplate 클래스 사용) <li><p>버전 2.0 : SqlMapClientXxx (SqlMapClientTemplate 클래스 사용: 내부적으로 iBATIS의 SqlMapClient 사용)</p><ul><li><p>SqlMapClient를 스프링 빈으로 설정 : SqlMapClientFactoryBean 클래스 이용</p><ol class="code"><li><p>&lt;bean id="sqlMapClinet" class="<strong>org.springframework.orm.ibatis.SqlMapClinetFactoryBean</strong>"</p><ul style="MARGIN-LEFT: 2em"><li>p:dataSource-fef="dataSource" <li>p:configLocation="WEB-INF/sqlMap/<strong>sqlMapConfig.xml</strong>"&gt; </li></ul><li>&lt;/bean&gt; </li></ol><li><p>sqlMapConfig.xml</p><ol class="code"><li>&lt;?xml version="1.0" encoding="UTF-8" ?&gt; <li>&lt;!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" <li style="MARGIN-LEFT: 2em">"<a class="con_link" href="http://ibatis.apache.org/dtd/sql-map-config-2.dtd%22%3E" target="_blank"><span style="COLOR: #568942">http://ibatis.apache.org/dtd/sql-map-config-2.dtd"&gt;</span></a> <li>&lt;sqlMapConifg&gt; <li style="MARGIN-LEFT: 2em">&lt;sqlMap resource="<strong>GuestBook.xml</strong>" /&gt; <li>&lt;/sqlMapConifg&gt; </li></ol><li><p>GuestBook.xml</p><ol class="code"><li>&lt;?xml version="1.0" encoding="UTF-8" ?&gt; <li>&lt;!DOCTYPE sqlMap <li style="MARGIN-LEFT: 2em">PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" <li style="MARGIN-LEFT: 2em">"<a class="con_link" href="http://ibatis.apache.org/dtd/sql-map-2.dtd%22%3E" target="_blank"><span style="COLOR: #568942">http://ibatis.apache.org/dtd/sql-map-2.dtd"&gt;</span></a> <li>&lt;sqlMap namespace="Guestbook"&gt; <li style="MARGIN-LEFT: 2em"><p>&lt;typeAlias alias="Message" type="kame.spring.questbook.service.Message" /&gt;</p><p>&lt;parameterMap id="messageParamMap" class="Message"&gt;</p><li style="MARGIN-LEFT: 4em">&lt;parameter property="guestName" /&gt; <li style="MARGIN-LEFT: 2em">&lt;/parameterMap&gt; <li style="MARGIN-LEFT: 2em">&lt;resultMap id="messageResultMap" class="Message"&gt; <li style="MARGIN-LEFT: 4em">&lt;result property="id" column="GUESTBOOK_MESSAGE_ID" /&gt; <li style="MARGIN-LEFT: 4em">&lt;result property="guestName" column="GUEST_NAME" /&gt; <li style="MARGIN-LEFT: 4em">&lt;result property="content" column="CONTENT" /&gt; <li style="MARGIN-LEFT: 2em">&lt;/reslutMap&gt; <li style="MARGIN-LEFT: 2em">.. <li style="MARGIN-LEFT: 2em">&lt;select id="selectList" resultMap="messageReusltMap" resultClass="Message" parameterCalss="map"&gt; <li style="MARGIN-LEFT: 4em">select * from GUESTBOOK_MESSAGE order by GUESTBOOK_MESSAGE_ID desc limit #startRow#, #fetchSize# <li style="MARGIN-LEFT: 2em">&lt;/select&gt; <li>&lt;/sqlMap&gt; </li></ol><li>limit 는 mySql에 있다. </li></ul></li></ul></li></ul><p>&nbsp;</p><div class="autosourcing-stub"><p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 11px 0px 7px; PADDING-TOP: 0px; FONT-STYLE: normal; FONT-FAMILY: Dotum"><strong style="PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">[출처]</strong> <a href="http://blog.naver.com/jihjihs/100056088520" target="_blank">iBATIS in Action</a><span style="PADDING-RIGHT: 7px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">|</span><strong style="PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">작성자</strong> <a href="http://blog.naver.com/jihjihs" target="_blank">날개</a></p></div><a href="http://pds10.egloos.com/pds/200810/24/08/ibatis-sqlmaps-2_ko-jihjihs.pdf">ibatis-sqlmaps-2_ko-jihjihs.pdf</a><a href="http://pds12.egloos.com/pds/200810/24/08/ibatis-sqlmaps-2-tutorial_ko-jihjihs.pdf">ibatis-sqlmaps-2-tutorial_ko-jihjihs.pdf</a><a href="http://pds12.egloos.com/pds/200810/24/08/ibatis-2.3.4.726.jar">ibatis-2.3.4.726.jar</a><br/><br/>tag : <a href="/tag/iBATIS" rel="tag">iBATIS</a>,&nbsp;<a href="/tag/아이바티스" rel="tag">아이바티스</a>			 ]]> 
		</description>
		<category>JAVA</category>
		<category>iBATIS</category>
		<category>아이바티스</category>

		<comments>http://ggwangs.egloos.com/1003568#comments</comments>
		<pubDate>Fri, 24 Oct 2008 08:32:22 GMT</pubDate>
		<dc:creator>밀리</dc:creator>
	</item>
</channel>
</rss>
