<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6071494140690317675</id><updated>2012-01-31T00:33:57.011+09:00</updated><category term='Fluent'/><category term='Resharper'/><category term='Google+'/><category term='RealAdmin'/><category term='Mapping'/><category term='SubQueries'/><category term='MVC'/><category term='Indices'/><category term='Visual Sdudio'/><category term='IoC'/><category term='Castle.Windsor'/><category term='SQL Server'/><category term='Repository'/><category term='Castle'/><category term='Access Management'/><category term='Role'/><category term='Security'/><category term='Interface'/><category term='HQL'/><category term='NoSQL'/><category term='ASP.NET MVC'/><category term='ASP.NET'/><category term='FluentNHibernate'/><category term='MongoDB'/><category term='C#'/><category term='C++'/><category term='Redis'/><category term='인사'/><category term='TDD'/><category term='Parallel'/><category term='Hadoop'/><category term='Membase'/><category term='NHibernate'/><category term='BigData'/><category term='Asynchronous'/><category term='JSON'/><category term='Criteria'/><category term='Facebook'/><category term='첫글'/><category term='elements'/><category term='Silverlight'/><category term='HTML5'/><title type='text'>디밥의 블로그</title><subtitle type='html'>.NET, TDD, ORM, NoSQL 에 흥미가 많은 개발자였습니다.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://debop.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-9192539982798815820</id><published>2012-01-28T10:40:00.001+09:00</published><updated>2012-01-28T10:40:03.655+09:00</updated><title type='text'>Windows의 메모리를 관리해보자.</title><content type='html'>&lt;p&gt;일반적으로 Windows 사용자 입장에서는 메모리 관리를 OS에 맡기거나 (즉 아무것도 하지 않거나), 저처럼 Freeware 를 사용하여 메모리를 관리하겠죠. 저는 IOBit Smart RAM 을 사용합니다만, 워낙 많은 Freeware 가 있으니 뭘 쓰던 그리 큰 문제는 아닙니다.&lt;/p&gt;  &lt;p&gt;오늘 얘기하고자 하는 방향은 서버 관리자 입장에서 본 윈도우즈의 메모리 관리를 말하고자 합니다. 개인용 PC와는 달리 서버 시스템 특히 운영 서버의 경우에는 Freeware 같이 검증(?)되지 않은 것을 함부로 깔 수도 없습니다. 근데 이런 문제가 가끔 발생합니다.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;캐시 시스템을 사용하는데, 이 놈이 Max 값으로 올라간 후 내려오지 않아요 (분명 Cache Entry 는 expires가 되어 메모리에서 해제된 것을 확인 했는데도)&lt;/li&gt;    &lt;li&gt;RDBMS 등에서 미리 여유분으로 잡아 먹고 있어요.&lt;/li&gt;    &lt;li&gt;자주 사용하지 않는 시스템이 한번 실행 된 후 메모리를 반환하지 않아요&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;뭐 더 많은 상황이 있겠지만, 제가 간접적으로 겪은 1번 상황에 대해서만 얘기하겠습니다. 2번은 성능을 위해서라도 그냥 냅두시는 게 좋을 것이고, 3번은 1번에 묻어서 같이 해결 보는 걸로 하겠습니다.&lt;/p&gt;  &lt;p&gt;자 그럼 우선 윈도우즈의 메모리 관리에 대해 알아봐야겠지요? 윈도우즈 OS 라는 놈이 메모리 관리에 대해서 그리 좋은 시스템이 못 되는 것은 유명합니다만, 그래도 쓸만은 합니다. 즉 특수한 극한 상황이 아니라면, 훌륭한 역할을 수행하고 있다는 얘기지요. &lt;/p&gt;  &lt;p&gt;다만 메모리를 많이 쓰는 프로세스가 많은 일을 하고자 할 때, 메모리를 미리 선점한 놈들에게 정리 시키도록 해주면 훨씬 좋은 성능의 시스템이 될 수 있습니다. &lt;/p&gt;  &lt;p&gt;위의 1번의 경우처럼 캐시시스템은 자신이 사용할 메모리를 예측하여, 미리 할당해서 사용하고, 메모리 사용을 더 이상 할 필요가 없어도, 향후 또 필요할 것을 대비해서 그냥 잡아둡니다. 그게 캐시 시스템 입장에서는 더 효과적이죠. 메모리를 반환하고, 필요할 때 다시 할당하는 일은 2중의 비용이 들어가니까요. (캐시 시스템 만든 개발자들이 똑똑하게 만들었겠죠) 다만 Memcached 나 SharedCache 처럼 메모리만을 기반으로 하는 캐시 시스템의 경우, 특별한 상황에서는 과도한 메모리를 사용하여, 운영자의 간담을 서늘케 하는 경우가 가끔 있습니다. (우린 이런 사람들을 새가슴 혹은 원리를 모르는 사람 이라고 하지요^^ – 농담입니다.)&lt;/p&gt;  &lt;p&gt;다만 1번 경우 때문에 운영서버를 하루에 한번씩 RESET 하는 회사가 있어서요… 참 답답할 노릇이죠…&lt;/p&gt;  &lt;p&gt;자 그럼 이런 상황에서 강제로 메모리를 반환 받을 수는 없을까요? OS 라면 가능하겠지요? OS가 대빵인데, 지들이 무슨 힘이 있겠어요? &lt;/p&gt;  &lt;p&gt;자 여기서 보면 그럼 OS가 효율적으로 메모리 관리를 하면 1번과 같은 문제가 안 생기겠네요? 네 대부분 안 생깁니다. 다만 급격하게 메모리를 많이 사용해야 하는 프로세스가 늘어나면, Pagefile을 써야하고, 그럼 실행속도가 느려집니다. 이때서야 OS가 아… 너 메모리가 많이 부족하구나… 다른 놈들 메모리 좀 정리해서 방 비워줄께…&lt;/p&gt;  &lt;p&gt;즉 뒷북이란 말이죠…&lt;/p&gt;  &lt;p&gt;그럼 처음으로 돌아가서 메모리 관리용 Freeware를 사용하면 되잖아요… 운영지침상 서버에는 깔지 못한다니까요^^&lt;/p&gt;  &lt;p&gt;그럼 어떻하지요? OS가 방을 비워주기를 기다리지 말고, 메모리 관리 Freeware 처럼 내 프로그램에서 OS에게 실행중인 프로세스들에게 사용하지 않는 메모리 비워라!!! 라고 요청할 수 있으면 되겠지요?&lt;/p&gt;  &lt;p&gt;말이 참 길었죠? 실제 메모리를 반환하도록 하는 코드입니다.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background: white; color: blue"&gt;public static class &lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;ProcessTool&lt;br /&gt;&lt;/span&gt;&lt;span style="background: white; color: black"&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;#region &lt;/span&gt;&lt;span style="background: white; color: black"&gt;&amp;lt;&amp;lt; logger &amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;private static readonly &lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;NLog&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;Logger &lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log &lt;/span&gt;&lt;span style="background: white; color: black"&gt;= &lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;NLog&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;LogManager&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;GetCurrentClassLogger&lt;/span&gt;&lt;span style="background: white; color: black"&gt;();&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;private static readonly bool &lt;/span&gt;&lt;span style="background: white; color: purple"&gt;IsDebugEnabled &lt;/span&gt;&lt;span style="background: white; color: black"&gt;= &lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;IsDebugEnabled&lt;/span&gt;&lt;span style="background: white; color: black"&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;#endregion&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// &lt;/span&gt;&lt;span style="background: white; color: green"&gt;시스템에서 실행중인 모든 프로세스에 대해, 사용하지 않는 WorkingSet 메모리를 OS에게 반환하도록 합니다.&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&amp;quot;excludeThisProcess&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: white; color: green"&gt;현재 프로세스를 제외할 것인가 여부 (기본값은 제외)&lt;/span&gt;&lt;span style="background: white; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&amp;quot;excludeProcessNames&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: white; color: green"&gt;메모리 반환을 하지 않을 프로세스 명의 컬렉션&lt;/span&gt;&lt;span style="background: white; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;public static void &lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;TrimAllProcessMemory&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: blue"&gt;bool &lt;/span&gt;&lt;span style="background: white; color: black"&gt;excludeThisProcess = &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;true&lt;/span&gt;&lt;span style="background: white; color: black"&gt;, &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;string&lt;/span&gt;&lt;span style="background: white; color: black"&gt;[] excludeProcessNames = &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;null&lt;/span&gt;&lt;span style="background: white; color: black"&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;if&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;IsInfoEnabled&lt;/span&gt;&lt;span style="background: white; color: black"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;Info&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: #a31515"&gt;&amp;quot;컴퓨터의 모든 프로세스에 대해 사용하지 않는 메모리를 OS에 반환하도록 합니다...&amp;quot;&lt;/span&gt;&lt;span style="background: white; color: black"&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;var &lt;/span&gt;&lt;span style="background: white; color: black"&gt;currentProcess = &lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;Process&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;GetCurrentProcess&lt;/span&gt;&lt;span style="background: white; color: black"&gt;();&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;Parallel&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;ForEach&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;Process&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;GetProcesses&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(),&lt;br /&gt;                         process =&amp;gt;&lt;br /&gt;                         {&lt;br /&gt;                             &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;if&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(excludeThisProcess &amp;amp;&amp;amp; (process.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;ProcessName &lt;/span&gt;&lt;span style="background: white; color: black"&gt;== currentProcess.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;ProcessName&lt;/span&gt;&lt;span style="background: white; color: black"&gt;))&lt;br /&gt;                                 &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;return&lt;/span&gt;&lt;span style="background: white; color: black"&gt;;&lt;br /&gt;&lt;br /&gt;                             &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;if&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(excludeProcessNames != &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;null &lt;/span&gt;&lt;span style="background: white; color: black"&gt;&amp;amp;&amp;amp;&lt;br /&gt;                                excludeProcessNames.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;Any&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(procName =&amp;gt; procName == process.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;ProcessName&lt;/span&gt;&lt;span style="background: white; color: black"&gt;))&lt;br /&gt;                                 &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;return&lt;/span&gt;&lt;span style="background: white; color: black"&gt;;&lt;br /&gt;&lt;br /&gt;                             &lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;TrimProcessMemory&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(process);&lt;br /&gt;                         });&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// &lt;/span&gt;&lt;span style="background: white; color: green"&gt;지정된 프로세스의 사용하지 않는 WorkingSet 메모리를 OS에게 반환하도록 합니다.&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&amp;quot;process&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: white; color: green"&gt;메모리 해제를 할 프로세스&lt;/span&gt;&lt;span style="background: white; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background: white; color: green"&gt;메모리 해제 여부&lt;/span&gt;&lt;span style="background: white; color: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;public static bool &lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;TrimProcessMemory&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;Process &lt;/span&gt;&lt;span style="background: white; color: black"&gt;process)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;if&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;IsDebugEnabled&lt;/span&gt;&lt;span style="background: white; color: black"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;Debug&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: #a31515"&gt;&amp;quot;프로세스의 Working Memory 중에 사용하지 않는 부분을 OS에 반환하도록 합니다.&amp;quot;&lt;/span&gt;&lt;span style="background: white; color: black"&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;if&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(process == &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;null&lt;/span&gt;&lt;span style="background: white; color: black"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;return false&lt;/span&gt;&lt;span style="background: white; color: black"&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;bool &lt;/span&gt;&lt;span style="background: white; color: black"&gt;_result;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;try&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: black"&gt;{&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;long &lt;/span&gt;&lt;span style="background: white; color: black"&gt;oldWorkingSet64 = process.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;WorkingSet64&lt;/span&gt;&lt;span style="background: white; color: black"&gt;;&lt;br /&gt;            _result = &lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;EmptyWorkingSet&lt;/span&gt;&lt;span style="background: white; color: black"&gt;((&lt;/span&gt;&lt;span style="background: white; color: blue"&gt;long&lt;/span&gt;&lt;span style="background: white; color: black"&gt;) process.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;Handle&lt;/span&gt;&lt;span style="background: white; color: black"&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;var &lt;/span&gt;&lt;span style="background: white; color: black"&gt;targetProcess = &lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;Process&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;GetProcessById&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(process.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;Id&lt;/span&gt;&lt;span style="background: white; color: black"&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;if&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(_result)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;if&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;IsInfoEnabled&lt;/span&gt;&lt;span style="background: white; color: black"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;Info&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: #a31515"&gt;&amp;quot;프로세스[{0}]의 WorkingSet 메모리를 비웠습니다. 기존=[{1}], 현재=[{2}], 반환값=[{3}]&amp;quot;&lt;/span&gt;&lt;span style="background: white; color: black"&gt;,&lt;br /&gt;                             process.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;ProcessName&lt;/span&gt;&lt;span style="background: white; color: black"&gt;, oldWorkingSet64, targetProcess.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;WorkingSet64&lt;/span&gt;&lt;span style="background: white; color: black"&gt;, oldWorkingSet64 -&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;catch&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;Exception &lt;/span&gt;&lt;span style="background: white; color: black"&gt;ex)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;if&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;IsWarnEnabled&lt;/span&gt;&lt;span style="background: white; color: black"&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;Warn&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: #a31515"&gt;&amp;quot;Process[{0}]의 메모리를 정리하는데 예외가 발생했습니다...&amp;quot;&lt;/span&gt;&lt;span style="background: white; color: black"&gt;, process.&lt;/span&gt;&lt;span style="background: white; color: purple"&gt;ProcessName&lt;/span&gt;&lt;span style="background: white; color: black"&gt;);&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: white; color: purple"&gt;log&lt;/span&gt;&lt;span style="background: white; color: black"&gt;.&lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;Warn&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(ex);&lt;br /&gt;            }&lt;br /&gt;            _result = &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;false&lt;/span&gt;&lt;span style="background: white; color: black"&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;return &lt;/span&gt;&lt;span style="background: white; color: black"&gt;_result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [&lt;/span&gt;&lt;span style="background: white; color: #00008b"&gt;DllImport&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: #a31515"&gt;&amp;quot;psapi&amp;quot;&lt;/span&gt;&lt;span style="background: white; color: black"&gt;)]&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: white; color: blue"&gt;internal static extern bool &lt;/span&gt;&lt;span style="background: white; color: #008b8b"&gt;EmptyWorkingSet&lt;/span&gt;&lt;span style="background: white; color: black"&gt;(&lt;/span&gt;&lt;span style="background: white; color: blue"&gt;long &lt;/span&gt;&lt;span style="background: white; color: black"&gt;hProcess);&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;핵심은 psapi.dll&amp;#160; 에 있는 EmptyWorkingSet(long hProcess) 입니다. 이 놈이 특정 프로세스의 사용하지 않는 메모리를 반환하게끔 합니다.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;혹시 Win32 API 사용에 어려움이 있으시다면, &lt;a href="http://pinvoke.net/" target="_blank"&gt;PInvoke.net&lt;/a&gt; 사이트를 참조하세요. .NET에서 Win32 API 를 사용할 때, 많은 도움을 줄 수 있는 사이트입니다.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;저는 위의 &lt;span style="background: white; color: #00008b"&gt;ProcessTool &lt;/span&gt;.&lt;span style="background: white; color: #008b8b"&gt;TrimAllProcessMemory()&amp;#160; &lt;font color="#000000"&gt;를 CPU 활용률이 5% 미만일 경우 1시간마다 실행하게끔 웹 어플리케이션에서 Background Service로 돌립니다. 그럼 운영자는 메모리를 별로 사용하지 않는데도 잘 돌아간다고 좋아합니다^^&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-9192539982798815820?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/9192539982798815820/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=9192539982798815820' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/9192539982798815820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/9192539982798815820'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2012/01/windows.html' title='Windows의 메모리를 관리해보자.'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-3194420903163232231</id><published>2012-01-23T22:26:00.001+09:00</published><updated>2012-01-23T22:27:04.508+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Resharper'/><title type='text'>Resharper 가 너무 느려요.</title><content type='html'>Resharper 가 상당히 좋은 개발 툴임에도 불구하고, 많은 닷넷 개발자에게는 그림이 떡 또는 가까이 하기엔 먼 당신이 되는 건 왜일까요?&lt;br /&gt;우선 전 Resharper 를 4.x 때부터 사용해 왔으며, Resharper 없이는 개발을 못할 정도로 의존을 많이 하고 있습니다. 그만큼 저는 Resharper를 사용하는데 문제가 없습니다.&lt;br /&gt;자 그럼 일반적으로 Resharper 가 느려서 쓰지 못하겠다고 하는 상황과 제의 개발 상황을 비교해 보시면 답이 어느 정도 나옵니다.&lt;br /&gt;저는 다음과 같은 환경에서 Resharper를 씁니다.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Class Library 개발을 주로 한다.&lt;/li&gt;&lt;li&gt;한 솔루션에 80여개의 프로젝트가 있다. (물론 Class 수에 따라 많이 다르다) (여기에는 Sample용 웹 Application 도 있다)&lt;/li&gt;&lt;li&gt;Temp 폴더를 물리적으로 다른 폴더에 둔고, Resharper 파일들을 거기에 둔다.&lt;/li&gt;&lt;li&gt;메모리는 예전에는 4GB, 지금은 8GB를 사용, HDD 를 SSD를 사용한다.&lt;/li&gt;&lt;/ol&gt;자 이런 환경인데도, Visual Studio .NET 2010은 태생적으로 무거운데, 거기다가 확장 프로그램도 깔고, Resharper 도 구동하게 되면 상당히 부하가 걸립니다.&lt;br /&gt;특히 코드 페이지에서 부하가 많이 걸리는 데, &lt;strong&gt;이는 대부분 Intellisense 때문이다.&lt;/strong&gt; 여기다가 Visual Studio 확장 툴 중에 Productivity Power Tool 기능을 같이 쓰게 되면, 더욱 느려지게 된다. (우선 이 확장 프로그램의 기능을 최소화 한 다음에 써보기 바란다.)&lt;br /&gt;그 다음으로 아래 그림처럼 Resharper 의 Intellisense 기능 중에 C#, Javascript 만 두고 나머지는 제외 한다.&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/-q2EB2FL2gAk/Tx1f5Vm3e6I/AAAAAAAAAkw/G3_E_ryxNU8/s1600-h/Resharper_Interllisense%25255B3%25255D.png"&gt;&lt;img alt="Resharper_Interllisense" border="0" height="445" src="http://lh4.ggpht.com/-y22u6fn7hgo/Tx1f6HoCWnI/AAAAAAAAAk4/CNW4CFf2o04/Resharper_Interllisense_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Resharper_Interllisense" width="570" /&gt;&lt;/a&gt;&lt;br /&gt;HTML, CSS 등은 이미지 등의 리소스 들을 경로를 읽어드리고, 캐시해야 하기 때문에 속도가 느려지는 것입니다.   &lt;br /&gt;웹 개발자의 경우는 이와 같이 HTML, CSS 등의 Intellisense는 포기하고 해보시기 바랍니다. 쩝…&lt;br /&gt;예전 버전에서는 웹 Application의 경우 이미지, CSS, Javascript 등의 리소스들의 경로 및 캐싱을 수행하는데, 프로젝트에서 제외하는 방법을 사용했는데, 위의 그림처럼 Intellisense에서 분야별로 선택해서 사용하면 좀 더 쾌적한 화경에서 Resharper를 사용하실 수 있을 것입니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-3194420903163232231?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/3194420903163232231/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=3194420903163232231' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/3194420903163232231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/3194420903163232231'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2012/01/resharper.html' title='Resharper 가 너무 느려요.'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-y22u6fn7hgo/Tx1f6HoCWnI/AAAAAAAAAk4/CNW4CFf2o04/s72-c/Resharper_Interllisense_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-359898354604488794</id><published>2012-01-22T21:22:00.001+09:00</published><updated>2012-01-22T21:22:09.602+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google+'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>Facebook에 NHibernate Group을 만들었습니다.</title><content type='html'>&lt;p&gt;안녕하세요^^ 블로그로도 &lt;a href="http://www.nhforge.org/" target="_blank"&gt;NHibernate&lt;/a&gt; 정보를 제공하기도 했는데, Facebook에 Group 기능이 있더군요. 이를 이용해서 Facebook에 NHibernate 그룹을 만들었습니다.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.facebook.com/#!/groups/nhibernate.korea/" href="http://www.facebook.com/#!/groups/nhibernate.korea/"&gt;http://www.facebook.com/#!/groups/nhibernate.korea/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;제가 관리하고 있고요, 신청하시는 분들은 모두 가입되도록 하겠습니다. 관심 있으신 분은 참여해주기 바랍니다.&lt;/p&gt;  &lt;p&gt;한가지 더 – Google+ 에도 NHibernate Korea 서클을 만들었습니다.   &lt;br /&gt;둘 중 어떤 서비스가 더 좋을 지 몰라 우선 둘 다 만들어서 써보면서, 좋은 쪽으로 단일화해야 할 것 같습니다.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-359898354604488794?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/359898354604488794/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=359898354604488794' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/359898354604488794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/359898354604488794'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2012/01/facebook-nhibernate-group.html' title='Facebook에 NHibernate Group을 만들었습니다.'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-7745728523518817696</id><published>2012-01-14T12:00:00.001+09:00</published><updated>2012-01-14T12:00:31.861+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Sdudio'/><category scheme='http://www.blogger.com/atom/ns#' term='Resharper'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Visual Studio 11 Dev Preview를 위한 Resharper</title><content type='html'>&lt;p&gt;Visual Studio 2010의 느려터진 속도에 절망의 세월을 보내고 있습니다만, 갑자기 Windows 8 Preview 와 더불어 Visual Studio 11 Dev Preview가 나와서 당장 설치해 봤습니다.   &lt;br /&gt;내부적으로는 .NET 4.5 기반이지만 .NET 4.0 에 설치되는 것을 보니, 버전 숫자에 의아하기도 하기도 하지만, 버전 구분을 자꾸 바꾸는 것이 좋지 않음을 경험으로 알고 있어서… “다행이다~” 를 외쳤습니다.&lt;/p&gt;  &lt;p&gt;다음으로는 Visual Studio 11 을 실행하는 데 “우와” 엄청 빠르다… VS.NET 2010을 그냥 버리고 싶습니다…&lt;/p&gt;  &lt;p&gt;그런데 한가지 제약이 있군요… 전 다른 건 몰라도 &lt;a href="http://www.jetbrains.com/resharper/" target="_blank"&gt;Resharper&lt;/a&gt; 가 없으면 코딩을 못합니다.    &lt;br /&gt;Resharper 의 조언이 없으면 불안하고, 색상이 달라지면 괜히 속성과 클래스가 헷갈리고 그렇습니다. ㅎㅎ&lt;/p&gt;  &lt;p&gt;다행히 &lt;a href="http://confluence.jetbrains.net/display/ReSharper/ReSharper+Early+Access+Program" target="_blank"&gt;Resharper EAP&lt;/a&gt; 에서 Resharper 6.1.1 부터는 Visual Studio 11 Preview 도 지원하는군요.    &lt;br /&gt;다만 설치본이 아니라, 아래 화면처럼 Resharper for VS11 (.vsix) 를 다운 받으셔야 합니다.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-IyKUVHSelJI/TxDvybStt6I/AAAAAAAAAjM/WF3xTpzGFOI/s1600-h/Resharper_VS11_Download%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Resharper_VS11_Download" border="0" alt="Resharper_VS11_Download" src="http://lh3.ggpht.com/-oGHIVHxxnME/TxDvzJwWaGI/AAAAAAAAAjU/x6Gfjdwt-sg/Resharper_VS11_Download_thumb%25255B1%25255D.png?imgmax=800" width="683" height="440" /&gt;&lt;/a&gt;&lt;/p&gt;      &lt;p&gt;설치 후 Visual Studio 11을 실행 시켰습니다… 결론적으로 Preview 임에도 Visual Studio 2010 보다 실행속도도 빠르고, 반응 속도도 빠르네요. 물론 영어와 한글버전의 차이도 있으려나 싶지만, 그래도 그렇지 Preview 가 더 빠르다는 게… 좀 그렇네요…&lt;/p&gt;  &lt;p&gt;이제 저는 Visual Studio 11 Preview를 이용해 코딩합니다^^   &lt;br /&gt;Visual Studio 11 Dev Preview를 설치하신 분들은 한번 시도해보시길…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-7745728523518817696?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/7745728523518817696/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=7745728523518817696' title='4개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/7745728523518817696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/7745728523518817696'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2012/01/visual-studio-11-dev-preview-resharper.html' title='Visual Studio 11 Dev Preview를 위한 Resharper'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-oGHIVHxxnME/TxDvzJwWaGI/AAAAAAAAAjU/x6Gfjdwt-sg/s72-c/Resharper_VS11_Download_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-3842041099786163693</id><published>2012-01-13T21:47:00.001+09:00</published><updated>2012-01-13T21:47:14.606+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BigData'/><category scheme='http://www.blogger.com/atom/ns#' term='NoSQL'/><title type='text'>요즘 Issue 가 되는 빅데이터 분석에 대한 생각</title><content type='html'>&lt;p&gt;지인이 빅데이터 분석 회사의 사장이고, 요즘 여러 매체에서도 “빅데이터” 라는 용어가 상당히 자주 등장하네요. 예전 Data Warehouse 나 ETL, OLAP 등의 용어가 이제는 너무 오래된 구식 용어가 된 느낌이네요^^&lt;/p&gt;  &lt;p&gt;어쨌거나 “빅데이터” 라는게 직적적으로는 단순히 아주 많은 데이터를 의미하기도 하지만, &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;얼마나 많은 데이터를 빠르고, 안정적으로 수집하고 관리하느냐&lt;/li&gt;    &lt;li&gt;원하는 분석 결과를 얼마나 효과적으로 추출할 수 있느냐?&lt;/li&gt;    &lt;li&gt;원하는 분석을 정의하기, 데이터 필터링 기능 등의 데이터 정제 기능&lt;/li&gt;    &lt;li&gt;분석 결과 리포팅 등의 보고서 기능&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;등을 필요로 하겠지요.&lt;/p&gt;  &lt;p&gt;저야 이 분야에 대해, 아직까지는 DW 와 OLAP 수준을 벗어나지 못했습니다. 다만, 데이터 양이 기하급수적으로 늘었으니, 새로운 방법으로 데이터를 처리해야 하는 것에 이견이 있는 것이 아닙니다.&lt;/p&gt;  &lt;p&gt;예전이나 지금이나 아주 많은 Data가 있더라도, 거기에서 의미있는 가설을 이용하여 의미있는 결과를 만들어 낼 수 있는 능력이 더 중요하다고 볼 수 있습니다.&lt;/p&gt;  &lt;p&gt;그런 의미에서 제가 한 일 중에 기업의 모든 단위업무를 어떤 “고리” 를 이용하여, 업무들의 연속 흐름 즉 프로세스로 도출해 내는 Process Mining 도 여기에 해당합니다. &lt;/p&gt;  &lt;p&gt;많은 데이타가 있을 수록 더 좋은 결과를 낼 수 있다고 생각할 수 있지만, 원하는 결과에 실제로 필요 없는 대량의 쓰레기 데이터는 그냥 쓰레기일 뿐이죠.&lt;/p&gt;  &lt;p&gt;프로세스 시뮬레이터도 수 많은 Raw Data 를 생성하고, 이를 이용하여, 프로세스의 성능이나 적정 투입 리소스를 예측할 수 있습니다. 다만, 이 것도 목적에 따라, 기법에 따라 상당히 다른 결과를 산출합니다. 그걸 해석하고, 분석할 수 있는 능력이 중요하지요.&lt;/p&gt;  &lt;p&gt;요즘 이슈가 되는 빅데이터는 이러한 기존 분석 방법을 뛰어넘는 것은 아니라 봅니다. Data를 다루기 위한 기법이 달라지고, 연산을 더 빠르고 하기 위한 알고리즘 등의 개선은 있어야 겠지만…&lt;/p&gt;  &lt;p&gt;그리고, 요즘 빅데이터가 크기만을 뜻하는 게 아니라, 다양한 데이터 소스와 다양한 데이터 형식 (글, 이미지, 음성, 음악, 동영상 등) 를 뜻하기도 하니, 확실히 예전 DW 나 OLAP 하고는 다르지요.&lt;/p&gt;  &lt;p&gt;전통적으로 데이터 분석에 유명한 SAS의 본부장이 쓴 글을 보면, 경계와 함께 데이터 분석의 중요한 점이 무엇인지 생각해 보게 합니다.&lt;/p&gt;  &lt;p&gt;원문 : &lt;a href="http://www.bloter.net/archives/91583" target="_blank"&gt;빅데이터 분석, 자신감만으로 되나&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-3842041099786163693?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/3842041099786163693/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=3842041099786163693' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/3842041099786163693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/3842041099786163693'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2012/01/issue.html' title='요즘 Issue 가 되는 빅데이터 분석에 대한 생각'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-4971220172411245111</id><published>2012-01-10T14:01:00.001+09:00</published><updated>2012-01-10T14:57:36.341+09:00</updated><title type='text'>최근 읽은 글 중 마음에 꽂힌 글들…</title><content type='html'>&lt;br /&gt;2012년 새해가 밝았습니다^^ 모든 분들이 새해에도 건강하시고, 하시는 일 잘 되시길 바랍니다.   &lt;br /&gt;물론 저도 잘되기 위해서 불철주야(야는 모르겠네요^^) 노력하려고 합니다.&lt;br /&gt;자 그럼 제목에도 있듯이 요즘 제가 인터넷에서 읽은 글들 중 마음에 꽂힌 글 들을 링크 걸어봅니다.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.likejazz.com/archives/3046" target="_blank"&gt;혼란스러운 업무관리&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/jmeier/archive/2012/01/07/10-things-great-managers-do.aspx?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+jmeier+%28J.D.+Meier%27s+Blog%29&amp;amp;utm_content=FaceBook" target="_blank"&gt;10 Things Great Managers Do&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dev.paran.com/2012/01/04/how-to-design-a-good-api-and-why-it-matters/" target="_blank"&gt;좋은 API 디자인하기, 왜 그것이 중요한가?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.gorekun.com/1540" target="_blank"&gt;직관&lt;/a&gt; – ‘해봤다고’ 반드시 아는 것은 아니지만, ‘아예 안 해본 사람’은 죽었다 깨도 모르는 게 있다. 그게 그 분야에 대한 ‘직관’ 이다&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.allofsoftware.net/" target="_blank"&gt;내가 개발에 집중할 수 없는 이유&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://allofsoftware.net/entry/brainorparts" target="_blank"&gt;개발자는 회사의 부품일까 두뇌일까?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://allofsoftware.net/entry/%EC%95%84%EB%8A%94-%EA%B2%83%EA%B3%BC-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83" target="_blank"&gt;아는 것과 실행하는 것&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mickeykim.com/110" target="_blank"&gt;구글에서 일하면서 배우는 8가지 제품 전략&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wangsy.com/blog/2012/01/how-to-make-totally-shitty-things/" target="_blank"&gt;망하는 제품의 흔한 개발 과정&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://agile.egloos.com/5612585" target="_blank"&gt;달인이 되는 비결&lt;/a&gt;&amp;nbsp;(학력이 아닌 능력, 개선이라는 명제)&lt;/li&gt;&lt;/ul&gt;더 많은 글들이 있지만, 그래도 한번쯤은 곱씹어야 할 글들인 거 같아 기록해 봅니다.   &lt;br /&gt;저도 올해는 좋은 성과를 내기 위해 스마트하게 일해야겠습니다^^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-4971220172411245111?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/4971220172411245111/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=4971220172411245111' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4971220172411245111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4971220172411245111'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2012/01/blog-post.html' title='최근 읽은 글 중 마음에 꽂힌 글들…'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-6366690309942700635</id><published>2011-12-18T01:30:00.001+09:00</published><updated>2011-12-18T01:30:58.348+09:00</updated><title type='text'>Castle.Windsor 3.0 이 Release 되었습니다.</title><content type='html'>&lt;p&gt;RC1 이 나온지 얼마 되지 않아, 정식버전이 출시되었네요.    &lt;br /&gt;&lt;a href="http://docs.castleproject.org/Windsor.Whats-New-In-Windsor-3.ashx"&gt;http://docs.castleproject.org/Windsor.Whats-New-In-Windsor-3.ashx&lt;/a&gt; 를 참고하시면 도움이 됩니다.&lt;/p&gt;  &lt;p&gt;다만, FluentRegistration API 에서 몇 가지 제거된 API 가 있어, Upgrade 하는데, 좀 헷갈렸습니다. 그래도 Resharper 의 도움으로 유사한 메소드를 찾는데, 상당한 도움을 받아, 반나절만에 Upgrade를 마쳤습니다.&lt;/p&gt;  &lt;p&gt;언젠가 Castle.Windsor 3.0 Fluent Registration API 에 대해 정리해서 올리도록 하겠습니다.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-6366690309942700635?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/6366690309942700635/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=6366690309942700635' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6366690309942700635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6366690309942700635'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/12/castlewindsor-30-release.html' title='Castle.Windsor 3.0 이 Release 되었습니다.'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-4173501585243658242</id><published>2011-11-12T22:30:00.001+09:00</published><updated>2011-11-12T22:30:01.185+09:00</updated><title type='text'>Castle.Windsor 3 에서 Fluent Registration API 추가 기능</title><content type='html'>&lt;p&gt;이제 얼마 안 있으면 Castle.Windsor 3 가 정식으로 Release 됩니다. 아직까지는 2.5.4 버전을 쓰고 있습니다만, 제가 뭐 엄청 잘 쓰는 게 아니므로, 크게 불만은 없습니다.&lt;/p&gt;  &lt;p&gt;원문 : &lt;a href="http://docs.castleproject.org/Windsor.Whats-New-In-Windsor-3.ashx" target="_blank"&gt;What's new in Windsor 3&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;요번에 Fluent Registration API 를 공부하면서, 좀 아쉬웠던게, 코드상으로 작업하면서, 환경설정 정보와 연동될 수 있다면, 웹 Application 에서는 아주 유용하겠다 생각을 했는데, 우연히 Castle.Windsor 3 의 새로운 기능으로 추가가 되는 군요.&lt;/p&gt;  &lt;p&gt;Dependency class 라고 &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Container.Register(     &lt;br /&gt;&amp;#160;&amp;#160; Component.For&amp;lt;ClassWithArguments&amp;gt;()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .DependsOn(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dependency.OnAppSettingsValue(&amp;quot;arg1&amp;quot;),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dependency.OnAppSettingsValue(&amp;quot;arg2&amp;quot;, &amp;quot;number&amp;quot;))      &lt;br /&gt;);      &lt;br /&gt;&amp;#160; &lt;br /&gt;var instance = Container.Resolve&amp;lt;ClassWithArguments&amp;gt;();&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;라고, AppSettings 에 있는 정보를 Component의 속성 값으로 설정할 수 있는 기능이죠. 물론, 지금도 수동으로 만들 수 있지만, 기본으로 제공되면 더욱 좋다는 얘기입니다.&lt;/p&gt;  &lt;p&gt;또 한가지가 모든 IWindsorInstaller 를 모든 Assembly에서 찾아서 인스톨하는 기능입니다.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;container.Install(FromAssembly.InThisApplication())&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;보시다시피, 이 응용 프로그램과 참조하는 모든 어셈블리에 있는 모든 IWindsorInstaller 를 구현한 Installer 로부터 Install 을 수행하는 것입니다. 중복되는 것을 방지해주는 기능이 있으면 참 좋겠지만, 그건 Component 등록 시에 Unless 나 If 등 조건 등록을 사용하면 될 듯 하고, 관련된 Installer 찾아서 등록해주는 것도 일인데, 참 편리하죠.&lt;/p&gt;  &lt;p&gt;마지막으로 OnCreate는 있는데, 정리하는 OnDestroy가 없었는데, 이번에 지원되는 군요.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;container.Register(Component.For&amp;lt;MyClass&amp;gt;()     &lt;br /&gt;&amp;#160;&amp;#160; .LifestyleTransient()      &lt;br /&gt;&amp;#160;&amp;#160; .OnDestroy(myInstance =&amp;gt; myInstance.ByeBye())      &lt;br /&gt;);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;컴포넌트가 컨테이너로부터 해제될 때 발생합니다… 컴포넌트 자체에서 뭔가 할 일도 있을테고, Container 도 컴포넌트의 Lifecycle에 대한 이벤트를 제공하지만, 특정 컴포넌트에 대해, 외부에서 뭔가 지정할 수 있다는 점은 큰 장점이지요.&lt;/p&gt;  &lt;p&gt;다른 다양한 기능들이 추가되었지만, 위의 3가지 기능이 참 쓸만 한 것 같습니다.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-4173501585243658242?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/4173501585243658242/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=4173501585243658242' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4173501585243658242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4173501585243658242'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/11/castlewindsor-3-fluent-registration-api.html' title='Castle.Windsor 3 에서 Fluent Registration API 추가 기능'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-3620087127665425281</id><published>2011-11-03T17:50:00.001+09:00</published><updated>2011-11-03T17:50:01.601+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Castle.Windsor'/><title type='text'>Castle.Windsor Fluent Registration API 소감</title><content type='html'>&lt;p&gt;제목에 있듯이, 오늘 Castle.Windsor의 Fluent 방식의 Component 등록과 관련된 내용을 읽어보고, .NET 과 Silverlight 에 적용해 봤습니다.&lt;/p&gt;  &lt;p&gt;물론 잘 됩니다.^^&lt;/p&gt;  &lt;p&gt;그리고 제가 그 동안 사용하던 API 보다 훨씬 편한 방법도 많이 나왔고, Intercepter 등록한다던지, IWindsorInstaller를 이용하여 한방에 등록이 가능하다는 게 상당한 장점이 될 것 같습니다.&lt;/p&gt;  &lt;p&gt;문제는 이러한 방식이 Silverlight에서는 선택의 여지가 없지만, .NET 기반에서는 아직도 xml 기반 설정파일이 대세라는 점이고, 이 부분은 컴파일 없이도, 환경을 변경시켜, 컴포넌트의 구조를 변경시킬 수 있는 장점이 있습니다.   &lt;br /&gt;    &lt;br /&gt;기존 Xml&amp;#160; 방식과 Fluent 방식에 대해 비교해 보면…&lt;/p&gt;  &lt;h5&gt;기존 Xml 파일 방식&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;환경설정 파일의 일부분으로 text 파일로 표현하여, 수정 시 컴파일이 필요 없습니다.&lt;/li&gt;    &lt;li&gt;다른 IoC 라이브러리들도 비슷한 환경설정 파일을 제공합니다.&lt;/li&gt;    &lt;li&gt;새로운 API 를 배울 필요가 없습니다.^^&lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Fluent API 방식&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;API 방식이므로, 컴파일 시에 설정 중의 수형에 대한 부분의 검증은 이루어집니다. (xml 에서는 돌려봐야 알죠)&lt;/li&gt;    &lt;li&gt;한번에 많은 컴포넌트를 등록할 수 있습니다. (또한 Filterling 을 통해 선택적으로 등록할 수도 있습니다)&lt;/li&gt;    &lt;li&gt;Conditional Compile 을 통해 선택적으로 등록 코드를 실행할 수 있습니다. (.NET, Silverlight 별로 각각 다른 것을 등록)&lt;/li&gt;    &lt;li&gt;동적 등록이 가능&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;자, 이 글을 보시고, 각자 판단할 것이지만, &lt;a href="http://www.nhforge.org/" target="_blank"&gt;NHibernate&lt;/a&gt; 의 Hbm 과 &lt;a href="http://wiki.fluentnhibernate.org/" target="_blank"&gt;FluentNHibernate&lt;/a&gt; 의 Mapping API&amp;#160; 의 비교와 유사하다고 볼 수 있습니다. 그런 면에서 Fluent API 방식에 손을 들어주고 싶습니다.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;단 하나 마음에 걸리는 것이 컴파일을 다시 해야 한다는 점입니다.    &lt;br /&gt;뭐 이 부분은 Option 으로 처리할 수 있지 않을까 생각해봅니다.&lt;/p&gt;  &lt;p&gt;또 한가지 방식은 IWindsorInstaller 로 묶음으로 등록기를 만들고,&amp;#160; XML 환경설정 파일에서 &amp;lt;installer /&amp;gt; 를 이용하여, 등록하고, 변경하는 것입니다. 물론 이 방법도 Installer 를 어떻게 나누냐에 따라 말이 많아지겠죠.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-3620087127665425281?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/3620087127665425281/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=3620087127665425281' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/3620087127665425281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/3620087127665425281'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/11/castlewindsor-fluent-registration-api.html' title='Castle.Windsor Fluent Registration API 소감'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-5325766188996489892</id><published>2011-11-02T22:14:00.001+09:00</published><updated>2011-11-03T13:01:38.702+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Castle.Windsor'/><title type='text'>Castle.Windsor에서 Fluent Registration 사용하기</title><content type='html'>Castle.Windsor 하면, xml 형식의 configuration 파일만 주로 사용하는 제게 Fluent Registration API 는 아주 가끔… &lt;br /&gt;&lt;ol&gt;&lt;li&gt;특정 인터페이스의 모든 구현 클래스 등록하기&lt;/li&gt;&lt;li&gt;사용자 요청에 의해 동적으로 등록하기 (사용 빈도가 낮음)&lt;/li&gt;&lt;/ol&gt;을 사용하고 있었습니다. &lt;br /&gt;요즘 Silverlight 를 하는 관계로 Castle.Windsor 를 Silverlight 에 사용하기 위해 코드를 작성하는 중에 엥? Silverlight 가 System.Xml Namespace의 클래스들을 제공하지 않아, Castle.Windsor Configuration 중에 Xml로 표현한 것을 파싱하는 XmlInterpreter 를 지원하지 않는다는 것을 알았습니다. &lt;br /&gt;헐~ Silverllight 에서 System.Xml 을 지원하던가, Castle.Windsor에서 System.Xml.Linq 로 변경하던가 해야 할 듯 한데… .NET 2.0 을 생각한다면 System.Xml 을 버릴 수도 없고 참… Microsoft 사가 좀 더 호환성에 신경 썼더라면 하는 생각입니다… 생각 같아서는 #if SILVERLIGHT … #endif 로 구현할 수도 있겠지만, 글쎄요… 어떻게 할지…&lt;br /&gt;자 지금까지는 기존 사용하던 xml 형식의 Component 정의에 대한 얘기라면, 지금부터는 Fluent API 를 이용하여, 컴포넌트를 등록하는 방법에 대한 정보를 보겠습니다.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://docs.castleproject.org/Windsor.Fluent-Registration-API.ashx" target="_blank"&gt;Fluent Registration API&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.castleproject.org/Windsor.Registering-components-one-by-one.ashx" target="_blank"&gt;Registrering components one-by-one&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.castleproject.org/Windsor.Conditional-component-registration.ashx" target="_blank"&gt;Conditional component registration&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx" target="_blank"&gt;Registrering components by conventions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.castleproject.org/Windsor.Registering-Interceptors-ProxyOptions.ashx" target="_blank"&gt;Registering Interceptors and ProxyOptions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.castleproject.org/Windsor.Fluent-Registration-API-Extensions.ashx" target="_blank"&gt;Fluent Registration API Extensions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.castleproject.org/(S(v4henpagxwu5wo55v3bcrojx))/Windsor.Installers.ashx"&gt;Windsor Installers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.castleproject.org/(S(v4henpagxwu5wo55v3bcrojx))/Windsor.XML-Registration-Reference.ashx"&gt;XML configuration reference&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;Fluent API 로 Component 를 등록하는 방식은 아주 간단한 경우만 해봐서리, 저도 고급 방식에 대해서는 공부를 해야 했는데, 그 동안은 자로가 없어서 (핑계지만…) 못했었습니다… 이번에 Castle.Windsor 위키 사이트에 많은 내용이 올라와 있네요…&lt;br /&gt;Xml configuration 과 비교될 수 있으면 비교한 예를 추가해 줬다면, 쉽게 이해가 될 부분도 있을 텐데… &lt;br /&gt;&lt;br /&gt;결론은 Silverlight 에서는 Fluent Registration API 를 이용해라 입니다.^^ 앞으로는 .NET 에서도 죽~~    &lt;br /&gt;xml configuration 파일이 운영상에서는 장점이 더 많다고 생각하긴 하는데… 좀 더 생각해봐야 할 듯 하네요.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-5325766188996489892?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/5325766188996489892/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=5325766188996489892' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5325766188996489892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5325766188996489892'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/11/castlewindsor-fluent-registration.html' title='Castle.Windsor에서 Fluent Registration 사용하기'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-6004629417894530757</id><published>2011-11-01T13:52:00.001+09:00</published><updated>2011-11-01T13:52:48.506+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><title type='text'>HTML5 오픈 레퍼런스</title><content type='html'>&lt;p&gt;클리어보스 HTML5 그룹에서, 엄청난 노력을 들여, &lt;a href="http://html5ref.clearboth.org/" target="_blank"&gt;HTML5 오픈 레퍼런스&lt;/a&gt; 베타를 공개한다고 합니다.&amp;#160; &lt;br /&gt;새로운 개념과 기능이 왕창 들어간 HTML5 에 대해 맨땅에 헤딩하지 말고, 이 사이트보고, 많은 참고하시면 되겠습니다.&lt;/p&gt;  &lt;p&gt;저야 직접적인 관련이 없지만, 많은 분들에게 도움이 될 것 같아 소개드립니다.   &lt;br /&gt;그리고 앞으로도 많은 분들이 개발환경에 믿거름이 되는 일을 하셨으면 합니다… 근데 난 왜 못하지? 에구…     &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-6004629417894530757?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/6004629417894530757/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=6004629417894530757' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6004629417894530757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6004629417894530757'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/11/html5.html' title='HTML5 오픈 레퍼런스'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-1478110201811593880</id><published>2011-10-31T22:43:00.001+09:00</published><updated>2011-10-31T23:05:55.109+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='Castle.Windsor'/><title type='text'>Castle.Windsor 를 이용한 Decorator 패턴</title><content type='html'>Castle.Windsor 는 IoC/DI 라이브러리 중에 .NET 계열에서는 유명하고, 많이 사용하는 라이브러리 중에 한가지입니다. &lt;a href="http://www.nhforge.org/" target="_blank"&gt;NHibernate&lt;/a&gt; 초기에 &lt;a href="http://docs.castleproject.org/Tools.DynamicProxy.ashx" target="_blank"&gt;DynamicProxy&lt;/a&gt; 를 Castle.DynamicProxy 를 사용하여, 많이 유명해졌지요.     &lt;br /&gt;지금은 NHibernate도 독립적으로 ProxyFactory를 운용하고, Microsoft 사까지 Unity 라는 IoC/DI 라이브러리를 제공하고 있어, 어떤 것이 더 좋냐? 이런 건 무의미하고, 각자 자신에게 맞는 걸 사용하면 되겠습니다. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; line:18;"&gt;&lt;configuration&gt;&lt;br /&gt;&lt;br /&gt; &lt;components&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="DataServiceAdapter.Northwind" service="RCL.DataServices.Adapters.IDataServiceAdapter, RCL.DataServices" type="RCL.DataServices.Adapters.DataServiceAdapter, RCL.DataServices"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;dataservice&gt;${DataService.Northwind}&lt;/dataservice&gt;&lt;br /&gt;    &lt;requestserializer&gt;${RequestSerializer.Northwind}&lt;/requestserializer&gt;&lt;br /&gt;    &lt;responseserializer&gt;${ResponseSerializer.Northwind}&lt;/responseserializer&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="DataServiceAdapter.Pubs" service="RCL.DataServices.Adapters.IDataServiceAdapter, RCL.DataServices" type="RCL.DataServices.Adapters.DataServiceAdapter, RCL.DataServices"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;dataservice&gt;${DataService.Pubs}&lt;/dataservice&gt;&lt;br /&gt;    &lt;requestserializer&gt;${RequestSerializer.Pubs}&lt;/requestserializer&gt;&lt;br /&gt;    &lt;responseserializer&gt;${ResponseSerializer.Pubs}&lt;/responseserializer&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;component id="DataService.Northwind" service="RCL.DataServices.IDataService, RCL.DataServices" type="RCL.DataServices.AsyncDataServiceImpl, RCL.DataServices"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;adorepository&gt;${AdoRepository.Northwind}&lt;/adorepository&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="DataService.Pubs" service="RCL.DataServices.IDataService, RCL.DataServices" type="RCL.DataServices.AsyncDataServiceImpl, RCL.DataServices"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;adorepository&gt;${AdoRepository.Pubs}&lt;/adorepository&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;component id="RequestSerializer.Northwind" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.CompressSerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;serializer&gt;${JsonSerializer.Request}&lt;/serializer&gt;&lt;br /&gt;    &lt;compressor&gt;${Compressor.SharpBZip2}&lt;/compressor&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="ResponseSerializer.Northwind" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.CompressSerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;serializer&gt;${JsonSerializer.Response}&lt;/serializer&gt;&lt;br /&gt;    &lt;compressor&gt;${Compressor.SharpBZip2}&lt;/compressor&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="RequestSerializer.Pubs" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.EncryptSerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;serializer&gt;${RequestSerializer.Compress}&lt;/serializer&gt;&lt;br /&gt;    &lt;encryptor&gt;${Encryptor.Aria}&lt;/encryptor&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="ResponseSerializer.Pubs" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.EncryptSerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;serializer&gt;${ResponseSerializer.Compress}&lt;/serializer&gt;&lt;br /&gt;    &lt;encryptor&gt;${Encryptor.Aria}&lt;/encryptor&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="RequestSerializer.Compress" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.CompressSerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;serializer&gt;${BsonSerializer.Request}&lt;/serializer&gt;&lt;br /&gt;    &lt;compressor&gt;${Compressor.SevenZip}&lt;/compressor&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="ResponseSerializer.Compress" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.CompressSerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;   &lt;parameters&gt;&lt;br /&gt;    &lt;serializer&gt;${BsonSerializer.Response}&lt;/serializer&gt;&lt;br /&gt;    &lt;compressor&gt;${Compressor.SevenZip}&lt;/compressor&gt;&lt;br /&gt;   &lt;/parameters&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;component id="BinarySerializer.Request" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.BinarySerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="JsonSerializer.Request" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.RwJsonByteSerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="BsonSerializer.Request" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.RwBsonSerializer`1[[RCL.DataServices.Messages.RequestMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="BinarySerializer.Response" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.BinarySerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;component id="JsonSerializer.Response" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.RwJsonByteSerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt;  &lt;component id="BsonSerializer.Response" service="RCL.Core.ISerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core" type="RCL.Core.RwBsonSerializer`1[[RCL.DataServices.Messages.ResponseMessage, RCL.DataServices.Messages]], RCL.Core"&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;br /&gt; &lt;/components&gt;&lt;br /&gt; &lt;br /&gt;&lt;/configuration&gt;&lt;br /&gt;&lt;/pre&gt;위의 코드는 Castle.Windsor 를 이용하여, Dependency Injection을 좀 복잡하게 사용한 예입니다. 뭐 이렇게 할 필요가 있나 싶겠지만, 제품을 만들다 보면, Customizing을 해야 할 게 아니라, 위와 같이 Configuration을 변경하도록 하는 것이 제품 완성도를 높인다고 믿고 있는 터라 꼭 이런 방식을 사용합니다.&lt;br /&gt;&lt;br /&gt;아니 이런 Decorator 패턴에 대해 쓴다는 걸 서론만 쓰고, 그만 뒀네요... 코드 처리하는데 정신이 팔려서리... 쩝...&lt;br /&gt;자 그럼 코드를 좀 볼까요? 상위에 있는 놈들은 모두 Component의 속성이나 인자값으로 다른 Component 를 주입하는 Dependency Injection이라 합니다.&lt;br /&gt;&lt;br /&gt;자 여기서 Decorator 패턴을 사용한 예는?&lt;br /&gt;Component 중에 "RequestSerializer.Pubs" 를 보십시요. 이 놈은 Serializer 로 "RequestSerializer.Compress" 를 Wrapping 하여 ARIA 암호화를 수행하는 Decorator 입니다.&lt;br /&gt;"RequestSerializer.Compress" 는 "BsonSerializer.Request" 를 Wrapping 하고, SevenZip 알고리즘으로 압축을 수행합니다.&lt;br /&gt;자 이제 정리하면 BSON-&amp;gt;Compress-&amp;gt;암호화 로 래핑되도록 되었습니다. 물론 순서는 바꿀 수 있고, Decorator를 더 추가할 수도 있습니다.&lt;br /&gt;&lt;br /&gt;이렇게 환경설정에서 IoC/DI 기능 중에 Decorator 패턴을 활용하게 되면, 상당히 복잡한 구성도 쉽게 구성할 수 있고, 다양한 조합의 Component를 제공할 수 있습니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-1478110201811593880?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/1478110201811593880/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=1478110201811593880' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/1478110201811593880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/1478110201811593880'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/castlewindsor-decorator.html' title='Castle.Windsor 를 이용한 Decorator 패턴'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-1415511459065730172</id><published>2011-10-30T20:05:00.001+09:00</published><updated>2011-10-30T20:05:25.001+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight 와 서버와의 객체 통신에서 압축 방식의 장점</title><content type='html'>&lt;p&gt;통신 시 어떤 경우가 되었건, 같은 정보가 전달될 때에는 작은 양이 작은 횟수로 전달 되는 것이 가장 바람직합니다. 그래야 통신 비용이 절감되고, 통신에 따른 지연을 막을 수도 있습니다.   &lt;br /&gt;    &lt;br /&gt;요즘 한창 Silverlight와 서버와의 통신 방식에 대해 개발하고 있습니다만, .NET이나 Microsoft 에서 제공하는 기본 방식의 경우는 브라우저와 같은 방식으로 Data 를 Client 로 다운로드 할 때에만, 옵션으로 압축을 제공합니다. 물론 WCF 에서 압축 모듈을 서로 사용하면 가능합니다만, 그게 바로 족쇄가 될 가능성이 있어, 자체적으로 일반적으로 많이 사용하는 Data 압축 방식을 이용한 통신을 수행하도록 해 봤습니다.    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-eWXsqezSgzo/Tq0vcIDbCpI/AAAAAAAAAfo/PkVB1-Rwv0Y/s1600-h/image%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-ZBIUf9KmRDw/Tq0vc8FN5oI/AAAAAAAAAfw/6tsGa0ubCn0/image_thumb%25255B2%25255D.png?imgmax=800" width="528" height="264" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;JSON 방식으로 객체를 Serialize 하고, 압축을 수행하였더니, 4MB 정보인 것이 246K 정도로 확 줄었습니다. 원본에 비해 5.67% 로 크기가 준 것이지요. 이렇게 되면 통신 속도가 엄청 좋아지겠죠?&lt;/p&gt;  &lt;p&gt;BZip22 알고리즘을 사용하였으므로, GZip 보다는 압축률이 좋을 것입니다. LZMA 알고리즘의 경우는 더 좋을 수도 있지만, 수시로 압축/복원을 수행하는 통신 모듈에는 적당하지 않는 것 같습니다. 일반적으로 가장 적당한 방식은 GZip 이 되겠습니다.   &lt;br /&gt;    &lt;br /&gt;이제 서버 단에서 압축을 풀고, 작업하고, 결과를 압축하여 반환하는 모듈을 제작하면, 통신 라이브러리가 완성됩니다.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-1415511459065730172?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/1415511459065730172/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=1415511459065730172' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/1415511459065730172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/1415511459065730172'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/silverlight_30.html' title='Silverlight 와 서버와의 객체 통신에서 압축 방식의 장점'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-ZBIUf9KmRDw/Tq0vc8FN5oI/AAAAAAAAAfw/6tsGa0ubCn0/s72-c/image_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-2605298126748459634</id><published>2011-10-25T22:52:00.001+09:00</published><updated>2011-10-25T22:52:21.009+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>왜 Silverlight 에는 압축관련 모듈이 없을까요?</title><content type='html'>&lt;p&gt;Microsoft 관계자 분 중에 혹시 아시는 분 계신가요? Microsoft 사가 웹 통신시 압축이 유용하다는 것은 모를 리가 없을 텐데요… 그쵸?&lt;/p&gt;  &lt;p&gt;어쩔 수 없이 찾다보니 다행히 &lt;a href="http://slsharpziplib.codeplex.com/" target="_blank"&gt;Silverlight SharpZipLib&lt;/a&gt; 이 있군요.&amp;#160; 이 라이브러리는 .NET 용으로 이미 유명한 &lt;a href="http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx" target="_blank"&gt;#ZipLib&lt;/a&gt; 의 Silverlight 버전이라 할 수 있습니다.    &lt;br /&gt;이 놈이 있어서 다행이지, 기본적으로는 Silverlight에서 압축 관련 기능을 제공하지 않는 건가요?    &lt;br /&gt;    &lt;br /&gt;이게 단순 통신만의 문제가 아니라, Silverlight 자체적으로 Isolated File Storage 에 뭔가를 저장할 때 압축해서 저장하고 싶을 때, 기본 Framework에서 제공해준다면, 상당히 편리한 기능인데, 아쉽군요…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bloggingabout.net/blogs/ramon/archive/2008/11/06/wcf-and-http-gzip-deflate-compression-and-silverlight.aspx" target="_blank"&gt;Silverlight와 WCF 통신 시 압축 이용&lt;/a&gt; 글을 보면, 이건 뭐 그냥 WebClient 사용하라는 얘기고… 이거 말고… 개발자가 특정 암호화를 부가한다던가, 여러 가지 조작을 할 수 있도록 Class 로 제공해 줄 수는 없나요?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stackoverflow.com/questions/10006/what-is-the-easiest-way-to-add-compression-to-wcf-in-silverlight" target="_blank"&gt;Silverlight와 통신용 WCF에 압축 기능 넣기&lt;/a&gt; 에도 결국 서버 쪽 IHttpHandler 나 Web Services, WCF 등에서 자체적으로 Data 를 압축해서 보내는 것인데… 그걸 Silverlight에서 어떻게 압축을 풀어서 사용하지요? &lt;/p&gt;  &lt;p&gt;대부분의 글이 Silverlight 와 WCF 와의 통신 시에 WS-Compression 을 이용하던가, WebCliient 에서 HttpHeader에 Accept-Encoding=gzip, deflate 를 넣어서 데이터를 받으라고 되어있는데, 문제는 대용량 데이타를 Upload 할 때입니다…   &lt;br /&gt;이 때는 어쩔 수 없이 일반 데이타를 보내야 한다는 소리 아닌가요?     &lt;br /&gt;    &lt;br /&gt;어떻게 외부 통신 시 WCF 를 사용하게 되면, 압축 및 암호화가 가능하다 하더라도, 로컬 저장소에 저장하기 위해서는 필히 압축 기능이 기본으로 제공되었으면 합니다.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-2605298126748459634?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/2605298126748459634/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=2605298126748459634' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/2605298126748459634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/2605298126748459634'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/silverlight.html' title='왜 Silverlight 에는 압축관련 모듈이 없을까요?'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-4328950055913824697</id><published>2011-10-25T16:22:00.001+09:00</published><updated>2011-10-25T16:22:20.341+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight Data 통신 시의 암호화</title><content type='html'>&lt;p&gt;Silverlight 등 Client 모듈과의 통신 시에 고려해야 할 사항을 살펴보면,&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;통신 프로토콜 및 포맷을 결정해야 합니다.&lt;/strong&gt;       &lt;br /&gt;HTTP 통신이 대세므로 논외로 하고, 포맷은 XML, JSON, Byte Array 등을 결정해야 합니다.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;그 다음으로 &lt;strong&gt;서버 쪽 통신 Daemon&lt;/strong&gt; 을 IHttpHandler, Web Services, WCF 등을 선택해야 합니다.&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;WCF 의 경우는 Binding 방식, Protocol 등의 설정 방법이 무지 많으므로, 더 많은 확장성이 있습니다.&lt;/li&gt;      &lt;li&gt;Data 처리 방식으로 동기/비동기 방식을 결정해야 합니다.       &lt;br /&gt;&lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;&lt;strong&gt;압축을 지원할 것인가? 한다면, 어떤 압축 알고리즘을 지원할 것인가?&lt;/strong&gt;&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;GZip (NET 기본)&lt;/li&gt;      &lt;li&gt;Deflate (NET 기본)&lt;/li&gt;      &lt;li&gt;ISharpCode.SharpZipLib.dll 에 있는 GZip, BZip2 알고리즘&lt;/li&gt;      &lt;li&gt;7Zip 알고리즘       &lt;br /&gt;&lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;&lt;strong&gt;암호화를 지원할 것인가? 어떤 암호 알고리즘을 지원할 것인가?&lt;/strong&gt;&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;.NET에는 대칭형 알고리즘 중에 상당히 많은 알고리즘을 제공합니다. DES, RC2, TripleDES, Rijndael 등&lt;/li&gt;      &lt;li&gt;Silverlight 에서 제공하는 대칭형 알고리즘은 AES 클래스로 대응되는 것 달랑 한 개? &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p&gt;자 이제 실버라이트의 통신 관련 결정 사항이 많다는 것을 아실 것입니다.    &lt;br /&gt;뭐 닥치고, OData 나 Microsoft 의 Dynamic Data 등 DataContext 사용 방식이 있겠습니다만, 내부적으로는 HTTP 웹서비스에 JSON 포맷의 데이터 전송 방식이라 하겠습니다.&lt;/p&gt;  &lt;p&gt;오늘은 위의 여러 가지 결정사항 중 가장 늦게 결정해도 되는 (SSL 이 있으니, 안 해도 됩니다!!! 라고 주장하시면 할 말 없습니다.) 암호화 관련 사항에 대해 짚어보겠습니다.&lt;/p&gt;  &lt;p&gt;위에서 보셨듯이 .NET Framework 2.0 이상부터 상당히 다양한 암호 알고리즘을 제공하고, 양방향 통신 시에 가장 많이 쓰이는 대칭형 알고리즘은 AES 기반으로 발전된 많은 알고리즘을 제공합니다. 근데 왜!!! 실버라이트에서는 AesManaged 라는 클래스 달랑 하나만 지원하냐구요? Rijndael 은 내부에 숨어서 사용도 못하고 (물론 사용하려면 하겠지만)&lt;/p&gt;  &lt;p&gt;그래서 암호화 지원을 할 수 있는 방법은 .NET에서 제공하지 않지만, 한국에서는 꼭 써야 할 &lt;a href="http://seed.kisa.or.kr/kor/aria/aria.jsp" target="_blank"&gt;ARIA 알고리즘&lt;/a&gt;을 적용하기로 했습니다.    &lt;br /&gt;뭐 결론이 이미 있는데, 뭐하러 다른 걸 시도하지? 라고 하실지 모르지만, 누가 알겠습니까… 제가 만든 제품이 외국에도 팔리고, 암호화 알고리즘을 미국 규격인 AES 를 따라야 한다라고 한다면… ㅋㅋ&lt;/p&gt;  &lt;p&gt;어쨌든 &lt;a href="http://seed.kisa.or.kr/kor/aria/aria.jsp" target="_blank"&gt;ARIA 알고리즘&lt;/a&gt;을 이용하여, 제품에 적용하기 위해, 사전에 단위 테스트를 수행해 봤습니다.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-v_Si5eEz2qQ/TqZjnpmAazI/AAAAAAAAAfE/_uXWvnGs9UM/s1600-h/AriaEncryptor_for_Silverlight%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="AriaEncryptor_for_Silverlight" border="0" alt="AriaEncryptor_for_Silverlight" src="http://lh3.ggpht.com/-qTXGB862c5o/TqZjovrueKI/AAAAAAAAAfM/_bBB9guwGCw/AriaEncryptor_for_Silverlight_thumb%25255B2%25255D.png?imgmax=800" width="555" height="515" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/-s2Bz6fYOp7E/TqZjpbReNII/AAAAAAAAAfU/3hYyQvp1kHo/s1600-h/AriaEncryptor_for_Silverlight_Log%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="AriaEncryptor_for_Silverlight_Log" border="0" alt="AriaEncryptor_for_Silverlight_Log" src="http://lh5.ggpht.com/-UTCyo7-V4-w/TqZjqfatraI/AAAAAAAAAfc/2uz8yGqaH_4/AriaEncryptor_for_Silverlight_Log_thumb%25255B2%25255D.png?imgmax=800" width="549" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;제대로 Silverlight 에서도 암호화 및 복호화가 제대로 되는군요^^. 이제 Silverlight 와의 통신 시에는 ARAI 알고리즘 을 이용한 데이타 암호화를 기본으로 사용하려고 합니다.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;더 좋은&amp;#160; 방안이 있는 분께서는 의견 주시기 바랍니다.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-4328950055913824697?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/4328950055913824697/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=4328950055913824697' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4328950055913824697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4328950055913824697'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/silverlight-data.html' title='Silverlight Data 통신 시의 암호화'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-qTXGB862c5o/TqZjovrueKI/AAAAAAAAAfM/_bBB9guwGCw/s72-c/AriaEncryptor_for_Silverlight_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-5732593099085621698</id><published>2011-10-25T00:30:00.001+09:00</published><updated>2011-10-25T00:30:34.979+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>NHibernate 학습 및 개발 속도 높이기</title><content type='html'>&lt;p&gt;저도 처음 &lt;a href="http://www.nhforge.org/" target="_blank"&gt;NHibernate&lt;/a&gt;를 접했을 때, HBM 작성하는데, 상당히 많은 시간을 투자해야 했고, 많은 시행착오를 겪었습니다. 특히, &lt;a href="http://www.nhforge.org/" target="_blank"&gt;NHibernate&lt;/a&gt; 공식 자료에도, Class – HBM – Table 이런 식의 전체 정보가 존재하지 않아 애를 많이 먹었죠.    &lt;br /&gt;    &lt;br /&gt;그래서 시작한 것이, NHibernate 소스의 테스트 코드를 보기 시작했습니다. 물론 실행도 해보고요. 이 때 제가 “뭔가 잘못하고 있구나” 를 깨닳았습니다. 테스트 코드를 보면, DB는 미리 만들어야 하지만, hbm2ddl 을 이용하여, DB Schema 생성용 script가 생성되고, 이를 DB에 실제 적용해서, 테스트를 위한 테이블을 모두 만든 후 테스트를 수행하더군요.    &lt;br /&gt;    &lt;br /&gt;이 것을 알기 전에는 매핑 정보 하나 바꿀 때마다 DB도 바꾸고, 클래스도 바꾸고, 참 무식한 짓을 했습니다.    &lt;br /&gt;이제는 아예, NHibernate 테스트 프로젝트를 뜯어보다가, 하나의 DB에 대해서 테스트용 Schema 를 생성하는 것이 아니라, 설정에 따라, 다양한 DB에 대해서 테스트 할 수 있는 테스트용 Framework을 갖추게 되었습니다.    &lt;br /&gt;    &lt;br /&gt;이 후 제게는 큰 변화가 일어났습니다. 그 동안 시도할 생각조차 못해왔던 복잡한 매핑이나, 개념이 잡히지 않던 매핑 속성 값에 대해, 여러 개의 매핑을 제작하여, 상호 비교할 수 있는 그런 체계가 제게 주어진 것이죠.     &lt;br /&gt;    &lt;br /&gt;이렇게 되니, NHibernate에 대한 학습속도가 가파르게 오르더군요. 더군다나, &lt;a href="http://www.nhforge.org/doc/nh/en/index.html#mapping-types-custom" target="_blank"&gt;IUserType&lt;/a&gt;, Interceptor, DynamicProxy, Listener, 2nd Cache Provider 등을 직접 제작하고, 테스트 하면서, 내부 구조를 빠르게 이해할 수 있게 되어, 이제는 왠만한 경우에는 자체 해결할 정도가 되었습니다.    &lt;br /&gt;    &lt;br /&gt;그럼, 이제 막 &lt;a href="http://www.nhforge.org/" target="_blank"&gt;NHibernate&lt;/a&gt; 를 시작하거나, 너무 힘들어서 포기하신 분들이라면, 다음과 같이 해보시기 바랍니다.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;NHibernate Test 프로젝트의 테스트 구조 파악 및 DB 생성 (hbm2ddl 활용) 방법을 파악&lt;/li&gt;    &lt;li&gt;위의 테스트 방식으로 자신만의 Test Framework을 만들 것&lt;/li&gt;    &lt;li&gt;다양한 매핑 방식에 대해 테스트 해 볼 것.&lt;/li&gt;    &lt;li&gt;가능하면, &lt;a href="http://wiki.fluentnhibernate.org/" target="_blank"&gt;FluentNHibernate&lt;/a&gt;의 &lt;a href="http://wiki.fluentnhibernate.org/Persistence_specification_testing" target="_blank"&gt;PersistenceSpecification&lt;/a&gt; 을 활용할 것 (Fluent 방식의 매핑이 아니더라도 가능)&lt;/li&gt;    &lt;li&gt;DDD (Domain Driven Develoment), ORM 관련 지식을 쌓을 것&lt;/li&gt;    &lt;li&gt;Proxy에 대한 개념을 잡을 것 ( &lt;a href="http://docs.castleproject.org/" target="_blank"&gt;CastleProject&lt;/a&gt; 의 &lt;a href="http://docs.castleproject.org/Tools.DynamicProxy.ashx" target="_blank"&gt;DynamicProxy&lt;/a&gt; 추천) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;결론적으로 자신만의 Test Framework을 만들지 않고, &lt;a href="http://www.nhforge.org/" target="_blank"&gt;NHibernate&lt;/a&gt; 를 습득하기는 상당히 힘듭니다.    &lt;br /&gt;남이 만든 것을 약간 고쳐서 사용해도 무방할 것입니다. 이런 예는 구글링으로 찾아보시면 될 듯 합니다.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-5732593099085621698?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/5732593099085621698/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=5732593099085621698' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5732593099085621698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5732593099085621698'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/nhibernate.html' title='NHibernate 학습 및 개발 속도 높이기'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-691536188662299678</id><published>2011-10-21T22:29:00.001+09:00</published><updated>2011-10-21T22:29:21.841+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop'/><title type='text'>Hadoop 관련 정보</title><content type='html'>&lt;p&gt;제가 Windows 계열에서 개발하는 관계로, Java 보다는 .NET 으로 개발이 되면 좋겠는데, &lt;a href="http://hadoop.apache.org/" target="_blank"&gt;Hadoop&lt;/a&gt; 은 그런 자료가 드물군요…    &lt;br /&gt;Hadoop 관련 설치 운용 관련 글들을 좀 모아봤습니다. 나중에 참고해서 꼭 적용해 봐야겠습니다.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://alans.se/blog/2010/hadoop-hbase-cygwin-windows-7-x64/" target="_blank"&gt;Hadoop + HBase + Cygwin + Windows 7 x64&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://stackoverflow.com/questions/467911/hadoop-on-windows-server" target="_blank"&gt;Stackoverflow - Hadoop on Windows Server&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://code.google.com/p/hadoop-sharp/" target="_blank"&gt;Hadoop-sharp&lt;/a&gt; (.NET에서 Hadoop 개발하기)&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ebiquity.umbc.edu/Tutorials/Hadoop/00%20-%20Intro.html" target="_blank"&gt;Hadoop on Windows with Eclipse&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;등이 있네요^^ 언젠가는 참고해서 적용해 볼 날이 올려나?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-691536188662299678?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/691536188662299678/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=691536188662299678' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/691536188662299678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/691536188662299678'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/hadoop.html' title='Hadoop 관련 정보'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-1505168826109418300</id><published>2011-10-21T22:14:00.001+09:00</published><updated>2011-10-21T22:14:45.127+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop'/><title type='text'>Microsoft SQL Server 와 Apache Hadoop 의 결합</title><content type='html'>&lt;p&gt;Microsoft SQL Server 2012 (Code name ‘Denali’) 에서는 BI 와 Big Data에 중점을 뒀다고 하네요. 흠 당연히 BI 하려면 Big Data를 처리해야 하니 &lt;a href="http://hadoop.apache.org/" target="_blank"&gt;Hadoop&lt;/a&gt; 같은 대용량 처리가 가능한 기능이 있어야겠지요. 근데, 왜 자체적으로 안 만들고,&amp;#160; &lt;a href="http://hadoop.apache.org/" target="_blank"&gt;Hadoop&lt;/a&gt; 인지 좀 의아스럽긴 합니다.&lt;/p&gt;  &lt;p&gt;여기에 더해서 &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=27584" target="_blank"&gt;Apache Hadoop Connector for SQL Server 2008 R2&lt;/a&gt; 도 출시되었네요.    &lt;br /&gt;또 Azure 기반의 Hadoop 서비스도 2011년 말에 제공한다고 하니, Hadoop 은 이제 대용량 데이타 처리 저장소로서 여러 군데서 인정을 받는 수준에 이르렀군요. &lt;/p&gt;  &lt;p&gt;더 자세한 정보는 &lt;a href="http://www.infoq.com/news/2011/10/SQL-Server-2012;jsessionid=D06857BE95F7BC383EDBD226D1875D13" target="_blank"&gt;‘Denali’ No More: SQL Server 2012 announced, Focuses on BI and Big Data&lt;/a&gt; 를 참고하세요.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-1505168826109418300?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/1505168826109418300/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=1505168826109418300' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/1505168826109418300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/1505168826109418300'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/microsoft-sql-server-apache-hadoop.html' title='Microsoft SQL Server 와 Apache Hadoop 의 결합'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-3292464301461778297</id><published>2011-10-21T11:48:00.001+09:00</published><updated>2011-10-24T12:47:07.212+09:00</updated><title type='text'>Microsoft Roslyn CTP 소개</title><content type='html'>마이크로소프트에서, 드디어 C# Script 엔진을 내놓았네요. 정식명칭은 아직 정해지지 않았고, 코드명이 &lt;a href="http://msdn.microsoft.com/ko-kr/roslyn" target="_blank"&gt;Roslyn&lt;/a&gt; 입니다.     &lt;br /&gt;&lt;br /&gt;“The Roslyn CTP previews the next generation of language object models for code generation, analysis, and refactoring, and the upcoming support for scripting and interactive use of VB and C#.”     &lt;br /&gt;&lt;br /&gt;이라고 하네요^^    &lt;br /&gt;&lt;br /&gt;즉 C# 이나 VB의 컴파일러 코드를 공개해서, 사용자가 직접 사용할 수 있도록 했다 뭐 이건데… 간단하게 말해서 걍 Python Script 랑 비슷하다고 생각하시면 되겠습니다. (이러면 Roslyn 개발자들이 섭섭하려나?)    &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-FkBfztR1ZDY/TqDdfzOU1uI/AAAAAAAAAew/Kd0Xea006Fg/s1600-h/Roslyn2%25255B5%25255D.jpg"&gt;&lt;img alt="Roslyn2" border="0" height="365" src="http://lh4.ggpht.com/-S0gZFGpJ7n8/TqDdhgxdacI/AAAAAAAAAe4/HZgKM1mODzw/Roslyn2_thumb%25255B3%25255D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Roslyn2" width="443" /&gt;&lt;/a&gt;&lt;br /&gt;저도 아직 분석 단계라 더 이상 자세한 설명은 힘들구요. 그래도 언제가는 나오겠지 하던 그런 기능들이 모두 포함되어서 나왔으면 합니다. 아마 그렇게 해야 Microsoft 사에서 Cloud 컴퓨팅의 &lt;a href="http://ko.wikipedia.org/wiki/PaaS" target="_blank"&gt;PaaS&lt;/a&gt; 를 적용할 수 있을 것이라 생각됩니다.    &lt;br /&gt;&lt;br /&gt;구글에서는 현재 Python으로 PaaS 를 제공하는데, MS는 자신들의 언어로 제공해야 체면이 서겠죠?&lt;br /&gt;&lt;br /&gt;참고:&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/hh500769?utm_medium=Twitter&amp;amp;utm_source=Shared"&gt;Roslyn Project Overview&lt;/a&gt;&lt;br /&gt;참고:&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx"&gt;Introducing the Microsoft "Roslyn" CTP&lt;/a&gt;&lt;br /&gt;참고: &lt;a href="http://www.infoworld.com/d/application-development/microsoft-previews-compiler-service-software-173207"&gt;Microsoft previews compiler-as-a-service software&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-3292464301461778297?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/3292464301461778297/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=3292464301461778297' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/3292464301461778297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/3292464301461778297'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/microsoft-roslyn-ctp.html' title='Microsoft Roslyn CTP 소개'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-S0gZFGpJ7n8/TqDdhgxdacI/AAAAAAAAAe4/HZgKM1mODzw/s72-c/Roslyn2_thumb%25255B3%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-1070672831861280789</id><published>2011-10-16T15:23:00.001+09:00</published><updated>2011-10-16T15:23:24.342+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='FluentNHibernate'/><title type='text'>FluentNHibernate 을 이용한 IUserType 매핑</title><content type='html'>&lt;p&gt;NHibernate의 기능 중에 가장 큰 장점 중에 하나가 &lt;a href="http://www.nhforge.org/doc/nh/en/index.html#mapping-types-custom" target="_blank"&gt;IUserType&lt;/a&gt;, ICompositeUserType 을 이용하여, RDBMS 저장소의 컬럼과 속성을 1:1 매핑이라던지, Component 로 직접 매핑이 아닌, 무언가 2차적인 처리를 수행할 수 있는 장치를 두었다는 것입니다.&lt;/p&gt;  &lt;p&gt;제가 가장 많이 쓰는 &lt;a href="http://www.nhforge.org/doc/nh/en/index.html#mapping-types-custom" target="_blank"&gt;IUserType&lt;/a&gt;은 &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;암호화, 압축 등을 수행하여 저장소에 저장하고, 로드 시에는 원본 데이터로 복원하여 제공해 주고, WHERE 절도 자동으로 되는 그런 방식 &lt;/li&gt;    &lt;li&gt;여러 속성을 가지는 class 나 struct 를 하나의 Property 처럼 사용할 수 있도록 해주는 ICompositeUserType 을 이용하는 것읍니다. 에를 들면, 주차 (WeekOfYear)는 Year 와 WeekOfYear 두 값이 같이 저장되어야 하는데, 따로 작업하면 안되므려 YearAndWeek 라는 struct 로 정의하여 사용하고, 기간을 나타내는 TimeRange 같은 경우에는 StartTime, EndTime 을 항상 같이 가지고 다녀야 하기 때문에, Component 로 표현하기 보다 ICompositeUserType으로 표현하면 훨씬 좋습니다. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;자 그럼 IUserType 으로 NHiberante용 사용자 정의 수형을 만드는 것은 &lt;a href="http://debop.egloos.com/4094515" target="_blank"&gt;여기&lt;/a&gt; 설명을 참고하는 것으로 하고, 이런 사용자 수형을 &lt;a href="http://wiki.fluentnhibernate.org/" target="_blank"&gt;FluentNHibernate&lt;/a&gt; 으로 매핑하는 방법에 대해 설명 드리겠습니다. &lt;/p&gt;  &lt;p&gt;우선 사용자 정의 수형을 가지는 엔티티 정의를 보시면,&lt;/p&gt;  &lt;pre class="code"&gt;[&lt;span style="color: #00008b"&gt;Serializable&lt;/span&gt;]&lt;br /&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #00008b"&gt;FUserTypeEntity &lt;/span&gt;: &lt;span style="color: #00008b"&gt;DataEntityBase&lt;/span&gt;&amp;lt;&lt;span style="color: #00008b"&gt;Int32&lt;/span&gt;&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual string &lt;/span&gt;&lt;span style="color: purple"&gt;Name &lt;/span&gt;{ &lt;span style="color: #005e5e"&gt;get&lt;/span&gt;; &lt;span style="color: #005e5e"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual string &lt;/span&gt;&lt;span style="color: purple"&gt;Password &lt;/span&gt;{ &lt;span style="color: #005e5e"&gt;get&lt;/span&gt;; &lt;span style="color: #005e5e"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual string &lt;/span&gt;&lt;span style="color: purple"&gt;Password2 &lt;/span&gt;{ &lt;span style="color: #005e5e"&gt;get&lt;/span&gt;; &lt;span style="color: #005e5e"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual string &lt;/span&gt;&lt;span style="color: purple"&gt;CompressedString &lt;/span&gt;{ &lt;span style="color: #005e5e"&gt;get&lt;/span&gt;; &lt;span style="color: #005e5e"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual byte&lt;/span&gt;[] &lt;span style="color: purple"&gt;CompressedBlob &lt;/span&gt;{ &lt;span style="color: #005e5e"&gt;get&lt;/span&gt;; &lt;span style="color: #005e5e"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #00008b"&gt;TimeRange &lt;/span&gt;&lt;span style="color: purple"&gt;_activePeriod&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual &lt;/span&gt;&lt;span style="color: #00008b"&gt;TimeRange &lt;/span&gt;&lt;span style="color: purple"&gt;ActivePeriod&lt;br /&gt;    &lt;/span&gt;{&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: purple"&gt;_activePeriod &lt;/span&gt;?? (&lt;span style="color: purple"&gt;_activePeriod &lt;/span&gt;= &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #00008b"&gt;TimeRange&lt;/span&gt;()); }&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;set &lt;/span&gt;{ &lt;span style="color: purple"&gt;_activePeriod &lt;/span&gt;= &lt;span style="color: blue"&gt;value&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual &lt;/span&gt;&lt;span style="color: #00008b"&gt;YearAndWeek &lt;/span&gt;&lt;span style="color: purple"&gt;ActiveYearWeek &lt;/span&gt;{ &lt;span style="color: #005e5e"&gt;get&lt;/span&gt;; &lt;span style="color: #005e5e"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual &lt;/span&gt;&lt;span style="color: #00008b"&gt;Type &lt;/span&gt;&lt;span style="color: purple"&gt;LanguageType &lt;/span&gt;{ &lt;span style="color: #005e5e"&gt;get&lt;/span&gt;; &lt;span style="color: #005e5e"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public virtual &lt;/span&gt;&lt;span style="color: #00008b"&gt;DateTime&lt;/span&gt;? &lt;span style="color: purple"&gt;UpdateTimestamp &lt;/span&gt;{ &lt;span style="color: #005e5e"&gt;get&lt;/span&gt;; &lt;span style="color: #005e5e"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public override int &lt;/span&gt;&lt;span style="color: #005e5e"&gt;GetHashCode&lt;/span&gt;()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;if&lt;/span&gt;(&lt;span style="color: purple"&gt;IsSaved&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: blue"&gt;return base&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;GetHashCode&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #00008b"&gt;HashTool&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;Compute&lt;/span&gt;(&lt;span style="color: purple"&gt;Name&lt;/span&gt;, &lt;span style="color: purple"&gt;Password&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;과 같습니다. 보시면, &lt;span style="color: purple"&gt;CompressedString, CompressedBlob&lt;/span&gt;는 IUserType 을 구현한 문자열이나 byte[] 을 압축하여 문자열로 저장하는 UserType 으로 매핑됩니다. 다음으로&amp;#160;&amp;#160; &lt;span style="color: purple"&gt;ActivePeriod &lt;/span&gt;나&amp;#160;&amp;#160; &lt;span style="color: purple"&gt;ActiveYearWeek &lt;/span&gt;는 ICompositeUserType 을 구현했습니다. ActivePeriod는 StartTime, EndTime 이라는 속성을 가지고 있는 class 이고, YearAndWeek 는 Year 와 WeekOfYear 값을 가지는 struct 입니다.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;이제 Fluent 방식으로 FUserTypeEntity 를 매핑을 하면, 다음과 같습니다.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #00008b"&gt;FUserTypeEntityMapping &lt;/span&gt;: &lt;span style="color: #00008b"&gt;ClassMap&lt;/span&gt;&amp;lt;&lt;span style="color: #00008b"&gt;FUserTypeEntity&lt;/span&gt;&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #00008b"&gt;FUserTypeEntityMapping&lt;/span&gt;()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Table&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;FUserTypeEntity&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;DynamicInsert&lt;/span&gt;();&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;DynamicUpdate&lt;/span&gt;();&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;LazyLoad&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Id&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;Id&lt;/span&gt;).&lt;span style="color: purple"&gt;GeneratedBy&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;Native&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Map&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;Name&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Map&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;Password&lt;/span&gt;)&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;CustomType&lt;/span&gt;&amp;lt;&lt;span style="color: #00008b"&gt;RijndaelEncryptStringUserType&lt;/span&gt;&amp;gt;()&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;Length&lt;/span&gt;(&lt;span style="color: #00008b"&gt;MappingContext&lt;/span&gt;.&lt;span style="color: purple"&gt;MAX_ANSI_STRING_LENGTH_SQL_SERVER&lt;/span&gt;);&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Map&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;Password2&lt;/span&gt;)&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;CustomType&lt;/span&gt;&amp;lt;&lt;span style="color: #00008b"&gt;AriaEncryptStringUserType&lt;/span&gt;&amp;gt;()&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;Length&lt;/span&gt;(&lt;span style="color: #00008b"&gt;MappingContext&lt;/span&gt;.&lt;span style="color: purple"&gt;MAX_ANSI_STRING_LENGTH_SQL_SERVER&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Map&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;CompressedString&lt;/span&gt;)&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;CustomType&lt;/span&gt;&amp;lt;&lt;span style="color: #00008b"&gt;GZipStringUserType&lt;/span&gt;&amp;gt;()&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;Length&lt;/span&gt;(&lt;span style="color: #00008b"&gt;MappingContext&lt;/span&gt;.&lt;span style="color: purple"&gt;MAX_ANSI_STRING_LENGTH_SQL_SERVER&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Map&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;CompressedBlob&lt;/span&gt;)&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;CustomType&lt;/span&gt;&amp;lt;&lt;span style="color: #00008b"&gt;SevenZipBlobUserType&lt;/span&gt;&amp;gt;()&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;Length&lt;/span&gt;(&lt;span style="color: #00008b"&gt;MappingContext&lt;/span&gt;.&lt;span style="color: purple"&gt;MAX_ANSI_STRING_LENGTH_SQL_SERVER&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Map&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;ActivePeriod&lt;/span&gt;)&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;CustomType&lt;/span&gt;&amp;lt;&lt;span style="color: #00008b"&gt;TimeRangeUserType&lt;/span&gt;&amp;gt;()&lt;br /&gt;            .&lt;span style="color: purple"&gt;Columns&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;Clear&lt;/span&gt;()&lt;br /&gt;            .&lt;span style="color: purple"&gt;Columns&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;Add&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ACTIVE_FROM_DATE&amp;quot;&lt;/span&gt;)&lt;br /&gt;            .&lt;span style="color: purple"&gt;Columns&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;Add&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ACTIVE_TO_DATE&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Map&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;ActiveYearWeek&lt;/span&gt;)&lt;br /&gt;            .&lt;span style="color: #005e5e"&gt;CustomType&lt;/span&gt;&amp;lt;&lt;span style="color: #00008b"&gt;YearAndWeekUserType&lt;/span&gt;&amp;gt;()&lt;br /&gt;            .&lt;span style="color: purple"&gt;Columns&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;Clear&lt;/span&gt;()&lt;br /&gt;            .&lt;span style="color: purple"&gt;Columns&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;Add&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ACTIVE_YEAR&amp;quot;&lt;/span&gt;)&lt;br /&gt;            .&lt;span style="color: purple"&gt;Columns&lt;/span&gt;.&lt;span style="color: #005e5e"&gt;Add&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ACTIVE_WEEK&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #005e5e"&gt;Map&lt;/span&gt;(x =&amp;gt; x.&lt;span style="color: purple"&gt;UpdateTimestamp&lt;/span&gt;).&lt;span style="color: #005e5e"&gt;CustomType&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;Timestamp&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;우선, Password, Password2 를 보시게 되면,&amp;#160; 둘 다 암호화를 해서 저장하는 UserType 을 지정하고, 길이를 CLOB나 VARCHAR(MAX)를 할 수 있도록 합니다.&amp;#160; &lt;span style="color: #00008b"&gt;RijndaelEncryptStringUserType &lt;/span&gt;은 미국 암호화 AES 규격을 따른 것이고,&amp;#160;&amp;#160; &lt;span style="color: #00008b"&gt;AriaEncryptStringUserType &lt;/span&gt;은 한국 암호화 규격을 따른 것입니다.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;다음으로 압축 저장을 수행해주는 CompressString, CompressedBlob 를 보시면, GZip 으로 압축하던가, 7Zip 알고리즘으로 압축하여 저장해 줍니다. 물론, 로드 시에는 압축을 풀어서 엔티티에서는 Plain Text 나 Byte가 됩니다. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;위 두 가지 방식은 모두 IUserType 을 구현한 Custom UserType 이므로, 속성:컬럼이 1:1입니다. 그러므로 CustomType&amp;lt;XxxxUserType&amp;gt;() 을 지정해 주면 알아서 됩니다. 물론 컬럼 명을 변경하고자 한다면,&amp;#160; .Column(“xxxx”) 를 사용하면 되겠지요^^&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;그럼 이번에는 ICompositeUserType을 사용한 속성에 대한 매핑을 보시죠. 위의 예에서는 ActivePeriod, ActiveYearWeek 입니다. ActivePeriod 는 컬럼 명에서도 유추할 수 있듯이, 기간을 나타냅니다. TimeRangeUserType 으로 수형을 지정하고, 자동으로 매핑되는 컬럼 명을 무시하고 (Columns.Clear()) 순서대로 컬럼 명을 새로 지정했습니다. (한 엔티티에 여러 개의 TimeRangeUserType 이 존재할 수 있으니까요)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;FluentNHibernate 1.3 에서는 ICompositeUserType에 대한 매핑 방식이 달라졌지만, 그래도 아직은 FNH-1.2 가 주류이므로, 이렇게 작성했습니다.&lt;br /&gt;  &lt;br /&gt;FluentNHibernate 으로 CustomType 에 대한 매핑에 대한 설명이 별로 없는 것 같아 작성해 봤습니다… &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-1070672831861280789?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/1070672831861280789/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=1070672831861280789' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/1070672831861280789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/1070672831861280789'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/fluentnhibernate-iusertype.html' title='FluentNHibernate 을 이용한 IUserType 매핑'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-869460850912135012</id><published>2011-10-14T03:14:00.000+09:00</published><updated>2011-10-15T07:59:48.677+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asynchronous'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>HttpMultiFileHandler 소개</title><content type='html'>원본 : &lt;a href="http://omaralzabir.com/http_handler_to_combine_multiple_files__cache_and_deliver_compressed_output_for_faster_page_load/"&gt;Http handler to combine multiple files, cache and deliver compressed output for faster page load&lt;/a&gt; &lt;br /&gt;참고 :&amp;nbsp;&lt;a href="http://developer.yahoo.com/performance/rules.html"&gt;http://developer.yahoo.com/performance/rules.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;아이디어는 이렇습니다. 일반적으로 웹 페이지를 구성하는 것은 페이지 자체의 HTML과 각종 이미지, 그 다음에 부가적으로 CSS 등의 Style 관련 파일과 Javascript 파일들입니다. &lt;br /&gt;이 때 브라우저가 특정 페이지를 로드할 때, 다음과 같은 일이 벌어집니다. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-PuB3pD-FDcc/TpcqoLUcbdI/AAAAAAAAAdM/IFE3p8F4qV0/s1600-h/clip_image001%25255B4%25255D.png"&gt;&lt;img alt="clip_image001" border="0" height="264" src="http://lh6.ggpht.com/-6e2LVsoc1NE/Tpcqot5A2uI/AAAAAAAAAdU/R0CUhH369y0/clip_image001_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-bottom-color: initial; border-bottom-style: initial; border-bottom-width: 0px; border-left-color: initial; border-left-style: initial; border-left-width: 0px; border-right-color: initial; border-right-style: initial; border-right-width: 0px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image001" width="400" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;div align="center"&gt;일반적인 Page Load 시의 통신 Timeline &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;자 보시다시피, Page의 본문이 다 다운되고 나면, 관련된 리소스들 (linked resources) 을 다운받기 위해 network round-trip을 수행합니다. 이때, 관련 리소스들이 아주 많을 경우, 한번에 최대 2개씩 다운로드를 받습니다. 그러니 여러 파일을 다운로드 받아야 할 경우에는 페이지 로딩 속도가 저하되는 것은 너무나 당연합니다. &lt;br /&gt;이를 해결하기 위한 방안은 여러가지가 있습니다. (회사 도서 중에 Ultra-Fast ASP.NET 에 많은 방법이 있습니다.) &lt;br /&gt;DNS를 모두 적어준다던가 하는 간단한 방법도 있습니다만,  &lt;br /&gt;여기서는 HttpHandler를 통해, 필요한 파일들을 한꺼번에 묶어서 보내는 방식을 써보기로 합시다. 즉 다운로드 받을 파일의 갯 수를 줄여서, round-trip을 최소화 하자는 얘기입니다. (이 것만으로도 속도가 빨라지는데, 압축까지 하게 되면 더욱 빨라질 것입니다.) &lt;br /&gt;아래 그림에서 보듯이, CSS 두 개가 한꺼번에 내려 받고, 3개의 Javascript 파일도 동적으로 하나로 묶여서 다운로드가 됩니다. &lt;br /&gt;이렇게 되면, Page Download시간이 기존보다 2배 이상 빨라질 것입니다. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-wop_PvYBxtw/TpcqpHT11uI/AAAAAAAAAdc/cxDamND_7DQ/s1600-h/clip_image002%25255B4%25255D.png"&gt;&lt;img alt="clip_image002" border="0" height="194" src="http://lh3.ggpht.com/-r_LHfbWmp9o/TpcqqeyqmYI/AAAAAAAAAdk/CWMXccNsDw8/clip_image002_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-bottom-color: initial; border-bottom-style: initial; border-bottom-width: 0px; border-left-color: initial; border-left-style: initial; border-left-width: 0px; border-right-color: initial; border-right-style: initial; border-right-width: 0px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image002" width="400" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;HttpMultiFileHandler를 이용하여, 여러파일을 하나로 묶어 전송한다. &lt;br /&gt;자 그럼 본격적으로 어떻게 사용하는지부터 살펴봅시다. &lt;br /&gt;원 저작자는 일반적으로 다운로드 할 파일들을 묶음으로 정의하는 것은 환경설정에서 수행하였습니다. 대부분의 Page가 거의 같은 파일들을 다운로드 받으므로 그렇게 해도 무방합니다. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/-MNvT_n2vLbE/TpcqrmWVv2I/AAAAAAAAAds/5dAW5hiz3OQ/s1600-h/clip_image003%25255B5%25255D.png"&gt;&lt;img alt="clip_image003" border="0" height="137" src="http://lh5.ggpht.com/--2AHyFF6GB0/TpcqsySeT-I/AAAAAAAAAd0/XTFfvqv1AoI/clip_image003_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-bottom-color: initial; border-bottom-style: initial; border-bottom-width: 0px; border-left-color: initial; border-left-style: initial; border-left-width: 0px; border-right-color: initial; border-right-style: initial; border-right-width: 0px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image003" width="640" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;환경설정에서 appSettings 에 CSS 파일 묶음, Javascript 묶음을 설정합니다. &lt;br /&gt;다음으로 실제로 위의 파일들을 하나로 묶어서 다운로드 할 수 있는 HttpHandler 를 등록합니다.  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-w5df-0LMcXM/TpcqteWk2ZI/AAAAAAAAAd8/che6e4h_tfI/s1600-h/clip_image004%25255B5%25255D.png"&gt;&lt;img alt="clip_image004" border="0" height="167" src="http://lh5.ggpht.com/-fxz4NsHxFJ0/TpcquMGp8WI/AAAAAAAAAeE/2oHMz8TFbjs/clip_image004_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-bottom-color: initial; border-bottom-style: initial; border-bottom-width: 0px; border-left-color: initial; border-left-style: initial; border-left-width: 0px; border-right-color: initial; border-right-style: initial; border-right-width: 0px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image004" width="640" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;자 이제 모든 환경 설정은 끝났습니다. &lt;br /&gt;예제 페이지를 작성하고, 페이지 구동이 어떻게 되는지 살펴봅시다. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-Ol08EwV-epY/TpcqujNP01I/AAAAAAAAAeM/ksCQQDBN6W8/s1600-h/clip_image005%25255B5%25255D.png"&gt;&lt;img alt="clip_image005" border="0" height="608" src="http://lh3.ggpht.com/-XcQobfVRTI4/TpcqvAzn5kI/AAAAAAAAAeU/r2iRAoDT1zo/clip_image005_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image005" width="614" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-iTGtsbu9G-I/Tpcqvt4eGXI/AAAAAAAAAec/IyeXKQ3lxG0/s1600-h/clip_image006%25255B5%25255D.png"&gt;&lt;img alt="clip_image006" border="0" height="316" src="http://lh6.ggpht.com/-NpvDAzQdD18/TpcqwTBhTTI/AAAAAAAAAek/rdlSLTFR4CI/clip_image006_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-bottom-color: initial; border-bottom-style: initial; border-bottom-width: 0px; border-left-color: initial; border-left-style: initial; border-left-width: 0px; border-right-color: initial; border-right-style: initial; border-right-width: 0px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image006" width="640" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Page 소스를 보면, 3가지 멀티 파일 묶음 다운로드가 있습니다. &lt;br /&gt;1번은 web.config에서 설정된 CSS 파일들을 묶어서 다운로드 합니다. 그래서 웹페이지 화면이 노란 바탕에 빨강 글씨가 나타나게 된 것이구요. &lt;br /&gt;2번은 web.config에서 설정된 javascript 파일 묶음에 추가로 필요한 파일을 "F" 인자에 할당하여 (Js3.js, Js4.js) 총 5개의 javascript 파일을 하나로 묶어서 다운로드 받습니다. &lt;br /&gt;3번은 좀 특이하게 리소스 위치가 현재 웹 응용프로그램이 아닌, 외부에 있을 경우에도 리소스 들을 다운로드 받아서 하나의 파일로 묶어서 제공해 준다는 것입니다. &lt;br /&gt;이제 대강 어떻게 돌아가는지는 아시겠죠? &lt;br /&gt;그럼 원저작자가 성능을 위해 두 가지를 더 했는데 다음과 같은 기능입니다. &lt;br /&gt;&lt;ol&gt;&lt;li&gt;전송할 리소스를 압축하여 전송한다. &lt;/li&gt;&lt;li&gt;서버 메모리 캐시 (HttpContext.Current.Cache)에 파일 통합본 정보를 저장해 놓고, 다음 요청 시에 사용한다.&lt;br /&gt;물론 유효기간을 두어, 일정시간이 지나면, 폐기되도록 한다. - 이렇게 해야 어느 정도 최신 정보를 볼 수 있습니다.&lt;/li&gt;&lt;/ol&gt;위 두 가지 일은 서버 모듈을 개발하는 개발자라면 꼭 공부해 두고, 자기 것으로 만들어 보시기 바랍니다. &lt;br /&gt;그럼 RCL에서는 원작자와 달리 뭘 더 추가했을까요? &lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;비동기 IO 처리를 수행&lt;/strong&gt;처리할 내용이 파일을 읽어서 응답 스트림에 쓰는 것이므로, 파일 읽기를 비동기 방식으로 수행한다면, 확장성이 보장됩니다.&lt;br /&gt;특히 외부 리소스에 대해서는 WebClient 를 이용하여, 비동기 방식으로 리소스를 다운로드 받도록 하여, 확장성 및 속도를 향상 시켰습니다.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;병렬 처리&lt;/strong&gt;처리할 파일이 복수 개이므로, 병렬로 파일을 읽게 하여, 응답 스트림에 쓴다면, 속도 향상이 클 것입니다. 특히 CPU가 많은 서버라면 속도 향상에 많은 기여를 할 것입니다.&lt;/li&gt;&lt;li&gt;HttpHandler 자체를 IHttpAsyncHandler를 구현하여, 웹 응용프로그램의 확장성을 보장했습니다.&lt;/li&gt;&lt;li&gt;파일 묶음 정의를 고정시키지 않고, 추가할 수 있도록 했습니다. (원작자는 예제니까 그런거고) &lt;/li&gt;&lt;li&gt;&lt;strong&gt;멀티바이트 언어에 대한 대처&lt;/strong&gt;원저자는 영어권이라 문제가 안되지만, 멀티바이트 언어를 사용하는 환경에서는 여러 파일을 하나의 Stream으로 묶을 때 스트림의 선두번지에 멀티바이트임을 나타내는 prefix 를 제거해줘야 합니다. 이 것 때문에 한 두 시간 헤맸습니다.&lt;a href="http://developer.yahoo.com/performance/rules.html"&gt;http://developer.yahoo.com/performance/rules.html&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-869460850912135012?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/869460850912135012/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=869460850912135012' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/869460850912135012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/869460850912135012'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/httpmultifilehandler.html' title='HttpMultiFileHandler 소개'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-6e2LVsoc1NE/Tpcqot5A2uI/AAAAAAAAAdU/R0CUhH369y0/s72-c/clip_image001_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-8249354441503837249</id><published>2011-10-14T01:21:00.001+09:00</published><updated>2011-10-14T01:24:59.002+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='FluentNHibernate'/><title type='text'>NHibernate Code Mapping 비교 – Join</title><content type='html'>NHibernate 사용 시 매핑은 필수이고, 그 동안 HBM 만을 사용했었습니다. &lt;br /&gt;이유는 없고, 많은 참고 자료와 익숙해져 있어서였습니다만, 회사 팀원들이 이제 NHibernate 자체에 많이 익숙해져서, 새로운 시도를 해 봤습니다.&lt;br /&gt;물론 그 시도라는 것은 &lt;a href="http://wiki.fluentnhibernate.org/" target="_blank"&gt;FluentNHibernate&lt;/a&gt; 를 이용한 Code Mapping 입니다. &lt;br /&gt;FluentNHibernate 소개를 보시면 알겠지만, 가장 큰 특징은 Code로 Mapping 을 정의하는 것이고, 부가적으로 &lt;a href="http://wiki.fluentnhibernate.org/Persistence_specification_testing" target="_blank"&gt;자동으로 Mapping 테스트&lt;/a&gt;도 할 수 있다는 장점이 있습니다.&lt;br /&gt;그럼 오늘은 HBM, FluentNHibernate, NH 3.2 Build-In Code Mapping 을 간단한 예를 가지고 비교해 보겠습니다.&lt;br /&gt;아주 간단한 예 중에 하나의 entity를 두 개의 Table 의 1:1 매핑으로 표현하는 방식인 &amp;lt;join /&amp;gt; 이라는 방식에 대한 구현을 보겠습니다.&lt;br /&gt;엔티티 클래스는 다음과 같습니다.&lt;br /&gt;&lt;pre class="brush: c#;"&gt; &lt;br /&gt;using System;&lt;br /&gt;&lt;br /&gt;namespace RCL.Data.NH.DomainModel.Mappings.JoinTable&lt;br /&gt;{&lt;br /&gt; public class JoinMaster : DataEntityBase&amp;lt;Int32&amp;gt;&lt;br /&gt; {&lt;br /&gt;  public virtual string Name { get; set; }&lt;br /&gt; &lt;br /&gt;  public virtual string NickName { get; set; }&lt;br /&gt; &lt;br /&gt;  public virtual string Description { get; set; }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;보시다시피, 3개의 Property가 있습니다. Name 속성은 “JoinMaster” 테이블에 저장되고, NickName과 Description은 “JoinDetail” 테이블에 저장되고, 1:1 매핑이 되게 합니다.&lt;br /&gt;&lt;br /&gt;기본 HBM 방식으로 Mapping 을 정의한다면 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;결과를 보시면, 뭐 별거 아니잖아 하실 것입니다… &lt;br /&gt;&lt;pre class="brush: xml;"&gt;&lt;br /&gt;&lt;hibernate-mapping assembly="RCL.Data.NH.DomainModel" namespace="RCL.Data.NH.DomainModel.Mappings.JoinTable" xmlns="urn:nhibernate-mapping-2.2"&gt;&lt;br /&gt;&lt;br /&gt;&lt;class dynamic-insert="true" dynamic-update="true" name="JoinMaster" table="JoinMaster"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;id column="MasterId" name="Id" type="int" unsaved-value="0"&gt;&lt;br /&gt;   &lt;generator class="native"&gt;&lt;/generator&gt;&lt;br /&gt;  &lt;/id&gt;&lt;br /&gt;&lt;br /&gt;  &lt;property name="Name" type="String"&gt;&lt;/property&gt;&lt;br /&gt;&lt;br /&gt;  &lt;join table="JoinDetail"&gt;&lt;br /&gt;   &lt;key column="MasterId"&gt;&lt;/key&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;property name="NickName"&gt;&lt;/property&gt;&lt;br /&gt;   &lt;property name="Description"&gt;&lt;/property&gt;&lt;br /&gt;  &lt;/join&gt;&lt;br /&gt;     &lt;br /&gt; &lt;/class&gt;&lt;/hibernate-mapping&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;NHibernate 에 대해 초급자 수준이라도 쉽게 이해가 되실 것입니다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;그럼 이런 매핑을 FluentNHibernate 를 이용하여 매핑한다면 다음과 같게 정의할 수 있습니다. &lt;br /&gt;&lt;pre class="brush: c#"&gt;using FluentNHibernate.Mapping;&lt;br /&gt;&lt;br /&gt;namespace RCL.Data.NH.DomainModel.Fluent.Mappings&lt;br /&gt;{&lt;br /&gt; public class FJoinMasterMap : ClassMap&lt;fjoinmaster&gt;&lt;br /&gt; {&lt;br /&gt;  public FJoinMasterMap()&lt;br /&gt;  {&lt;br /&gt;   Table("FJoinMaster");&lt;br /&gt;   LazyLoad();&lt;br /&gt;   DynamicInsert();&lt;br /&gt;   DynamicUpdate();&lt;br /&gt;&lt;br /&gt;   Id(x =&amp;gt; x.Id).Column("MasterId").GeneratedBy.Native();&lt;br /&gt;&lt;br /&gt;   Map(x =&amp;gt; x.Name);&lt;br /&gt;&lt;br /&gt;   Join("FJoinDetail", m =&amp;gt;&lt;br /&gt;                       {&lt;br /&gt;                        m.Map(x =&amp;gt; x.NickName);&lt;br /&gt;                        m.Map(x =&amp;gt; x.Description);&lt;br /&gt;                       });&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/fjoinmaster&gt;&lt;/pre&gt;&lt;br /&gt;FluentNHibernate 를 직접 사용해보면, Lambda Expression을 사용하게 되어, 손 쉽게 Proeprty 를 매핑할 수 있도록 Intellisense에 나타나게 되어 매핑이 손쉽게 됩니다.&lt;br /&gt;(이 매핑에서 “F” 라는 접두사를 둔 것은 HBM 방식의 매핑과 같은 DB에 생성하기 위해 구분을 위해 넣었습니다.)&lt;br /&gt;&lt;br /&gt;다음은 NH-3.2에 새로 제공되는 Built-In Code Mapping 방식을 살펴보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c#"&gt;&lt;br /&gt;using NHibernate.Mapping.ByCode;&lt;br /&gt;using NHibernate.Mapping.ByCode.Conformist;&lt;br /&gt;&lt;br /&gt;namespace RCL.Data.NH.DomainModel.Loquacious&lt;br /&gt;{&lt;br /&gt; public class CJoinEntityMap : ClassMapping&lt;cjoinentity&gt;&lt;br /&gt; {&lt;br /&gt;  public CJoinEntityMap()&lt;br /&gt;  {&lt;br /&gt;   Table("CJoinEntity");&lt;br /&gt;   Lazy(true);&lt;br /&gt;   DynamicInsert(true);&lt;br /&gt;   DynamicUpdate(true);&lt;br /&gt;&lt;br /&gt;   Id(x =&amp;gt; x.Id, c =&amp;gt; c.Generator(Generators.Native));&lt;br /&gt;&lt;br /&gt;   Property(x =&amp;gt; x.Name);&lt;br /&gt;&lt;br /&gt;   Join("CJoinEntityDetail",&lt;br /&gt;        jm =&amp;gt;&lt;br /&gt;        {&lt;br /&gt;         jm.Property(x =&amp;gt; x.NickName);&lt;br /&gt;         jm.Property(x =&amp;gt; x.Description, c =&amp;gt; c.Length(9999));&lt;br /&gt;        });&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NH-3.2 Code Mapping 방식은 Lambda Expression을 사용했지만, Fluent 방식 (Method Chain) 을 사용하지 않아, 코드가 좀 길어진 느낌입니다. 다만 메소드 명칭이 HBM의 XML Element 요소명과 같아, 쉽게 기억할 수 있는 점이 장점입니다.&lt;br /&gt;&lt;br /&gt;HBM 방식의 장점은 기존 매핑에 대한 많은 방식이 HBM으로 되어 있어, 공부하기에는 좋습니다. 즉 기초를 닦기 위해서는 HBM을 꼭 학습해야 합니다.&lt;br /&gt;&lt;br /&gt;FluentNHibernate 방식은 실행 시 HBM을 생성하여, NHibernate가 Deserialize를 수행하는 방식이라, 첫 실행 시에 성능 문제가 제기될 수 있지만, 웬만한 시스템에서는 별 의미 없는 단점이라 할 수 있습니다. 코드 매핑의 장점으로는 “Magic String” 을 사용하지 않아, 유지보수나 Refactoring 시에 상당히 유용하다고 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;NH-3.2 Code Mapping 방식은 Code Mapping의 장점과 내부 API 라는 장점으로 XML Deserialize 단계를 생략하게 됩니다. 결국 NHibernate 초기화 비용이 가장 적게 든다고 볼 수 있습니다. 다만 매핑 방식이 Fluent 방식이 아니라, 코드가 길어지고, 가독성이 떨어진다는 점이 단점이라 볼 수 있습니다. 또한 첫 번째 버전이라 그런지, MySQL 이나 PostgreSQL 에서는 매핑이 제대로 안 되는 경우가 있습니다. (앞으로 나올 NH 3.2.1 도 마찮가지로 안됩니다)&lt;br /&gt;&lt;br /&gt;여러분은 어떤 방식을 쓰시겠습니까?&lt;br /&gt;저희 회사 내부에서는 압도적으로 FluentNHibernate가 인기가 있더군요&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-8249354441503837249?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/8249354441503837249/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=8249354441503837249' title='4개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/8249354441503837249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/8249354441503837249'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/nhibernate-code-mapping-join.html' title='NHibernate Code Mapping 비교 – Join'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-6920721969821747419</id><published>2011-10-13T02:28:00.001+09:00</published><updated>2011-10-13T03:23:46.362+09:00</updated><title type='text'>코드 테스트</title><content type='html'>&lt;br /&gt;코드 예&lt;br /&gt;&lt;pre class="brush: csharp; line: 7;"&gt;&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;    _path = AppDomain.CurrentDomain.BaseDirectory;&lt;br /&gt;    if (!File.Exists(Path.Combine(_path, RedisServer)))&lt;br /&gt;        Exit("Couldn`t find " + RedisServer);&lt;br /&gt;&lt;br /&gt;    if (!File.Exists(Path.Combine(_path, RedisCLI)))&lt;br /&gt;        Exit("Couldn`t find " + RedisCLI);&lt;br /&gt;&lt;br /&gt;    if (Environment.UserInteractive)&lt;br /&gt;    {&lt;br /&gt;        SetConsoleCtrlHandler(ConsoleCtrlCheck, true);&lt;br /&gt;        //Console.CancelKeyPress += (sender, eventArgs) =&amp;gt; StopRedis();&lt;br /&gt;        StartRedis(args.Length == 1 ? args[0] : null);&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;        Run(new Program());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;이건데요… 제대로 되나요?&lt;br /&gt;이제 제대로 됩니다. Syntax Highlight 땜시 항상 글 쓰기 힘들었는데, 이제 좀 편해지려나?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-6920721969821747419?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/6920721969821747419/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=6920721969821747419' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6920721969821747419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6920721969821747419'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/blog-post_13.html' title='코드 테스트'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-953693252126674689</id><published>2011-10-12T23:33:00.002+09:00</published><updated>2011-10-12T23:34:47.843+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='NoSQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Membase'/><category scheme='http://www.blogger.com/atom/ns#' term='Redis'/><title type='text'>여러 가지 NoSQL DB 비교 자료 및 의견</title><content type='html'>&lt;p&gt;&lt;span &gt;요즘 한창 인기가 있다 보니 너무도 다양한 방식의 NoSQL DB들이 나옵니다. 대표적인 RDBMS 업체인 Oracle에서도 NoSQL을 한다니 말 다했죠. 그만큼 현재 기술 흐름에서 NoSQL이 꼭 필요한 기술임에는 틀림 없습니다… 다만… 처음 접하시는 분들은 “아니 그게 뭔데?” 부터 시작하겠죠?&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span &gt;그런 분들은 우선 대표적인 MongoDB 나 Membase 를 사용해보시던가, 자료를 읽어보시기 바랍니다. 기존 RDBMS 와의 차이를 보실 수 있습니다.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span &gt;여기서는 다들 NoSQL 이라고 하는데 (Wikipedia 참고하시면 더 많습니다만…), 너무 많아 특징을 분석하기가 힘듭니다. 그리고, 자신이 필요로 하는 기능을 가진 제품이 자신이 적용하고자 하는 환경을 지원하는지도 다 파악하려면, 지레 겁 먹을 수 있겠죠?&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span &gt;여러 NoSQL DB 비교 (&lt;/span&gt;&lt;a title="http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis" href="http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis"&gt;&lt;span &gt;http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis&lt;/span&gt;&lt;/a&gt;&lt;span &gt;) 사이트를 참고하시면, 어렴풋이나마, 난 어떤 것을 사용해 보면 좋을 것 같다고 느끼실 수 있습니다. (물론 NoSQL DB의 필요성에 공감을 해야지요)&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span &gt;대략 보시면 CouchDB 는 MDM 에 알맞고, Redis 는 Log, Cache, ETL 등에 알맞고, MongoDB 는 팔방미인이고, Membase는 메모리 기반이므로, 속도는 빠르고, 용량이 작은 분야에 적용하고… 뭐 그런 내용들입니다…&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span &gt;제가 실전에 쓴 것은 현재까지 Membase와 MongoDB 두 가지 입니다만, 앞으로 Redis 를 실전에 적용하기 위해, 테스트 중입니다.&lt;br /&gt;&lt;/span&gt;&lt;span &gt;&lt;br /&gt;Membase 는 소규모 웹 사이트의 ViewState, OutputCache, Session 정보 및 Data Cache 용으로 주로 사용하였고,&lt;br /&gt;MongoDB는 위의 Data Cache 뿐 아니라, 대용량 파일 저장소로도 사용하였고, ETL 변환 작업에서도 사용하였습니다. (내부에서는 javascript 로)&lt;br /&gt;Redis 는 실시간 Data 전송이 아주 많은 곳에 사용하려고 합니다. 실시간 Data 수집 및 분석 시에는 Redis 처럼 메모리에서 처리하고, 용량이 큰 파일 같은 것은 따로 처리 할 수 있으면 좋겠지요…&lt;/span&gt;&lt;/p&gt;&lt;span &gt; &lt;/span&gt;&lt;p&gt;&lt;span &gt;&lt;/span&gt;&lt;span &gt;좀 다른 얘기지만, 2011년 8월 기준으로 NoSQL Job Trends (&lt;a title="http://css.dzone.com/news/nosql-job-trends" href="http://css.dzone.com/news/nosql-job-trends"&gt;http://css.dzone.com/news/nosql-job-trends&lt;/a&gt;) 라고, 어떤 NoSQL을 다룰 줄 아는 사람에 대한 일자리 비율입니다. 3군데 자료가 좀 다르지만, 대부분 MongoDB 가 압도적이고, Canssandra와 Redis 가 뒤를 쫒고 잇는 형국입니다.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span &gt;물론 제가 아예 관심을 두지 않는 HBase, Hadoop 관련은 논외로 했습니다. 이쪽 분야에는 제가 문외한이라서요^^&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-953693252126674689?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/953693252126674689/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=953693252126674689' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/953693252126674689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/953693252126674689'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/nosql-db.html' title='여러 가지 NoSQL DB 비교 자료 및 의견'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-10561785529011399</id><published>2011-10-12T18:16:00.000+09:00</published><updated>2011-10-12T18:17:50.377+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asynchronous'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET 비동기 프로그래밍</title><content type='html'>&lt;p&gt;&lt;font size="2"&gt;비동기 프로그래밍 방식은 여러 분야에서 처리량(throughput) 증대, 확장성 향상에 좋은 방식임에는 틀림없습니다. &lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;다만 사용 방법이 직관적이지 못해, 개발자들이 쉽게 수용하지 못하는 경우가 많습니다. 이에 몇 가지 자료와 함께 비동기 프로그래밍을 아주 쉽게 적용할 수 있는 방법을 알려 드리도록 하겠습니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;우선 참고자료로는&lt;/font&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/magazine/cc163463.aspx"&gt;&lt;font size="2"&gt;ASP.NET에서 비동기 프로그래밍을 활용하여 확장성이 우수한 응용프로그램 작성&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font size="2"&gt;MSDN : &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/library/system.web.ui.pageasynctask.aspx"&gt;&lt;font size="2"&gt;PageAsyncTask&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font size="2"&gt;를 보시면 좋습니다. 다만 위의 예제는 사용하지 않을 것이고, 방법도 전혀 다르므로, 개념만 이해하시면 됩니다.&lt;/font&gt; &lt;ol&gt; &lt;li&gt;&lt;font size="2"&gt;ASP.NET Web Form 에서 비동기 프로그래밍&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;font size="2"&gt;ASP.NET에서 비동기 프로그래밍의 개념을 가장 잘 나타낸 그림입니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;보시다시피, 1번 요청 스레드에서 비동기로 작업을 시작하면, 스레드가 없어지고, 비동기 IO 작업으로 DB에 대한 처리를 담당합니다. 그 후 작업이 완료되면, 새로운 스레드가 만들어져, 비동기 작업을 마무리 합니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-ghwaaaax9Mg/TpVbGSizggI/AAAAAAAAAbs/pe5EJ7RC2ro/s1600-h/clip_image001%25255B3%25255D.png"&gt;&lt;font size="2"&gt;&lt;a href="http://lh6.ggpht.com/-ghwaaaax9Mg/TpVbGSizggI/AAAAAAAAAb0/M7OzMyC44wk/s1600-h/clip_image001%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://lh4.ggpht.com/-A2aH_0gQkQc/TpVbH7EPwFI/AAAAAAAAAb4/dK_X_81BOVc/clip_image001_thumb%25255B1%25255D.png?imgmax=800" width="416" height="237"&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;화면 캡처: 2010-08-19 오후 1:39&lt;/font&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp; &lt;p&gt;&lt;font size="2"&gt;위의 방식은 일반적인 Computed-bounded 비동기 방식과는 달리 IO-bounded 비동기 방식이라 합니다. IO-bounded 비동기 방식은 처리율이 현저히 떨어지는 파일, Network, DB등의 IO 작업 시에 작업 스레드가 멍청히 기다리면서, 계속된 context switching에 대한 부담을 가지지 않도록 해주고, 동시에 여러 요청이 오더라도, 동시 활성화된 스레드의 수가 작으므로, 멀티스레드 관리에 드는 부담이 현저히 줄어들게 됩니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;이에 Data-Centric 한 응용프로그램이거나 메신저 서버 등 IO 작업이 많은 서버 쪽에서도 비동기 방식으로 구현하게 되면, 많은 수의 동시 요청을 수용할 수 있게 됩니다.(이런 걸 확장성이라 합니다.) &lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;그럼 기존 ASP.NET 2.0에서는 Web Form에 대해 두 가지 방식의 비동기 프로그래밍을 지원합니다. 첫 번째가 &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/library/0eb3cf2k%28v=VS.85%29.aspx"&gt;&lt;font size="2"&gt;Page.AddOnPreRenderCompleteAsync&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; 이고, 두 번째가 &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/library/system.web.ui.pageasynctask.aspx"&gt;&lt;font size="2"&gt;PageAsyncTask&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; 입니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;근데, 두 방식 모두 다 상당히 복잡합니다…&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;그래서 .NET 4.0 TPL (Task Parallel Library)의 &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/library/system.threading.tasks.taskfactory.aspx"&gt;&lt;font size="2"&gt;TaskFactory&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; 의 &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/library/dd321543.aspx"&gt;&lt;font size="2"&gt;FromAsync&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; 메소드를 이용하여 아주 쉽게, 비동기 Web Form을 구현하는 방법에 대해 알려드리겠습니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-pmpeTqgFcjs/TpVbIera3jI/AAAAAAAAAcA/mYNfoRsZgeg/s1600-h/clip_image002%25255B6%25255D.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh6.ggpht.com/-SzVIjZvse_c/TpVbJNYUmHI/AAAAAAAAAcI/vAHKoruEtIg/clip_image002_thumb%25255B3%25255D.png?imgmax=800" width="738" height="545"&gt;&lt;/font&gt;&lt;/a&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;비동기 방식의 Web Form 수행&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp; &lt;p&gt;&lt;font size="2"&gt;예제 코드는 보시다시피 비동기 작업에 대한, 시뮬레이션을 위해 Thread.Sleep() 함수를 이용합니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;실제 작업은 DoProcessTask() 로 기존 개발과 똑같이 구현하시면 됩니다. 그 후 비동기 방식으로 실행하기 위해, TPL의 TaskFactory.FromAsync() 메소드를 이용하는 것입니다. Line 21에서 실제 작업하고자 하는 함수의 인스턴스를 받아, line 24 처럼 FromAsync 메소드를 호출하기만 하면 됩니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;물론 FromAsync 메소드는 overload가 상당히 많으므로, 작업함수(DoProcessTask())의 다양한 signature를 수용할 수 있습니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;응용을 위해서는, 위의 DoProcessTask() 메소드 내에서, DB에 접속하여 정보를 가져오는 작업을 구현하면 됩니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;TPL을 활용해서 더 좋은 장점은 FromAsync로 만드는 작업을 여러 개 만들면, 병렬로 수행할 수 있다는 것입니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;즉 여러 개의 비동기 IO-Bounded 작업을 병렬로 수행할 수 있다는 뜻입니다.&lt;/font&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-01nnuxu0tik/TpVbJtKdseI/AAAAAAAAAcQ/MFxAjI_x6Io/s1600-h/clip_image003%25255B3%25255D.png"&gt;&lt;font size="2"&gt;&lt;a href="http://lh5.ggpht.com/-01nnuxu0tik/TpVbJtKdseI/AAAAAAAAAcY/G1bGCVtWsYc/s1600-h/clip_image003%25255B6%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://lh3.ggpht.com/-CGIhTRWZTSo/TpVbLRPEOiI/AAAAAAAAAcc/wJhkPXsbSxU/clip_image003_thumb%25255B3%25255D.png?imgmax=800" width="669" height="797"&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;복수의 비동기 작업을 병렬로 수행하는 예&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;이렇게 사용한다면, Bottleneck도 걸리지 않고, 병렬로 작업을 수행하게 되므로, 처리율과 속도 모두 만족스러운 향상을 가져올 것입니다. &lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;TPL 사용이 .NET 4.0이상에서만 가능하다는 편견은 버리십시요. &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;&lt;font size="2"&gt;Reactive Extensions&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; for .NET 3.5.1에 System.Threading.dll 이 TPL을 제공하니, .NET 3.5.1에서도 병렬 프로그래밍이 가능합니다. (RCL도 마찮가지구요) &lt;/font&gt; &lt;ol&gt; &lt;li&gt;&lt;font size="2"&gt;IHttpAsyncHandler를 구현한 비동기 프로그래밍&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;font size="2"&gt;우선 MSDN의 &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/library/ms227433%28v=VS.90%29.aspx"&gt;&lt;font size="2"&gt;비동기 HTTP 처리기 만들기&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; 를 보십시요. 설명서대로 구현하려면, 여러 Http 처리기를 만들어야 하는 사람의 입장에서, 상당히 부담이 될 것입니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp; &lt;p align="center"&gt;&lt;font size="2"&gt;&amp;lt;&amp;lt;HttpAsyncHandlerBase.cs&amp;gt;&amp;gt;&lt;/font&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-HxKfhPEUgYY/TpVbMOB1G0I/AAAAAAAAAck/MnDf9LKP7yY/s1600-h/clip_image004%25255B3%25255D.png"&gt;&lt;font size="2"&gt;&lt;a href="http://lh3.ggpht.com/-HxKfhPEUgYY/TpVbMOB1G0I/AAAAAAAAAcs/zAafofz34P0/s1600-h/clip_image004%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh4.ggpht.com/-LITDUAdp9iw/TpVbNfLV4uI/AAAAAAAAAcw/dndv-9-qO2c/clip_image004_thumb%25255B1%25255D.png?imgmax=800" width="643" height="521"&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font size="2"&gt;이에 IHttpAsyncHandler 를 구현한 기본클래스를 제작하여, 일반 개발자는 Web Form 비동기 방식 구현과 마찮가지로, 전혀 비동기에 대한 어떠한 구현도 하지 않도록 해줍니다. (첨부파일 참고)&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;예제는 다음과 같습니다.&lt;/font&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-zZ19CP23low/TpVbNwW-xhI/AAAAAAAAAc4/I2tbhogGvbU/s1600-h/clip_image005%25255B3%25255D.png"&gt;&lt;font size="2"&gt;&lt;a href="http://lh3.ggpht.com/-zZ19CP23low/TpVbNwW-xhI/AAAAAAAAAdA/yKgcc60sl2w/s1600-h/clip_image005%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://lh3.ggpht.com/-wMYEfc4aqZM/TpVbPVaowsI/AAAAAAAAAdE/sDvuN4iR5mc/clip_image005_thumb%25255B1%25255D.png?imgmax=800" width="617" height="451"&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;IHttpAsyncHandler 를 구현한 예제&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp; &lt;p&gt;&lt;font size="2"&gt;위 예제 코드에서는 비동기 관련 코드는 전혀 보이지 않습니다. 다만, 개발자는 DoProcessRequest() 메소드를 재 정의하여, 자신이 원하는 코드를 작성하면 됩니다. DB 작업을 기존 방식대로 작업해도 됩니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;어떻습니까? MSDN 에 나온 방식은 제가 봐도, 구현 자체가 문제가 아니라 확산이 문제였는데, 위의 두 가지 방식은 아주 손 쉽게 작업할 수 있도록 했습니다.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;물론 HttpAsyncHandlerBase의 경우에는, 상속 체계를 바꾸는 문제가 있을 수 있지만, 많은 개발자들이 HttpHandler 를 도입하는 단계라면, 도입 효과가 상당하리라 예상됩니다.^^&lt;/font&gt; &lt;ol&gt; &lt;li&gt;&lt;font size="2"&gt;참고 자료&lt;/font&gt; &lt;ol&gt; &lt;li&gt;&lt;font size="2"&gt;CLR via C# 2nd Ed. Chapter 23, 24&lt;/font&gt; &lt;li&gt;&lt;font size="2"&gt;CLR via C# 3rd Ed. Chapter 25 ~ 29&lt;/font&gt; &lt;li&gt;&lt;font size="2"&gt;Pro .NET Parallel Programming in C#&lt;/font&gt; &lt;li&gt;&lt;font size="2"&gt;Pattern Of Parallel Programming (svn/public/research 에 parallel 관련 )&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-10561785529011399?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/10561785529011399/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=10561785529011399' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/10561785529011399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/10561785529011399'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/aspnet.html' title='ASP.NET 비동기 프로그래밍'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-A2aH_0gQkQc/TpVbH7EPwFI/AAAAAAAAAb4/dK_X_81BOVc/s72-c/clip_image001_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-5370406195406339428</id><published>2011-10-12T03:11:00.001+09:00</published><updated>2011-10-22T10:49:37.591+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='FluentNHibernate'/><title type='text'>FluentNHibernate 으로 ManyToMany 매핑하기</title><content type='html'>HBM으로 매핑하는 것은 많은 예제가 있는데, FluentNHibernate으로 매핑하는 예제는 FluentNHibernate 사이트에 달랑 한 줄의 코드로 설명이 끝납니다.&lt;br /&gt;아니 ManyToMany가 얼마나 복잡한 건데 달랑 한 줄에 끝내는 겨? 특히나 양방향 (bi-directional) 인 경우에는 둘 중 한 군데에 inverse=true 를 줘야 하는데, 그런 예도 없고 말야…&lt;br /&gt;어쩔 수 없이 테스트를 해봤습니다… 우선은 상세한 매핑 설정을 통해 제대로 작동하는지 검증해 봤습니다.&lt;br /&gt;&lt;br /&gt;Many-To-Many 상세 설정&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;div id="codeSnippet" style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; FDepartmentMap : ClassMap&amp;lt;FDepartment&amp;gt;&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color: blue;"&gt;public&lt;/span&gt; FDepartmentMap()&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;         Table(&lt;span style="color: #006080;"&gt;"FDepartment"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;         DynamicInsert();&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;         DynamicUpdate();&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;         Id(x =&amp;gt; x.Id).Column(&lt;span style="color: #006080;"&gt;"DepartmentId"&lt;/span&gt;).GeneratedBy.Native();&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt;         Map(x =&amp;gt; x.Code);&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt;         Map(x =&amp;gt; x.Name);&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt;         References(x =&amp;gt; x.Parent)&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum15" style="color: #606060;"&gt;  15:&lt;/span&gt;             .Column(&lt;span style="color: #006080;"&gt;"ParentId"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum16" style="color: #606060;"&gt;  16:&lt;/span&gt;             .Access.Property()&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum17" style="color: #606060;"&gt;  17:&lt;/span&gt;             .Cascade.SaveUpdate()&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum18" style="color: #606060;"&gt;  18:&lt;/span&gt;             .Fetch.Select()&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum19" style="color: #606060;"&gt;  19:&lt;/span&gt;             .LazyLoad(Laziness.Proxy);&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum20" style="color: #606060;"&gt;  20:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum21" style="color: #606060;"&gt;  21:&lt;/span&gt;         HasMany(x =&amp;gt; x.Children)&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum22" style="color: #606060;"&gt;  22:&lt;/span&gt;             .Access.CamelCaseField(Prefix.Underscore)&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum23" style="color: #606060;"&gt;  23:&lt;/span&gt;             .Cascade.AllDeleteOrphan()&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum24" style="color: #606060;"&gt;  24:&lt;/span&gt;             .Inverse()&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum25" style="color: #606060;"&gt;  25:&lt;/span&gt;             .LazyLoad()&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum26" style="color: #606060;"&gt;  26:&lt;/span&gt;             .AsSet(SortType.Natural);&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum27" style="color: #606060;"&gt;  27:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum28" style="color: #606060;"&gt;  28:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum29" style="color: #606060;"&gt;  29:&lt;/span&gt;         Component&amp;lt;TreeNodePosition&amp;gt;(x =&amp;gt; x.NodePosition,&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum30" style="color: #606060;"&gt;  30:&lt;/span&gt;                                     p =&amp;gt;&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum31" style="color: #606060;"&gt;  31:&lt;/span&gt;                                     {&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum32" style="color: #606060;"&gt;  32:&lt;/span&gt;                                         p.Map(x =&amp;gt; x.Order).Column(&lt;span style="color: #006080;"&gt;"TreeOrder"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum33" style="color: #606060;"&gt;  33:&lt;/span&gt;                                         p.Map(x =&amp;gt; x.Level).Column(&lt;span style="color: #006080;"&gt;"TreeLevel"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum34" style="color: #606060;"&gt;  34:&lt;/span&gt;                                     });&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum35" style="color: #606060;"&gt;  35:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum36" style="color: #606060;"&gt;  36:&lt;/span&gt;         HasManyToMany(x =&amp;gt; x.Users)&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum37" style="color: #606060;"&gt;  37:&lt;/span&gt;             .Table(&lt;span style="color: #006080;"&gt;"FDepartmentMember"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum38" style="color: #606060;"&gt;  38:&lt;/span&gt;             .ParentKeyColumn(&lt;span style="color: #006080;"&gt;"DepartmentId"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum39" style="color: #606060;"&gt;  39:&lt;/span&gt;             .ChildKeyColumn(&lt;span style="color: #006080;"&gt;"UserId"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum40" style="color: #606060;"&gt;  40:&lt;/span&gt;             .Inverse()&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum41" style="color: #606060;"&gt;  41:&lt;/span&gt;             .LazyLoad()&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum42" style="color: #606060;"&gt;  42:&lt;/span&gt;             .AsSet();&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum43" style="color: #606060;"&gt;  43:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum44" style="color: #606060;"&gt;  44:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;보시다시피 many-to-many&amp;nbsp; 매핑을 수행하는 부분은 소속 부서원들과의 매핑이고, 겸직을 고려한 설계입니다.&lt;br /&gt;&lt;br /&gt;관계 table 명은 “FDepartmentMember” 이고, DepartmentId, UserId 의 값 설정으로 됩니다. 그리고, 중복을 방지하기 위해 ISet&amp;lt;FUser&amp;gt; 이구요…&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이 방법은 제가 그 동안 HBM으로 매핑하는 방식에 익숙해서 모두 설정해 준 것이고, 실제로 다음과 같이만 해줘도&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;br /&gt;&lt;div id="codeSnippet" style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; HasManyToMany(x =&amp;gt; x.Users)&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;     .Table(&lt;span style="color: #006080;"&gt;"FDepartmentMember"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;     .Inverse()&lt;/pre&gt;&lt;pre style="background-color: #f8f8f8; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: consolas, 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     .AsSet();&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;똑 같은 결과를 얻는다는 것입니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FluentNHibernate의 AutoMapping 기능이 상당히 막강하여, 왠만한 정보는 Entity 클래스로부터 추출해 내므로, 굳이 매핑 시 지정하지 않아도 된다는 점입니다.&lt;br /&gt;&lt;br /&gt;보면 볼 수록 FluentNHibernate은 매력적인 놈이라 생각됩니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-5370406195406339428?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/5370406195406339428/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=5370406195406339428' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5370406195406339428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5370406195406339428'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/fluentnhibernate-manytomany.html' title='FluentNHibernate 으로 ManyToMany 매핑하기'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-2935838771123307987</id><published>2011-10-12T02:53:00.000+09:00</published><updated>2011-10-12T02:56:29.089+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Newtonsoft.Json.Net.dll 을 사용하여 직렬화/역직렬화하기</title><content type='html'>&lt;div id="codeSnippetWrapper"&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;객체를 Json 형식으로 직렬화/ 역직렬화를 수행하여, 다른 형식의 수형으로 매핑을 수행합니다.&lt;/div&gt; &lt;div&gt;보통의 경우 Binary 방식의 경우는 객체가 SerializableAttribute가 있어야 하고, Xml 방식은 성능이 안나옵니다.&lt;/div&gt; &lt;div&gt;이럴 때, Json 또는 Bson 방식을 사용하게 되면 상당히 유리합니다.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div id="codeSnippetWrapper"&gt; &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Newtonsoft.Json;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; RCL.Core&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// JSON 포맷으로 객체 Mapping을 수행합니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; JsonUtil&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 객체를 JSON 직렬화/역직렬화를 통해, T 수형의 인스턴스를 빌드합니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;typeparam name="T"&amp;gt;대상 수형&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;매핑된 T 수형의 객체&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; T Mapping&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Mapping&amp;lt;T&amp;gt;(source, DefaultJsonSerializerSettings);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 객체를 JSON 직렬화/역직렬화를 통해, T 수형의 인스턴스를 빌드합니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;typeparam name="T"&amp;gt;대상 수형&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="serializerSettings"&amp;gt;JSON 직렬화 설정 정보&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;매핑된 T 수형의 객체&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; T Mapping&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source, JsonSerializerSettings serializerSettings)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;             source.ShouldNotBeNull(&lt;span style="color: #006080"&gt;"source"&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;             T target;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(TryMapping(source, serializerSettings, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; target))&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; target;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;(T);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;         &lt;span style="color: #008000"&gt;///  객체를 JSON 직렬화/역직렬화를 통해, T 수형의 인스턴스를 빌드합니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;typeparam name="T"&amp;gt;대상 수형&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="additionalMapping"&amp;gt;부가 매핑 정보&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;매핑된 T 수형의 객체&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; T Mapping&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source, Action&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;, T&amp;gt; additionalMapping)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;             source.ShouldNotBeNull(&lt;span style="color: #006080"&gt;"source"&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;             var result = Mapping&amp;lt;T&amp;gt;(source);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(additionalMapping != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum54"&gt;  54:&lt;/span&gt;             {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum55"&gt;  55:&lt;/span&gt;                 additionalMapping(source, result);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum56"&gt;  56:&lt;/span&gt;             }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum57"&gt;  57:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum58"&gt;  58:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum59"&gt;  59:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum60"&gt;  60:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum61"&gt;  61:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 객체를 JSON 직렬화/역직렬화를 통해, &amp;lt;paramref name="targetType"/&amp;gt; 수형의 인스턴스를 빌드합니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum62"&gt;  62:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum63"&gt;  63:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum64"&gt;  64:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="targetType"&amp;gt;대상 수형&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum65"&gt;  65:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;매핑된 대상 수형의 객체&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum66"&gt;  66:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; Mapping(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source, Type targetType)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum67"&gt;  67:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum68"&gt;  68:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Mapping(source, targetType, DefaultJsonSerializerSettings);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum69"&gt;  69:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum70"&gt;  70:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum71"&gt;  71:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum72"&gt;  72:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 객체를 JSON 직렬화/역직렬화를 통해, &amp;lt;paramref name="targetType"/&amp;gt; 수형의 인스턴스를 빌드합니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum73"&gt;  73:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum74"&gt;  74:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum75"&gt;  75:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="targetType"&amp;gt;대상 수형&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum76"&gt;  76:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="serializerSettings"&amp;gt;JSON 직렬화 설정 정보&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum77"&gt;  77:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;매핑된 대상 수형의 객체&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum78"&gt;  78:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; Mapping(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source, Type targetType, JsonSerializerSettings serializerSettings)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum79"&gt;  79:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum80"&gt;  80:&lt;/span&gt;             source.ShouldNotBeNull(&lt;span style="color: #006080"&gt;"source"&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum81"&gt;  81:&lt;/span&gt;             targetType.ShouldNotBeNull(&lt;span style="color: #006080"&gt;"targetType"&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum82"&gt;  82:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum83"&gt;  83:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; target;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum84"&gt;  84:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum85"&gt;  85:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(TryMapping(source, targetType, serializerSettings, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; target))&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum86"&gt;  86:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; target;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum87"&gt;  87:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum88"&gt;  88:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum89"&gt;  89:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum90"&gt;  90:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum91"&gt;  91:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum92"&gt;  92:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 원본 객체를 JSON 포맷으로 직렬화를 수행하고, 대상 형식으로 역직렬화를 수행합니다. 두 수형이 달라도 상관없습니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum93"&gt;  93:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum94"&gt;  94:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum95"&gt;  95:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="target"&amp;gt;대상 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum96"&gt;  96:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Mapping 성공 여부&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum97"&gt;  97:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;see cref="ObjectMapper"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum98"&gt;  98:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; TryMapping&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; T target)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum99"&gt;  99:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum100"&gt; 100:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; TryMapping&amp;lt;T&amp;gt;(source, DefaultJsonSerializerSettings, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; target);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum101"&gt; 101:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum102"&gt; 102:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum103"&gt; 103:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum104"&gt; 104:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 원본 객체를 JSON 포맷으로 직렬화를 수행하고, 대상 형식으로 역직렬화를 수행합니다. 두 수형이 달라도 상관없습니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum105"&gt; 105:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum106"&gt; 106:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum107"&gt; 107:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="target"&amp;gt;대상 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum108"&gt; 108:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="serializerSettings"&amp;gt;JSON 직렬화 설정 정보&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum109"&gt; 109:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Mapping 성공 여부&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum110"&gt; 110:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;see cref="ObjectMapper"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum111"&gt; 111:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; TryMapping&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source, JsonSerializerSettings serializerSettings, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; T target)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum112"&gt; 112:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum113"&gt; 113:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(source == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum114"&gt; 114:&lt;/span&gt;             {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum115"&gt; 115:&lt;/span&gt;                 target = &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;(T);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum116"&gt; 116:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum117"&gt; 117:&lt;/span&gt;             }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum118"&gt; 118:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum119"&gt; 119:&lt;/span&gt;             Type targetType = &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(T);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum120"&gt; 120:&lt;/span&gt;             target = &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;(T);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum121"&gt; 121:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; targetObject;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum122"&gt; 122:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum123"&gt; 123:&lt;/span&gt;             var result = TryMapping(source, targetType, serializerSettings, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; targetObject);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum124"&gt; 124:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(result)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum125"&gt; 125:&lt;/span&gt;                 target = (T)targetObject;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum126"&gt; 126:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum127"&gt; 127:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum128"&gt; 128:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum129"&gt; 129:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum130"&gt; 130:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum131"&gt; 131:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 원본 객체를 JSON 포맷으로 직렬화를 수행하고, 대상 수형으로 역직렬화를 수행합니다. 두 수형이 달라도 상관없습니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum132"&gt; 132:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum133"&gt; 133:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum134"&gt; 134:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="targetType"&amp;gt;대상 객체의 수형&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum135"&gt; 135:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="target"&amp;gt;대상 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum136"&gt; 136:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Mapping 성공 여부&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum137"&gt; 137:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;see cref="ObjectMapper"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum138"&gt; 138:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; TryMapping(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source, Type targetType, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; target)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum139"&gt; 139:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum140"&gt; 140:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; TryMapping(source, targetType, DefaultJsonSerializerSettings, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; target);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum141"&gt; 141:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum142"&gt; 142:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum143"&gt; 143:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum144"&gt; 144:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// 원본 객체를 JSON 포맷으로 직렬화를 수행하고, 대상 수형으로 역직렬화를 수행합니다. 두 수형이 달라도 상관없습니다.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum145"&gt; 145:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum146"&gt; 146:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="source"&amp;gt;원본 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum147"&gt; 147:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="targetType"&amp;gt;대상 객체의 수형&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum148"&gt; 148:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="serializerSettings"&amp;gt;JSON 직렬화 설정 정보&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum149"&gt; 149:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="target"&amp;gt;대상 객체&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum150"&gt; 150:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Mapping 성공 여부&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum151"&gt; 151:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;see cref="ObjectMapper"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum152"&gt; 152:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; TryMapping(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; source, Type targetType, JsonSerializerSettings serializerSettings, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; target)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum153"&gt; 153:&lt;/span&gt;         {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum154"&gt; 154:&lt;/span&gt;             var result = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum155"&gt; 155:&lt;/span&gt;             target = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum156"&gt; 156:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum157"&gt; 157:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum158"&gt; 158:&lt;/span&gt;             {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum159"&gt; 159:&lt;/span&gt;                 source.ShouldNotBeNull(&lt;span style="color: #006080"&gt;"source"&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum160"&gt; 160:&lt;/span&gt;                 targetType.ShouldNotBeNull(&lt;span style="color: #006080"&gt;"targetType"&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum161"&gt; 161:&lt;/span&gt;                 serializerSettings.ShouldNotBeNull(&lt;span style="color: #006080"&gt;"serializerSettings"&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum162"&gt; 162:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum163"&gt; 163:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(IsDebugEnabled)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum164"&gt; 164:&lt;/span&gt;                 {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum165"&gt; 165:&lt;/span&gt;                     log.Debug(&lt;span style="color: #006080"&gt;"원본 객체를 JSON 포맷으로 직렬화를 수행하고, 대상 수형[{0}]으로 역직렬화를 수행합니다."&lt;/span&gt;, targetType.FullName);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum166"&gt; 166:&lt;/span&gt;                     log.Debug(&lt;span style="color: #006080"&gt;"source=[{0}], targetType=[{1}], serializerSettings=[{2}]"&lt;/span&gt;, source, targetType, serializerSettings);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum167"&gt; 167:&lt;/span&gt;                 }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum168"&gt; 168:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum169"&gt; 169:&lt;/span&gt;                 var jsonText = SerializeAsText(source, serializerSettings);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum170"&gt; 170:&lt;/span&gt;                 target = DeserializeFromText(jsonText, targetType, serializerSettings);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum171"&gt; 171:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum172"&gt; 172:&lt;/span&gt;                 result = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum173"&gt; 173:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum174"&gt; 174:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(IsDebugEnabled)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum175"&gt; 175:&lt;/span&gt;                     log.Debug(&lt;span style="color: #006080"&gt;"원본 객체로부터 대상 객체로 매핑을 수행했습니다. target=[{0}]"&lt;/span&gt;, target);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum176"&gt; 176:&lt;/span&gt;             }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum177"&gt; 177:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;(Exception ex)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum178"&gt; 178:&lt;/span&gt;             {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum179"&gt; 179:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(log.IsWarnEnabled)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum180"&gt; 180:&lt;/span&gt;                 {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum181"&gt; 181:&lt;/span&gt;                     log.Warn(&lt;span style="color: #006080"&gt;"JSON 포맷을 이용한 객체 Mapping 작업에 실패했습니다."&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum182"&gt; 182:&lt;/span&gt;                     log.Warn(ex);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum183"&gt; 183:&lt;/span&gt;                 }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum184"&gt; 184:&lt;/span&gt;             }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum185"&gt; 185:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum186"&gt; 186:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum187"&gt; 187:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f8f8f8; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum188"&gt; 188:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-2935838771123307987?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/2935838771123307987/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=2935838771123307987' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/2935838771123307987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/2935838771123307987'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/newtonsoftjsonnetdll.html' title='Newtonsoft.Json.Net.dll 을 사용하여 직렬화/역직렬화하기'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-4644818516501348251</id><published>2011-10-11T06:12:00.001+09:00</published><updated>2011-10-11T06:12:59.691+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>대용량 Data에 대한 성능 향상 방안</title><content type='html'>&lt;ol&gt; &lt;li&gt; &lt;h3&gt;압축 라이브러리 및 성능 비교&lt;/h3&gt;&lt;/li&gt; &lt;p&gt;비교 사이트 : &lt;a href="http://warp.povusers.org/ArchiverComparison/"&gt;http://warp.povusers.org/ArchiverComparison/&lt;/a&gt; &lt;p&gt;추천 라이브러리 : 7-Zip, bzip2  &lt;p&gt;7-Zip 라이브러리 for C++ : &lt;a href="http://www.7-zip.org/sdk.html"&gt;http://www.7-zip.org/sdk.html&lt;/a&gt; &lt;p&gt;Bzip2 라이브러리 : &lt;a href="http://www.bzip.org/downloads.html"&gt;http://www.bzip.org/downloads.html&lt;/a&gt; (compile 필요) &lt;p&gt;&amp;nbsp; &lt;li&gt; &lt;h3&gt;압축 라이브러리를 이용한 대용량 Data I/O&lt;/h3&gt;&lt;/li&gt; &lt;p&gt;DISK I/O, 메모리, CPU 에서의 Data 처리 속도는 &lt;p&gt;DISK &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; 메모리 &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; CPU 입니다. &lt;p&gt;즉 모든 Data 는 되도록 CPU 에서 처리하면 좋습니다. 다만 CPU는 Data 처리 공간이 제한되므로 되도록 메모리에서 처리할 수 있는 것이 가장 효과적입니다. &lt;p&gt;이에, 대용량 DATA를 DISK &amp;lt;-&amp;gt; 메모리에 읽기/쓰기를 수행할 때, 압축을 통해 Disk 에 저장하고, 읽을 때 압축을 해제하여, Disk IO 작업을 최소화 하게 되면, 프로그램 성능을 상당히 높힐 수 있습니다. &lt;p&gt;&amp;nbsp; &lt;li&gt; &lt;h3&gt;비동기 IO를 사용한다.&lt;/h3&gt;&lt;/li&gt; &lt;p&gt;현재 C++ 용 비동기 IO 라이브러리 또는 비동기 호출 문법이 있는지 모르겠지만, C#이나 Java에서도 제공되므로, 있을 것입니다. &lt;p&gt;예제: &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/536dd521-99f9-4721-b10a-b80cb2147339/"&gt;http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/536dd521-99f9-4721-b10a-b80cb2147339/&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;li&gt; &lt;h3&gt;병렬 프로그래밍 라이브러리를 활용한다.&lt;/h3&gt;&lt;/li&gt; &lt;p&gt;Visual C++ 용 Parallel Program Library (&lt;a href="http://parallelpatternscpp.codeplex.com/"&gt;http://parallelpatternscpp.codeplex.com/&lt;/a&gt;) 를 이용하면, 멀티 코어 CPU에서 동시 작업 및 비동기 작업 (Background Thread 작업) 이 가능해지고, 대용량 Data 처리도 병렬로 가능해 지므로, 성능 향상에 기여합니다. &lt;p&gt;==&amp;gt; 이상적으로는 논리적 CPU 개수가 4개라면, 3~3.5배의 성능향상을 가져올 수 있습니다. &lt;p&gt;참고 사이트 : &lt;a href="http://blogs.msdn.com/b/nativeconcurrency/"&gt;http://blogs.msdn.com/b/nativeconcurrency/&lt;/a&gt;&lt;/p&gt;&lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-4644818516501348251?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/4644818516501348251/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=4644818516501348251' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4644818516501348251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4644818516501348251'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/data.html' title='대용량 Data에 대한 성능 향상 방안'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-6762972404244168832</id><published>2011-10-11T06:07:00.001+09:00</published><updated>2011-10-14T04:10:07.416+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>HashCode 제작 Tool</title><content type='html'>HashCode를 계산하는 메소드를 제공하는 HashTool 클래스입니다.&lt;br /&gt;NHibernate 등 DDD 패턴에서 고유한 HashCode 값 생성이 상당히 중요합니다. 이를 위해 제작한 클래스이고, 현재까지 잘 작동하는 코드입니다.^^&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c#"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Linq.Expressions;&lt;br /&gt;using RCL.LinqExtensions;&lt;br /&gt;&lt;br /&gt;namespace RCL.Core&lt;br /&gt;{&lt;br /&gt;	/// &lt;summary&gt;&lt;br /&gt;	/// HashCode 를 생성해주는 Tool Class 입니다.&lt;br /&gt;	/// &lt;/summary&gt;&lt;br /&gt;	public static class HashTool&lt;br /&gt;	{&lt;br /&gt;		private const int Factor = 31;&lt;br /&gt;		private const int InitValue = 1;&lt;br /&gt;		public const int NullValue = 0;&lt;br /&gt;&lt;br /&gt;		private static readonly int EmptyStringHashCode = string.Empty.GetHashCode();&lt;br /&gt;&lt;br /&gt;		/// &lt;summary&gt;&lt;br /&gt;		/// 지정된 객체들의 HashCode를 계산합니다.&lt;br /&gt;		/// &lt;/summary&gt;&lt;br /&gt;		public static int Compute(object obj)&lt;br /&gt;		{&lt;br /&gt;			return (obj != null) ? obj.GetHashCode() : NullValue;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		/// &lt;summary&gt;&lt;br /&gt;		/// 지정된 객체들의 HashCode를 계산합니다.&lt;br /&gt;		/// &lt;/summary&gt;&lt;br /&gt;		public static int Compute(object obj1, object obj2)&lt;br /&gt;		{&lt;br /&gt;			return Compute(obj1) * Factor + Compute(obj2);&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		/// &lt;summary&gt;&lt;br /&gt;		/// 지정된 객체들의 HashCode를 계산합니다.&lt;br /&gt;		/// &lt;/summary&gt;&lt;br /&gt;		public static int Compute(object obj1, object obj2, object obj3)&lt;br /&gt;		{&lt;br /&gt;			return Compute(obj1, obj2) * Factor + Compute(obj3);&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		/// &lt;summary&gt;&lt;br /&gt;		/// 지정된 객체들의 HashCode를 계산합니다.&lt;br /&gt;		/// &lt;/summary&gt;&lt;br /&gt;		public static int Compute(object obj1, object obj2, object obj3, object obj4)&lt;br /&gt;		{&lt;br /&gt;			return Compute(obj1, obj2, obj3) * Factor + Compute(obj4);&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		/// &lt;summary&gt;&lt;br /&gt;		/// 지정된 객체들의 HashCode를 계산합니다.&lt;br /&gt;		/// &lt;/summary&gt;&lt;br /&gt;		/// &lt;param name="objs"&gt;객체를 입력하세요 (GetHashCode를 넣지 마세요)&lt;/param&gt;&lt;br /&gt;		/// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;		public static int Compute(params object[] objs)&lt;br /&gt;		{&lt;br /&gt;			int hash = NullValue;&lt;br /&gt;&lt;br /&gt;			if(objs != null)&lt;br /&gt;				foreach(var obj in objs)&lt;br /&gt;					hash = hash * Factor + Compute(obj);&lt;br /&gt;&lt;br /&gt;			return hash;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		/// &lt;summary&gt;&lt;br /&gt;		/// 문자열의 HashCode를 반환합니다. null 이거나 빈문자열이면 string.Empty.GetHashCode() 값을 반환합니다. (0은 아닙니다)&lt;br /&gt;		/// &lt;/summary&gt;&lt;br /&gt;		/// &lt;param name="str"&gt;&lt;/param&gt;&lt;br /&gt;		/// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;		public static int CalcHash(this string str)&lt;br /&gt;		{&lt;br /&gt;			return str.IsEmpty() ? EmptyStringHashCode : str.GetHashCode();&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		/// &lt;summary&gt;&lt;br /&gt;		/// 인스턴스의 특정 속성들로부터 HashCode를 생성합니다.&lt;br /&gt;		/// &lt;/summary&gt;&lt;br /&gt;		/// &lt;typeparam name="T"&gt;대상 객체의 수형&lt;/typeparam&gt;&lt;br /&gt;		/// &lt;param name="target"&gt;해시코드를 얻고자하는 대상 객체&lt;/param&gt;&lt;br /&gt;		/// &lt;param name="propertyExprs"&gt;해시코드 조합용 속성들&lt;/param&gt;&lt;br /&gt;		/// &lt;returns&gt;&lt;/returns&gt;&lt;br /&gt;		public static int CalcHash&lt;T&gt;(this T target, params Expression&lt;Func&lt;T, object&gt;&gt;[] propertyExprs)&lt;br /&gt;		{&lt;br /&gt;			if(Equals(target, default(T)))&lt;br /&gt;				return 0;&lt;br /&gt;&lt;br /&gt;#if !SILVERLIGHT&lt;br /&gt;&lt;br /&gt;			if(propertyExprs == null || propertyExprs.Length == 0)&lt;br /&gt;				return target.GetHashCode();&lt;br /&gt;&lt;br /&gt;			var propertyNames = propertyExprs.Select(expr =&gt; expr.Body.FindMemberName()).ToArray();&lt;br /&gt;			var accessor = DynamicAccessorFactory.CreateDynamicAccessor&lt;T&gt;(MapPropertyOptions.Safety);&lt;br /&gt;&lt;br /&gt;			return Compute(propertyNames.Select(name =&gt; accessor.GetPropertyValue(target, name)).ToArray());&lt;br /&gt;#else&lt;br /&gt;			return target.GetHashCode();&lt;br /&gt;#endif&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;HTML 코드에서 글을 써야 해서 좀 문제가 있네요^^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-6762972404244168832?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/6762972404244168832/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=6762972404244168832' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6762972404244168832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6762972404244168832'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2011/10/hashcode-tool.html' title='HashCode 제작 Tool'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-6610383368885195682</id><published>2009-06-04T15:25:00.001+09:00</published><updated>2009-06-04T15:27:12.974+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Interface'/><title type='text'>Interface 설계 - Part 1</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Interface &lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;라는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;게&lt;/span&gt;&lt;span lang="EN-US"&gt; OOP&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;에서&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가장&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;중요한&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;개념인&lt;/span&gt;&lt;span lang="EN-US"&gt; class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;추상화&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;한&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;것이라&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;더욱&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;개념잡기가&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;힘듭니다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;일반적으로&lt;/span&gt;&lt;span lang="EN-US"&gt; interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;라는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;용어는&lt;/span&gt;&lt;span lang="EN-US"&gt; "&lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상이한&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;시스템간의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;계약&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;정보를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;표현하는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;것&lt;/span&gt;&lt;span lang="EN-US"&gt;" &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;이라고&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;정의할&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있습니다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;C#&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;예약어이면서&lt;/span&gt;&lt;span lang="EN-US"&gt;, OOP&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;기본개념으로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;자리잡고&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;있는&lt;/span&gt;&lt;span lang="EN-US"&gt; Interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;형태상으로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;몇&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가지&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;특징이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;있습니다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;1. &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;선언&lt;/span&gt;&lt;span lang="EN-US"&gt;(Declaration)&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;은&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;있고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;정의&lt;/span&gt;&lt;span lang="EN-US"&gt;(Definition)&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;은&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;없다&lt;/span&gt;&lt;span lang="EN-US"&gt;. (Abstract class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;도&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;같은&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의미&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;2. &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;접근자는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;쓸&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;없고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;모두&lt;/span&gt;&lt;span lang="EN-US"&gt; public &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;이다&lt;/span&gt;&lt;span lang="EN-US"&gt;. (&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;계약사항이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;투명해야&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;하고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;명확해야&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;하므로&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;3. &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;다중&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상속이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가능하다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;특징은&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;더&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있겠지만&lt;/span&gt;&lt;span lang="EN-US"&gt;... &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;생각나는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;게&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;정도이고&lt;/span&gt;&lt;span lang="EN-US"&gt;...&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Interface&lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;사용해야&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;하는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;이유에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;대해서&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;몇&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가지&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;서술해보자&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:38.0pt;mso-para-margin-left:0gd; text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span lang="EN-US" style="mso-fareast-font-family:Corbel;mso-fareast-theme-font:minor-latin; mso-bidi-font-family:Corbel;mso-bidi-theme-font:minor-latin"&gt;&lt;span style="mso-list:Ignore"&gt;1.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;외부&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;시스템에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;제공할&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;서비스&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;또는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;객체&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;정보를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;직접적인&lt;/span&gt;&lt;span lang="EN-US"&gt; class&lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;아닌&lt;/span&gt;&lt;span lang="EN-US"&gt; "&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;선언&lt;/span&gt;&lt;span lang="EN-US"&gt;" &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;만을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;제공한다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:38.0pt;mso-para-margin-left:0gd; text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span lang="EN-US" style="mso-fareast-font-family:Corbel;mso-fareast-theme-font:minor-latin; mso-bidi-font-family:Corbel;mso-bidi-theme-font:minor-latin"&gt;&lt;span style="mso-list:Ignore"&gt;2.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;다중&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상속에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;따른&lt;/span&gt;&lt;span lang="EN-US"&gt; class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;표현을&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;여러&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가지로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;가능케&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;한다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:38.0pt;mso-para-margin-left:0gd; text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span lang="EN-US" style="mso-fareast-font-family:Corbel;mso-fareast-theme-font:minor-latin; mso-bidi-font-family:Corbel;mso-bidi-theme-font:minor-latin"&gt;&lt;span style="mso-list:Ignore"&gt;3.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의도하지&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;않은&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;속성&lt;/span&gt;&lt;span lang="EN-US"&gt;/&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;메소드&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;공개를&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;막기&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;위해&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:38.0pt;mso-para-margin-left:0gd; text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span lang="EN-US" style="mso-fareast-font-family:Corbel;mso-fareast-theme-font:minor-latin; mso-bidi-font-family:Corbel;mso-bidi-theme-font:minor-latin"&gt;&lt;span style="mso-list:Ignore"&gt;4.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;실제&lt;/span&gt;&lt;span lang="EN-US"&gt; object &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt;&lt;span lang="EN-US"&gt; class &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;정보를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;제공하고&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;싶지&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;않을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;때&lt;/span&gt;&lt;span lang="EN-US"&gt; ( &lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;또는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;명확히&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;하고&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;싶을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;때&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:38.0pt;mso-para-margin-left:0gd; text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span lang="EN-US" style="mso-fareast-font-family:Corbel;mso-fareast-theme-font:minor-latin; mso-bidi-font-family:Corbel;mso-bidi-theme-font:minor-latin"&gt;&lt;span style="mso-list:Ignore"&gt;5.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;OOP&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;상속에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;억매이지&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;않고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;구현할&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있도록&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;개방성을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;제공할&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;때&lt;/span&gt;&lt;span lang="EN-US"&gt;...&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="tab-stops:184.0pt"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                                                                                  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:11.0pt"&gt;Interface &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-size:12.0pt;mso-bidi-font-size: 11.0pt;font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;설계시의&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-size:12.0pt;mso-bidi-font-size: 11.0pt"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-size:12.0pt;mso-bidi-font-size:11.0pt;font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;주의점&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:11.0pt"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="EN-US"&gt;1. &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;속성&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;메소드의&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;변화가능성이&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;많다면&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;아예&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;사용하지&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;마라&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:20.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US"&gt;interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;변경이&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;일어난다면&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;아주&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;위험한&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상황이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;올&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;있다&lt;/span&gt;&lt;span lang="EN-US"&gt;. (OOP&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;와&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;마찮가지로&lt;/span&gt;&lt;span lang="EN-US"&gt;) &lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;계약이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;변경된다는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;뜻은&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;모든&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;구현이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;변경되어야&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;함을&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;뜻하고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;이는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;전체적인&lt;/span&gt;&lt;span lang="EN-US"&gt; Class &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;상속&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;체계에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;위험을&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;줄&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;있다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;즉&lt;/span&gt;&lt;span lang="EN-US"&gt; Interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;라는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;것이&lt;/span&gt;&lt;span lang="EN-US"&gt; OOP&lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt;&lt;span lang="EN-US"&gt; Abstract Class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;와&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;같이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상속&lt;/span&gt;&lt;span lang="EN-US"&gt;(&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;엄밀히&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;구현&lt;/span&gt;&lt;span lang="EN-US"&gt;)&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;원형이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;되는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;것이므로&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;span style="mso-tab-count:1"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;원형이&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;변경되면&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;자손들도&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;변경이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;일어나야&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;한다는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;뜻인데&lt;/span&gt;&lt;span lang="EN-US"&gt;, interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;경우&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;전혀&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;다른&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;제품으로의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;확장도&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;지원할&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있으므로&lt;/span&gt;&lt;span lang="EN-US"&gt;, Interface &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;설계&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;시&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;아주&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;조심해야&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;한다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="EN-US"&gt;2. &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;너무&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;많은&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;속성&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;메소드를&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;노출시키지&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;마라&lt;/span&gt;&lt;span lang="EN-US"&gt; (5&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;개&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;이하&lt;/span&gt;&lt;span lang="EN-US"&gt;) - &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;인터페이스의&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;성격이&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;명확해야&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;한다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;너무&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;많은&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;정의가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있다는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;것은&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;계약이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;다른&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;뜻으로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;해석될&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;수도&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;있고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;명확한&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;의미를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;이해하거나&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;구현하는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;데&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;방해가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;될&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있다&lt;/span&gt;&lt;span lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;보통의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;경우는&lt;/span&gt;&lt;span lang="EN-US"&gt; 5&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;개&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;이하로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;하고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;더&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;많아질&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;경우에는&lt;/span&gt;&lt;span lang="EN-US"&gt; Interface &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상속으로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;해결해야&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;한다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;예&lt;/span&gt;&lt;span lang="EN-US"&gt;: &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;public interface IVertex&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:2"&gt;                                   &lt;/span&gt;Guid Id {get;set;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:2"&gt;                                   &lt;/span&gt;IList&lt;ilink&gt; InLinks { get; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:2"&gt;                                   &lt;/span&gt;IList&lt;ilink&gt; OutLinks { get; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;public interface INamedVertex : IVertex&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:2"&gt;                                   &lt;/span&gt;string Name { get; set;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:0cm;mso-para-margin-left:0gd"&gt;&lt;span lang="EN-US" style="color:#002060"&gt;&lt;span style="mso-tab-count:1"&gt;                  &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="EN-US"&gt;3. Interface&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt;&lt;span lang="EN-US"&gt; name&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;은&lt;/span&gt;&lt;span lang="EN-US"&gt; xxx-able, xxx-er, xxx-tion &lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;등&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;실제&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;복합&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;기능을&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;하는&lt;/span&gt;&lt;span lang="EN-US"&gt; class&lt;/span&gt;&lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;와는&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;달리&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;단품의&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;성격을&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;나타내도록&lt;/span&gt; &lt;/b&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;한다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;Interface &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;명명시에는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;몇가지&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;방식이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;있는데&lt;/span&gt;&lt;span lang="EN-US"&gt;, Interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;표현하고자&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;하는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;것에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;따라&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;몇가지&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;형태로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;사용할&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;-able (&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;예&lt;/span&gt;&lt;span lang="EN-US"&gt;: ISerializable, ICloneable &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;등&lt;/span&gt;&lt;span lang="EN-US"&gt;) &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;동작할&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;있는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;메소드가&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있음을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;나타낸다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;-er&lt;span style="mso-spacerun:yes"&gt;    &lt;/span&gt;(&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;예&lt;/span&gt;&lt;span lang="EN-US"&gt; : ISerializer, IComposer, ICompressor, IFormatter, IStringProvider &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;등&lt;/span&gt;&lt;span lang="EN-US"&gt;) &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;동작&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;자체에&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의미가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;경우&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;-tion &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;또는&lt;/span&gt;&lt;span lang="EN-US"&gt; Class &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;원형&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;이름&lt;/span&gt;&lt;span lang="EN-US"&gt; (&lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;예&lt;/span&gt;&lt;span lang="EN-US"&gt;: IUserType, IGraph, IProcess &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;등&lt;/span&gt;&lt;span lang="EN-US"&gt;) &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;객체의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;가장&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;추상화&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;단계를&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;표현하는&lt;/span&gt;&lt;span lang="EN-US"&gt; Interface&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;인터페이스를&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;정의한&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;경우&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;인터페이스를&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;구현하는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;방식에는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;크게&lt;/span&gt;&lt;span lang="EN-US"&gt; 2&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가지로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;나뉜다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:38.0pt;mso-para-margin-left:0gd; text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span lang="EN-US" style="mso-fareast-font-family:Corbel;mso-fareast-theme-font:minor-latin; mso-bidi-font-family:Corbel;mso-bidi-theme-font:minor-latin"&gt;&lt;span style="mso-list:Ignore"&gt;1.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;인터페이스를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;직접&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;구현&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="margin-left:38.0pt;mso-para-margin-left:0gd; text-indent:-18.0pt;mso-list:l0 level1 lfo2"&gt;&lt;span lang="EN-US" style="mso-fareast-font-family:Corbel;mso-fareast-theme-font:minor-latin; mso-bidi-font-family:Corbel;mso-bidi-theme-font:minor-latin"&gt;&lt;span style="mso-list:Ignore"&gt;2.&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;클래스는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;보통&lt;/span&gt;&lt;span lang="EN-US"&gt; Abstract class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;로&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;기본&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;동작을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;표현하고&lt;/span&gt;&lt;span lang="EN-US"&gt;, Abstract class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;상속&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;받아&lt;/span&gt;&lt;span lang="EN-US"&gt;, Concrete class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;구현을&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;하는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;방식&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;직접&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;구현하는&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;방식에는&lt;/span&gt;&lt;span lang="EN-US"&gt; ICompressor &lt;- GZipCompressor, DeflateCompressor, SevenZipCompressor &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;등과&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;같이&lt;/span&gt;&lt;span lang="EN-US"&gt; Algorithm &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;자체가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상이하고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;추상화할&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;정보가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;없을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;경우이다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;방식은&lt;/span&gt;&lt;span lang="EN-US"&gt; Abstract class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;의한&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상속의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;사슬에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;얽매이지&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;않기&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;때문에&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;외부&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;개발자가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;제공되는&lt;/span&gt;&lt;span lang="EN-US"&gt; Interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;다양한&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;구현이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가능토록&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;한다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Abstract class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;정의한&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;후&lt;/span&gt;&lt;span lang="EN-US"&gt;, Concrete class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;상속하는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;경우는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;폐쇄적인&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;방식으로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;유용하다&lt;/span&gt;&lt;span lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;즉&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;외부에는&lt;/span&gt;&lt;span lang="EN-US"&gt; interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;로&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;노출하여&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;다양한&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;구현이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가능토록&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;제공은&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;하지만&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;내부에서는&lt;/span&gt;&lt;span lang="EN-US"&gt; OOP &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상속&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;및&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;다형성을&lt;/span&gt; &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;계속&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가져가겠다는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;의도인&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;것이다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;보통의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;경우&lt;/span&gt;&lt;span lang="EN-US"&gt; 2&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;번이&lt;/span&gt;&lt;span lang="EN-US"&gt; 1&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;번의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;모든&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;경우를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;포함하기&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;때문에&lt;/span&gt;&lt;span lang="EN-US"&gt; 2&lt;/span&gt;&lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;번&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;방식이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;주를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;이룬다&lt;/span&gt;&lt;span lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;패턴으로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;말한다면&lt;/span&gt;&lt;span lang="EN-US"&gt; Abstract Factory Pattern&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;이&lt;/span&gt; &lt;span lang="EN-US"&gt;2&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;번&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;방식을&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;사용한다고&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;보면&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;된다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;마지막으로&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;인터페이스를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;구현하지&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;않고&lt;/span&gt;&lt;span lang="EN-US"&gt;, OOP &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;기능만을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;이용하여&lt;/span&gt;&lt;span lang="EN-US"&gt; Abstract class, Concrete class &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;상속&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;체계만&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;정의하여&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;쓰는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;경우가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;있는데&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;이는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;인터페이스가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;없으므로&lt;/span&gt;&lt;span lang="EN-US"&gt; Abstract class&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;외부에&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;노출&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;시켜서&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;사용할&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있다&lt;/span&gt;&lt;span lang="EN-US"&gt;. &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;다만&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;문제는&lt;/span&gt;&lt;span lang="EN-US"&gt; C#, Java&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;의&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;경우&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;다중상속이&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;허용되지&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;않기&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;때문에&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;다양한&lt;/span&gt;&lt;span lang="EN-US"&gt; Interface &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;다중상속&lt;/span&gt;&lt;span lang="EN-US"&gt; (&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;결합&lt;/span&gt;&lt;span lang="EN-US"&gt;) &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;또는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;분리로&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;표현하고자&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;한다면&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;문제가&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;될&lt;/span&gt; &lt;span style="font-family: &amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin; mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;수&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;있다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;다음번&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;글에서는&lt;/span&gt;&lt;span lang="EN-US"&gt; RCL, RealAdmin&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;에서&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;사용한&lt;/span&gt;&lt;span lang="EN-US"&gt; Interface&lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;를&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;가지고&lt;/span&gt;&lt;span lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel;mso-ascii-theme-font: minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;실전에서&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:Corbel; mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L;mso-fareast-theme-font: minor-fareast"&gt;사용하는&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family: Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:HY엽서L; mso-fareast-theme-font:minor-fareast"&gt;방식을&lt;/span&gt; &lt;span style="font-family:&amp;quot;HY엽서L&amp;quot;,&amp;quot;serif&amp;quot;; mso-ascii-font-family:Corbel;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: HY엽서L;mso-fareast-theme-font:minor-fareast"&gt;설명하겠습니다&lt;/span&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-6610383368885195682?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/6610383368885195682/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=6610383368885195682' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6610383368885195682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6610383368885195682'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/06/interface-part-1.html' title='Interface 설계 - Part 1'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-4303789193598747806</id><published>2009-04-25T21:57:00.003+09:00</published><updated>2009-04-25T22:05:34.739+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='Castle'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><title type='text'>ASP.NET MVC 와 Castle Windsor</title><content type='html'>&lt;div&gt;ASP.NET MVC 의 Controller를 Castle Windsor (IoC) 컨테이너를 활용하여 확장할 수 있다는 예제&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://blog.andreloker.de/post/2009/03/28/ASPNET-MVC-with-Windsor-programmatic-controller-registration.aspx"&gt;http://blog.andreloker.de/post/2009/03/28/ASPNET-MVC-with-Windsor-programmatic-controller-registration.aspx&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;근데... 별로... Windsor를 잘 못하는거 같네...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;내가 만든 IoC, IoCHttpApplication, IoCHttpModule 을 사용하는 것이 더 낳을 듯...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-4303789193598747806?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/4303789193598747806/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=4303789193598747806' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4303789193598747806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4303789193598747806'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/04/aspnet-mvc-castle-windsor.html' title='ASP.NET MVC 와 Castle Windsor'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-5919960995293930022</id><published>2009-04-09T21:47:00.006+09:00</published><updated>2009-04-09T21:58:50.128+09:00</updated><title type='text'>WPF 용 Library</title><content type='html'>&lt;a href="http://fluidkit.codeplex.com/"&gt;http://fluidkit.codeplex.com/&lt;/a&gt; &lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px; "&gt;This is a WPF library containing a powerhouse of controls, frameworks, helpers, tools, etc. for productive WPF development.&lt;br /&gt;If you have ever heard of Drag and Drop with Attached properties, ElementFlow, GlassWindow, this is the library that will contain all such goodies. &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;a href="http://blacklight.codeplex.com/"&gt;http://blacklight.codeplex.com/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;Blacklight is a UX focused code sharing project. Microsoft has released a bunch of technologies that allow designers and developers to work closely together to make beautiful software. This project is a collection of controls, samples, visual assets and ideas that has been put together by User Experience designers and developers to both show you what the technology is capable of (from a UX point of view), and give you code and samples that you can use in your own projects, completely free of charge (see the License tab above). Check out the showcase to see what is currently available...&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;a href="http://avaloncontrolslib.codeplex.com/"&gt;http://avaloncontrolslib.codeplex.com/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;AvalonControlsLibrary is a set of WPF controls that can help WPF developers while developing applications. The library includes a WPF Date picker, Time Picker and loads of other stuff...&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;a href="http://odyssey.codeplex.com/"&gt;http://odyssey.codeplex.com/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;WPF Controls, RibbonBar, BreadcrumbBar, ExplorerBar, OutlookBar&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-5919960995293930022?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/5919960995293930022/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=5919960995293930022' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5919960995293930022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5919960995293930022'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/04/wpf-library.html' title='WPF 용 Library'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-2354246199628413371</id><published>2009-04-09T21:43:00.001+09:00</published><updated>2009-04-09T21:45:38.649+09:00</updated><title type='text'>WPF용 Dock Panel</title><content type='html'>&lt;a href="http://avalondock.codeplex.com/"&gt;http://avalondock.codeplex.com/&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-2354246199628413371?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/2354246199628413371/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=2354246199628413371' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/2354246199628413371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/2354246199628413371'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/04/wpf-dock-panel.html' title='WPF용 Dock Panel'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-6960092994698751328</id><published>2009-04-07T22:43:00.001+09:00</published><updated>2009-04-07T22:43:40.808+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>ASP.NET MVC with NHibernate</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://code.google.com/p/sharp-architecture/"&gt;http://code.google.com/p/sharp-architecture/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-6960092994698751328?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/6960092994698751328/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=6960092994698751328' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6960092994698751328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6960092994698751328'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/04/aspnet-mvc-with-nhibernate.html' title='ASP.NET MVC with NHibernate'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-4120750134716800501</id><published>2009-04-05T23:53:00.000+09:00</published><updated>2009-04-05T23:54:10.462+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Castle'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'></title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: collapse; color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px; "&gt;https://Catharsis.svn.codeplex.com/svn&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: rgb(48, 51, 45); font-family: 'Segoe UI'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; "&gt;Based on Microsoft .NET 3.5 SP1 + ASP.NET MVC (RC1)&lt;br /&gt;NHibernate 2.0.1&lt;br /&gt;&lt;br /&gt;Nothing else needed, All other stuff is provided directly by Catharsis framework and Catharsis guidance. The core libraries are named ProjectBase to allow smoother introduction to your organization. Catharsis is Open Source.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-4120750134716800501?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/4120750134716800501/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=4120750134716800501' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4120750134716800501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/4120750134716800501'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/04/httpscatharsis.html' title=''/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-5670653458463826382</id><published>2009-03-28T21:18:00.000+09:00</published><updated>2009-03-28T21:19:24.936+09:00</updated><title type='text'>WPF Converters</title><content type='html'>WPF Converter 에 대해 잘 설명한 글입니다.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://wpfconverters.codeplex.com/Wiki/View.aspx?title=User%20Documentation&amp;amp;referringTitle=Home"&gt;http://wpfconverters.codeplex.com/Wiki/View.aspx?title=User%20Documentation&amp;amp;referringTitle=Home&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-5670653458463826382?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/5670653458463826382/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=5670653458463826382' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5670653458463826382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5670653458463826382'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/03/wpf-converters.html' title='WPF Converters'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-5183110804376401403</id><published>2009-03-28T21:05:00.000+09:00</published><updated>2009-03-28T21:05:49.486+09:00</updated><title type='text'>Kent Boogaart: View Models: POCOs versus DependencyObjects</title><content type='html'>&lt;a href="http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html"&gt;Kent Boogaart: View Models: POCOs versus DependencyObjects&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-5183110804376401403?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html' title='Kent Boogaart: View Models: POCOs versus DependencyObjects'/><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/5183110804376401403/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=5183110804376401403' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5183110804376401403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5183110804376401403'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/03/kent-boogaart-view-models-pocos-versus.html' title='Kent Boogaart: View Models: POCOs versus DependencyObjects'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-8522491488342326696</id><published>2009-03-21T17:49:00.003+09:00</published><updated>2009-03-21T18:04:18.305+09:00</updated><title type='text'>NHibernate.Linq + ADO.NET DataService</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: small;"&gt;현재 ADO.NET DataServices 가 계속 개발중이라 아직 어떻지는 모르겠지만...&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Silverlight를 사용하려면 ADO.NET DataService 를 이용하는 것이 가장 효율적인 방법인 거 같습니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;알다시피 ADO.NET DataService는 LINQ to SQL, Entity Framework을 한계층 싸서 WCF로 expose해 주는 기능을 합니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;위의 얘기는 Association이 있는 Persistence graph를 알아서 expose 해준다는 얘기지요...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/bb931106.aspx"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://msdn.microsoft.com/en-us/data/bb931106.aspx&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/library/cc907912(en-us).aspx"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://msdn.microsoft.com/ko-kr/library/cc907912(en-us).aspx&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;등을 보면 잘 나와 있습니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;다만 현재 NHibernate 2.0.1 GA 까지는 NHibernate.Linq 를 공식적으로 지원하지 않기 때문에&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;그림에 떡입니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;현재 NHibernate.Linq가 NHibernate Contrib 프로젝트에서 개발 중이기는 합니다만... NHibernate 2.1.0 에 맞춰서 제공될 예정이라고는 하지만... MS가 또 어떤 장난을 칠지...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://wildermuth.com/2008/07/21/NHibernate_LINQ_with_ADO_NET_Data_Services"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://wildermuth.com/2008/07/21/NHibernate_LINQ_with_ADO_NET_Data_Services&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;위 예제는 NHiberate, NHibernate.Linq, ADO.DataService, Silverlihgt를 이용한 예제입니다만&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;아쉽게도 NH 2.1.0 Alpha 버전에서는 작동하지 않습니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ADO.NET DataServices의 핵심 클래스인 DataService&lt;/span&gt;&lt;t&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; 가 바뀌어서 T 가 Object 가 System.Data.Linq.DataContext 이거나 System.Data.Objects.ObjectContext 이어야 하네요...&lt;/span&gt;&lt;/t&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;NHibernate.Linq도 많이 바뀌어야 가능할 듯 싶습니다.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-8522491488342326696?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/8522491488342326696/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=8522491488342326696' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/8522491488342326696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/8522491488342326696'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/03/nhibernatelinq-adonet-dataservice.html' title='NHibernate.Linq + ADO.NET DataService'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-2064821217679148956</id><published>2009-03-21T11:09:00.002+09:00</published><updated>2009-03-21T11:11:52.402+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SubQueries'/><category scheme='http://www.blogger.com/atom/ns#' term='Criteria'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>NHibernate 2.1.0 Alpha...</title><content type='html'>NHibernate 2.1.0 Alpha 1이 Release 되었네요...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;svn에서는 Alpha2가 진행중이구요...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;많은 기능이 추가되고, Upgrade되었습니다.&lt;/div&gt;&lt;div&gt;다만... alpha2는 아직 버그가 많습니다. 특히 SubQueries 쪽은 검토가 아직 안되었나 봅니다....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;아직까지는 2.0.1 GA가 가장 안정적인 것 같습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;물론 아주 복잡한 query가 아닌 이상에는 2.1.0 도 쓸만합니다.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-2064821217679148956?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/2064821217679148956/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=2064821217679148956' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/2064821217679148956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/2064821217679148956'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/03/nhibernate-210-alpha.html' title='NHibernate 2.1.0 Alpha...'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-8328882824978130145</id><published>2009-03-20T21:08:00.004+09:00</published><updated>2009-03-20T21:21:57.957+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Role'/><category scheme='http://www.blogger.com/atom/ns#' term='Access Management'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>Role, Group &amp; Members</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;권한 관리부분에서 가장 큰 부분은 Role 에 속한 Actor에 대한 구분입니다.&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;Application에서 Role은 크게 두가지로 나뉩니다. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;1. 시스템에서 미리 정의한 System Role&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;2. 시스템 운영에 따른 실행 산출물에 대한 Role (Instance Role)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;1번에 해당하는 것이 Administrator, Users, Guest, Process Modeler User 등이 될 것이고,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;2번에 해당하는 것이 Process Owner, Project Managers - 둘 다 특정 Resource에 대해 관련있는 Role입니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;1번은 유한한 갯수 (100개 미만),&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;2번은 시스템 운영에 따라 100만개도 생길 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;권한 관리부분에서, 특정 리소스에 대한 접근 허용 여부를 검사하기 위해서는 위의 두가지를&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;나누어서 검사하는 것이 좋습니다. (Instance Role 이 너무 많기 때문에)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;우선 접근 검사를 하고자 할 때의 시나리오를 검토하면&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;1. 접근 대상이 Application의 정적인 Resource라면 System Role 만 가지고 검사하면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;2. 접근 대상이 동적인 Instance Resource라면 System Role로 먼저 검사하고,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;    다음으로 Instance Resource와 관련 있는 Role에 Actor가 소속되어 있는지만 검사하면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;두 가지를 한꺼번에 할 경우에는 상당히 많은 량의 레코드를 검사해야 하지만,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;위와 같이 두 단계로 나누게 되면 검사할 양이 상당히 줄어들게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;다만 Instance Resource와 Instance Role 의 Association을 관리해야 하는 기능을 추가해야 하지만,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;보통 Role name에 "/Resource/Manager", "/Resource/User" 등으로 이름을 사용하고, &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande';"&gt;관련 Instance의 Natural Key를 Association 하면, 레코드 수도 줄고, 상당한 량의 작업도 감소 시킬 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-8328882824978130145?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/8328882824978130145/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=8328882824978130145' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/8328882824978130145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/8328882824978130145'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/03/role-group-members.html' title='Role, Group &amp; Members'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-8400688805050702878</id><published>2009-03-08T19:35:00.003+09:00</published><updated>2009-03-08T19:42:10.280+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Fluent'/><category scheme='http://www.blogger.com/atom/ns#' term='Mapping'/><title type='text'>Fluent NHibernate</title><content type='html'>&lt;span class="Apple-style-span"  style="font-size:small;"&gt;NHibernate xml mapping 파일 만들기가 힘들거나, 어렵나요?&lt;br /&gt;아니면 직관적이지 않나요?&lt;br /&gt;&lt;br /&gt;두가지 방법이 있습니다. &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;1. Castle Project의 &lt;/span&gt;&lt;a href="http://www.castleproject.org/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ActiveRecord&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; 를 이용해&lt;br /&gt;매핑정보를 Attribute 로 선언하는 DomainModel을 만든다.&lt;br /&gt;2. &lt;/span&gt;&lt;a href="http://fluentnhibernate.org/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Fluent NHibernate&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; 을 이용하여 Mapping 작업을 Class로 구현한다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;요즘 최신 추세는 Fluent NHibernate인거 같습니다만... 개인 취향의 문제인거 같네요.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;어쨌든 mapping 설정 작업 자체가 그리 만만한 것이 아니기에 이런 다양한 시도가 이루어지는 것이겠죠.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-8400688805050702878?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/8400688805050702878/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=8400688805050702878' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/8400688805050702878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/8400688805050702878'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/03/fluent-nhibernate.html' title='Fluent NHibernate'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-654450062377627554</id><published>2009-03-08T19:32:00.002+09:00</published><updated>2009-03-08T19:35:18.787+09:00</updated><title type='text'>NHibernate.Search로 작업하기</title><content type='html'>NHibernate, Lucene.NET, NHibernate.Search를 이용해서 Web Application Contents 에 대해 Full Text 검색 기능을...&lt;br /&gt;&lt;br /&gt;Lucene의 highlight 기능까지 한다면 더 좋겠네...&lt;br /&gt;&lt;br /&gt;내일부터 NHibernate.Search도 추가해 봐야겠네...&lt;br /&gt;&lt;br /&gt;RCL.Data.NH 용 예제 만들때, 추가 기능으로 넣어봐야 겠다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-654450062377627554?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/654450062377627554/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=654450062377627554' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/654450062377627554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/654450062377627554'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/03/nhibernatesearch.html' title='NHibernate.Search로 작업하기'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-6159685856179909161</id><published>2009-03-01T23:25:00.000+09:00</published><updated>2009-03-01T23:27:07.862+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Indices'/><category scheme='http://www.blogger.com/atom/ns#' term='Criteria'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='HQL'/><category scheme='http://www.blogger.com/atom/ns#' term='elements'/><title type='text'>NHibernate elements(), indices() for IDictionary</title><content type='html'>특정 엔티티에 Map으로 Composite Element가 연결되어 있을 때&lt;br /&gt;예를 들어, 엔티티에 메타데이타 정보가 연결되어 있을 때 다음과 같이 사용합니다.&lt;br /&gt;&lt;br /&gt;enterprise.Metadata["key"] = "value";&lt;br /&gt;&lt;br /&gt;hbm에서는 map 이고, c#에서는 IDictionary 또는 IDictionary&lt;TKey, TValue&gt; 로 표현합니다.&lt;br /&gt;&lt;br /&gt;이때 특정 메타데이타를 가진 모든 엔티티를 조회하기 기능이 필요할 때가 있습니다.&lt;br /&gt;&lt;br /&gt;메타데이타 값을 얻는 것은 조인으로 해결하면 되므로 매우 쉽습니다.&lt;br /&gt;&lt;br /&gt;from Enterprise ent join ent.MetadataTable meta where meta.Value = :value &lt;br /&gt;&lt;br /&gt;를 사용합니다.&lt;br /&gt;&lt;br /&gt;그럼 특정 메타데이타 키를 가진 엔티티를 구하는 방법은? .... 이거 해결하느라 하루가 걸렸네요...&lt;br /&gt;&lt;br /&gt;index나 key 에 해당하는 예약어가 있는 줄 알았는데 복수로 indices 라고 있네요... 쩝...&lt;br /&gt;&lt;br /&gt;from Enterprise ent where :key in indices(ent.MetataTable) &lt;br /&gt;&lt;br /&gt;이라고 하면 됩니다.&lt;br /&gt;&lt;br /&gt;특정 키와 값을 모두 찾고 싶다면&lt;br /&gt;&lt;br /&gt;from Enterprise ent where :meta in elements(ent.MetaTable)&lt;br /&gt;&lt;br /&gt;라고 하면 됩니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-6159685856179909161?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/6159685856179909161/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=6159685856179909161' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6159685856179909161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6159685856179909161'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2009/03/nhibernate-elements-indices-for.html' title='NHibernate elements(), indices() for IDictionary'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-6414469667043287944</id><published>2008-07-11T13:46:00.000+09:00</published><updated>2008-07-12T10:45:24.632+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository'/><category scheme='http://www.blogger.com/atom/ns#' term='Castle'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='RealAdmin'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>NHibernate, Castle.NET을 이용한 Service 만들기</title><content type='html'>NHibernate의 Entity별 Data Access Object (또는 Repository)를 제작하는 것은 상당한 노력이 필요하다.&lt;br /&gt;더 좋은 방법은 UseCase 별로 그룹을 정해서 Facade 패턴을 이용하여 Repository 수를 줄이게 되면 좋다. 그럼 어떻게 하는게 좋은가?&lt;br /&gt;&lt;br /&gt;Generic을 이용하여 IRepository&lt;tentity&gt; 와 Repository&lt;tentity&gt; 하나만 만들면, Entity의 수에 상관없이 사용할 수 있고, UseCase 별로 그룹핑해서 DataService 를 제작하면 Busiess Layer에서 효과적으로 작업량을 줄이고, 유연성을 확보할 수 있습니다.&lt;br /&gt;&lt;br /&gt;또한 Busiess Logic 변경에 따른 유연성 확보를 위해 Castle의 IoC 기능을 이용하면, 전체 틀이 변경되지 않는 한, 환경설정에 따른 다른 Logic을 적용할 수 있습니다.&lt;br /&gt;&lt;br /&gt;또한 Decorator Pattern을 이용하게 되면, 기존 작업에 Decoration 작업을 덪 붙일 수도 있습니다.&lt;br /&gt;&lt;br /&gt;RCL.Data에서 이 모든 것을 가능하게 했고, 이를 바탕으로 만들어진 RealAdmin 제품이 있습니다.&lt;br /&gt;&lt;br /&gt;향후 리얼웹 제품은 모두 위의 두 라이브러리를 이용하여 더욱 확장성과 유연성을 가진 제품으로 Upgrade될 것입니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-6414469667043287944?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/6414469667043287944/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=6414469667043287944' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6414469667043287944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/6414469667043287944'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2008/07/nhibernate-castlenet-service.html' title='NHibernate, Castle.NET을 이용한 Service 만들기'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-5871549074366167929</id><published>2008-07-11T10:34:00.000+09:00</published><updated>2008-07-11T10:36:22.405+09:00</updated><title type='text'>NHibernate 2.0 Beta 출시</title><content type='html'>아직 완벽하지는 않지만 NHibernate 2.0 BETA가 나왔습니다.&lt;br /&gt;그런대로 쓸만합니다. 속도도 빨라졌고... 다른 기능들도 많아졌습니다.&lt;br /&gt;&lt;br /&gt;LINQ to Entities 와 경쟁이 되겠네요...&lt;br /&gt;&lt;br /&gt;얼른 NHibernate.LINQ 도 Rlease 되기를 바라면서...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-5871549074366167929?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/5871549074366167929/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=5871549074366167929' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5871549074366167929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/5871549074366167929'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2008/07/nhibernate-20-beta.html' title='NHibernate 2.0 Beta 출시'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6071494140690317675.post-9017255746546719959</id><published>2007-01-01T22:02:00.000+09:00</published><updated>2007-01-01T22:09:31.372+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='첫글'/><category scheme='http://www.blogger.com/atom/ns#' term='인사'/><title type='text'>첫 글입니다.</title><content type='html'>구글에 첨으로 블로그를 만들었습니다.&lt;br /&gt;&lt;br /&gt;여기에 정착해야 할까요? ㅎㅎ&lt;br /&gt;&lt;br /&gt;여기저기 blog 형식으로 많이 올려 놓아서 한데 모아야겠네요.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6071494140690317675-9017255746546719959?l=debop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://debop.blogspot.com/feeds/9017255746546719959/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6071494140690317675&amp;postID=9017255746546719959' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/9017255746546719959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6071494140690317675/posts/default/9017255746546719959'/><link rel='alternate' type='text/html' href='http://debop.blogspot.com/2007/01/blog-post.html' title='첫 글입니다.'/><author><name>디밥</name><uri>http://www.blogger.com/profile/04706067836785275670</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
