<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/style/rss/style.xsl" type="text/xsl" media="screen"?>
<rss version="2.0">
	<channel>
		<title>IT Governance</title>
		<link>http://itgs.tistory.com/</link>
		<description>From Code to IT Governance
by TeddyLee</description>
		<language>ko</language>
		<pubDate>Fri, 21 Sep 2007 16:35:05 +0900</pubDate>
		<generator>Tistory 1.1</generator>
		<item>
			<title>소프트웨어 공학 관련 자료</title>
			<link>http://itgs.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-%EA%B4%80%EB%A0%A8-%EC%9E%90%EB%A3%8C</link>
			<description>&lt;p&gt;&lt;a title=&quot;http://www.cs.toronto.edu/~sme/&quot; href=&quot;http://www.cs.toronto.edu/~sme/&quot;&gt;http://www.cs.toronto.edu/~sme/&lt;/a&gt;&lt;/p&gt;</description>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/145</guid>
			<comments>http://itgs.tistory.com/entry/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99-%EA%B4%80%EB%A0%A8-%EC%9E%90%EB%A3%8C#entry145comment</comments>
			<pubDate>Fri, 21 Sep 2007 16:34:55 +0900</pubDate>
		</item>
		<item>
			<title>PDCA - Plan Do Check Act</title>
			<link>http://itgs.tistory.com/entry/PDCA-Plan-Do-Check-Act</link>
			<description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Plan Do Check Act&lt;br&gt;PDCA ^^  &lt;p&gt;&lt;a href=&quot;http://www.soodon.net/131&quot;&gt;http://www.soodon.net/131&lt;/a&gt; &lt;p&gt;&lt;a href=&quot;http://www.12manage.com/methods_demingcycle.html&quot;&gt;http://www.12manage.com/methods_demingcycle.html&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.12manage.com/methods_venkatraman_strategic_alignment.html&quot;&gt;http://www.12manage.com/methods_venkatraman_strategic_alignment.html&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.12manage.com/index_expert.html&quot;&gt;http://www.12manage.com/index_expert.html&lt;/a&gt;&amp;nbsp;==&amp;gt; 아주좋아써&lt;br&gt;&lt;a href=&quot;http://www.soodon.net/rss&quot;&gt;http://www.soodon.net/rss&lt;/a&gt;</description>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/144</guid>
			<comments>http://itgs.tistory.com/entry/PDCA-Plan-Do-Check-Act#entry144comment</comments>
			<pubDate>Tue, 18 Sep 2007 15:21:56 +0900</pubDate>
		</item>
		<item>
			<title>test</title>
			<link>http://itgs.tistory.com/entry/test-1</link>
			<description>&lt;p&gt;&lt;a href=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzYwMzFAZnMzLnRpc3RvcnkuY29tOi9hdHRhY2gvMC82LmdpZg==&quot; atomicselection=&quot;true&quot;&gt;&lt;img height=&quot;222&quot; src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzYwMzFAZnMzLnRpc3RvcnkuY29tOi9hdHRhY2gvMC83LmdpZg==&quot; width=&quot;240&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/143</guid>
			<comments>http://itgs.tistory.com/entry/test-1#entry143comment</comments>
			<pubDate>Mon, 17 Sep 2007 17:57:53 +0900</pubDate>
		</item>
		<item>
			<title>Designing Performance Testing Metrics...</title>
			<link>http://itgs.tistory.com/entry/Designing-Performance-Testing-Metrics</link>
			<description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;Designing Performance Testing Metrics into Highly Distributed J2EE Applications&quot; src=&quot;http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/PerfTesting.gif&quot; align=&quot;center&quot; border=&quot;0&quot;&gt;&lt;br&gt;&lt;b&gt;February 2004&lt;/b&gt; &lt;h4&gt;&lt;b&gt;&lt;a href=&quot;http://www.theserverside.com/news/thread.tss?thread_id=23988&quot;&gt;Discuss this Article&lt;/a&gt;&lt;/b&gt;&lt;/h4&gt; &lt;h3&gt;Introduction&lt;/h3&gt; &lt;p&gt;In ancient computing times, a wise system architect once said, &quot;you can&#039;t manage an application you can&#039;t monitor.&quot; In many cases, documenting the design for a new application, let alone how it might be monitored, is typically beyond the scope of the project. This article describes a reusable mechanism for capturing application-bound, performance statistics for highly distributed J2EE applications.  &lt;p&gt;Applications essentially need to be engineered to support established service levels (i.e. Service Level Agreements). In some cases, SLA might be very granular, such as, stating the elapsed time expected to persist data related to a person. The architecture depicted in Figure 1 was implemented to handle an Internet order entry, including a self-service feature to allow a customer to update his own profile.  &lt;p&gt;&lt;img src=&quot;http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Figure1.gif&quot;&gt;&lt;br&gt;&lt;i&gt;Figure 1. Distributed J2EE Architecture&lt;/i&gt; &lt;p&gt;Because of expectations of high order volumes, the application was engineered to provide distributed EJB transactions, which can be pooled and clustered for high availability and scalability. Highly distributed applications not only need to be engineered from a distributed object standpoint, but from a load balancing and clustering perspective, too. The architecture does not reflect load balancing and clustering implementation details.  &lt;p&gt;This document describes a basic methodology for performance testing the distributed architecture. Essentially, the document describes the design and edits required to collect basic instrumentation/timing estimates for a distributed J2EE application.  &lt;h3&gt;The Distributed Architecture and Time Synchronization&lt;/h3&gt; &lt;p&gt;The J2EE application relies on five tiers: a Web, EJB, EAI (Enterprise Application Integration), ERP (Enterprise Resource Planning) and DBMS tier. An Internet client makes an HTTP request to the Web tier and forwards the request over RMI/IIOP to the EJB tier. The EJB tier communicates with the SeeBeyond EAI tier using a SeeBeyond MUX e*Way . The EAI tier communicates with the Peoplesoft CRM (Customer Relationship Management) application within the ERP tier using a Peoplesoft adapter. Finally, The CRM application integrates with an Oracle DBMS over SQL*net.  &lt;p&gt;A key part of any distributed environment is the time server. Within the methodology, instrumentation metrics are collected on the server where the code is executed, so it is important that all machines within the distributed J2EE architecture are time synchronized. Within the IBM AIX UNIX environment, the xntpd daemon sets the internal clock time on a machine. The service is used to synchronize time services with an external machine using the Network Time Protocol (NTP). Typically, there is a time server, which does not necessarily need to be another AIX or UNIX machine, within an organization&#039;s network that all machines synchronize with on startup. (In reality, machines with xntpd configured synchronize constantly, not just on startup.)  &lt;p&gt;Alternatively, a machine can synchronize with an external time server on the Internet. The xntpd daemon defaults to off, so time settings, such as the IP address of the time server to synchronize with, needs to be configured within an ntp.conf file. Since instrumentation metrics are collected at the second or even millisecond levels, discrepancies between machines can lead to spurious performance statistics.  &lt;h3&gt;Object Specification and Instrumentation Behavior&lt;/h3&gt; &lt;p&gt;The proposed J2EE architecture relies on a number of well-known design patterns, such as the Business Delegate (a.k.a. Proxy), Data Access Object, Model-View-Controller, Session Facade and Transfer Object (a.k.a. Value Object). A transfer object is a serializable class that groups related attributes, forming a composite value. In the architecture, the Transfer or Value Object is used as the return type of a remote business method, such as an Enterprise JavaBean. Fetching multiple attributes through the value or transfer object in one server roundtrip decreases network traffic and minimizes latency and server resource usage.  &lt;p&gt;Figure 2 depicts the PersonValueObject, which implements IPersonValueObject and Serializable interfaces. The PersonWorkerBean uses a PersonValueObject for containing person and instrumentation attributes. Instrumentation attributes are long values, which contain a timestamp from calling System.currentTimeMillis(). The PersonValueObject also includes accessor methods for all attributes.  &lt;p&gt;&lt;img src=&quot;http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Figure2.gif&quot;&gt;&lt;br&gt;&lt;i&gt;Figure 2. UML Class Diagram Value Object Specification (a.k.a Transfer Object)&lt;/i&gt; &lt;p&gt;While it is good OO practice to provide accessor methods instead of allowing direct manipulation of instance variables, it also increases overhead by imposing an additional method call. You want accessors to hide the implementation of get and set, and to allow subclasses to change the synchronization of a get or set, but there will be an overhead cost. Value objects can be sub-classed or they may have associations with other Value objects. For example, if requirements dictated that all Value objects in the application needed to be performance tested, refactoring instrumentation operations within a &quot;FrameworkValueObject&quot; would strongly be recommended. In this alternative specification to Figure 2, the PersonValueObject would extend the FrameworkValueObject and implement the IPersonValueObject interface; the IPersonValueObject interface would extend the IFrameworkValueObject interface. However, the operations listed in the IPersonValueObject would be the same as depicted in Figure 2 for either specification. The advantage to using this model is that all value objects would extend the FrameworkValueObject and therefore have instrumentation behavior; however, this is a complex relationship, and while correct from a UML (Unified Modeling Language) perspective, in and of itself would exert a performance cost to the application.  &lt;p&gt;For value objects that have a direct association with other value objects, those relationships are implemented as class instance variables. UML recommends that for value objects that have an aggregation or composition association with other value objects, those relationships should be implemented as a Collection. A Collection is the root interface in the Java Collection hierarchy. A Collection represents a group of objects, known as its elements. This interface is typically used to pass collections around and manipulate them where maximum generality is desired. For example, a PersonValueObject contains one to many AddressValueObjects or a Collection of AddressValueObjects. However, this relationship is not included in the diagram, because it is not related to capturing timing estimates, but it is important to &quot;real world&quot; applications.  &lt;h3&gt;Instrumentation Data Collection Process&lt;/h3&gt; &lt;p&gt;The objective of the methodology for this project was:  &lt;ul&gt; &lt;li&gt;To estimate the total elapsed time to marshal and persist a PersonValueObject within middleware components. &lt;li&gt;To determine which tiers or key processes were the most expensive from a performance perspective and where optimization might be needed. &lt;li&gt;To be able to log timing estimates from multiple tiers in a single log file, which makes performance analysis and reporting simple.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Once the value object was wired for collecting instrumentation/timing, instrumentation edits were required in the J2EE and SeeBeyond application code. This required identifying the objects that would set timing estimates into the value object for the tier, and which object would be responsible for getting the estimates and writing them to a log file. The number of places in the code that timing metrics were collected was, in a way, an arbitrary decision. It was determined that the following objects needed to be reworked:  &lt;ul&gt; &lt;li&gt;PersonWorkerBean on the Web Tier - would be responsible for setting timing attributes (that is, T1 and T6) on the PersonValueObject to determine total time spent marshaling the remote Session EJB from the Web tier, getting all timing estimates from the PersonValueObject and writing them to a single log file.  &lt;li&gt;EJB SessionBean on the EJB Tier - responsible for setting timing estimates (T2 and T5) on the PersonValueObject to determine elapsed time spent on the EJB tier getting a connection to SeeBeyond and parsing the PersonValueObject into a delimited string for SeeBeyond processing. &lt;li&gt;PersonDAO (Data Access Object) on the EJB Tier - responsible for setting timing estimates (T3 and T4) on the PersonValueObject to determine total time spent on the EAI tier. &lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Architectural Limitations&lt;/h3&gt; &lt;p&gt;The input for testing the application was generated using Mercury Interactive&#039;s LoadRunner via an HTML browser; this discussion, however, is out of scope for this report. Internet/network timing estimates, that is, download time from the HTTP server to the browser, are not collected through the value object; intranet download timing estimates must be imputed by estimating elapsed overall response time through LoadRunner minus PersonValueObject timing estimates collected in the framework_log4j.log.  &lt;p&gt;The target of the log4j log output can be a file, an OutputStream, a java.io.Writer, a remote log4j server, a remote Unix Syslog daemon, or even an NT event logger, among many others. The performance of the log4j package is also quite good. On an AMD Duron clocked at 800Mhz running JDK 1.3.1, it costs about 5 nanoseconds to determine if a logging statement should be logged or not. Actual logging is also quite fast, ranging from 21 microseconds using the basic configuration.  &lt;p&gt;It is important to point out that the purpose of the methodology is not memory and CPU application profiling as would be performed by tools such as JProbe from Quest Software or Optimizeit form Borland. The only tools that are engineered for distributed performance monitoring similar to the methology discussed here are PathWAI Dashboard from Candle Corp. and Introscope from Wily Technology.  &lt;p&gt;&lt;img src=&quot;http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Figure3.gif&quot;&gt;&lt;br&gt;&lt;i&gt;Figure 3. UML Sequence Diagram - Create a PersonValueObject &lt;/i&gt; &lt;p&gt;A successful execution of the application from the Step 1 createPerson on the PersonWorkerBean to Step 23, writing the timing data to a Log4j log file would result in a single row that can be parsed into the following matrix. Timing estimates are collected in milliseconds. The table below is used to depict the elapsed time for processes within the application tiers, which is somewhat an arbitrary decision based on requirements. In effect, various permutations and combinations of processing times can be estimated, as long as the analyst/programmer has a solid understanding of the context of the timestamp captured. For example, 250 represents the total elapsed time marshaling the PersonValueObject from the Web tier through the entire application, whereas, the Incremental Elapsed Time Column is an imputed estimate for processing within tiers.  &lt;p&gt;&lt;img src=&quot;http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Table1.jpg&quot;&gt; &lt;h3&gt;Implementation Details&lt;/h3&gt; &lt;p&gt;&lt;b&gt;Step 1:&lt;/b&gt; Implement instrumentation code edits for the IPersonValueObject Interface for the PersonValueObject Class (see Figure 2).  &lt;p&gt;&lt;b&gt;Step 2:&lt;/b&gt; Implement instrumentation code edits for the PersonValueObject Class (see Figure 2).  &lt;p&gt;&lt;b&gt;Step 3:&lt;/b&gt; Instrumentation code edits for the log4j.xml that sets priority level for application logging to the framework_log4j.log file. log4j relies on a configuration file for runtime settings. It also provides an ability to dynamically set the log levels (i.e. DEBUG, INFO, WARN, etc.). &lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE log4j:configuration SYSTEM &quot;log4j.dtd&quot;&amp;gt;

&amp;lt;log4j:configuration
debug=&quot;true&quot;&amp;gt;
   &amp;lt;appender name=&quot;TEMP&quot;
       class=&quot;org.apache.log4j.FileAppender&quot;&amp;gt;
      &amp;lt;param name=&quot;File&quot; value=&quot;framework_log4j.log&quot;/&amp;gt;
      &amp;lt;layout class=&quot;org.apache.log4j.PatternLayout&quot;&amp;gt;
        &amp;lt;param name=&quot;ConversionPattern&quot; value=&quot;%d - %m%n&quot;/&amp;gt;
      &amp;lt;/layout&amp;gt;
   &amp;lt;/appender&amp;gt;
   &amp;lt;category name=&quot;proofofconcept&quot;&amp;gt;
      &amp;lt;priority value=&quot;info&quot;
      &amp;lt;appender-ref ref=&quot;TEMP&quot;/&amp;gt;
   &amp;lt;/category&amp;gt;
&amp;lt;/log4j:configuration&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Step 4:&lt;/b&gt; Implement instrumentation code edits for the PersonWorkerBean (see Figure 3). The PersonWorkerBean logs the timestamps to the framework_log4j.log file by invoking a log4j.info method on a static reference to the Log4j Logger class. There are really two key classes: the PropertyConfigurator and Logger. The PropertyConfigurator.configure method is used to pass the location of the configuration file. The Logger is used to set the logging messages, the logging level and to identify which classes in the application you want to log errors for. The recommended pattern for extending the Logger class within Log4j is wrapping or creating a reference. It is strongly discouraged that users subclass either the Logger classes. Log4j provides an ability to (dynamically) set the log levels (i.e. DEBUG, INFO, WARN, etc.) or provide the level through a configuration file. By setting the level to &quot;info&quot;, all messages of &quot;info&quot; and above will be written to the log file. Provided that the application does not throw any exceptions, there should be only one &quot;info&quot; message written to the file, which includes timing estimates for all middleware tiers. 
&lt;p&gt;&lt;b&gt;Step 5:&lt;/b&gt; Implement instrumentation code edits for the PersonServiceSessionBean (see Figure 3). The PersonSessionBean create method receives a serialized copy of the PersonValueObject, sets the estimate into the PersonValueObject and calls the createPerson on the PersonDAO. In the model, the DAO is used to get a connection to the SeeBeyond EAI application server, and the PersonValueObject is not directly persisted into a DBMS. The point is, that in most J2EE applications, the Data Access Object pattern is used to specify how to persist data into DBMS. 
&lt;p&gt;&lt;b&gt;Step 6:&lt;/b&gt; Implement instrumentation code edits for the PersonDAO class (see Figure 3). The createPerson method on the PersonDAO sends the PersonValueObject to the SeeBeyond application server using a MUX e*Way, a synchronous protocol. For this implementation, the PersonValueObject attributes where sent as a test message, because the SeeBeyond application server only supported text messages. The returning message from SeeBeyond, because it represented a string, not a PersonValueObject, needed to be parsed using a StringTokenizer. This edit for instrumenation code assumes that there are 3 tokens in the order in the format &quot;Id^timeStamp1^timeStamp2.&quot; The Id is generated by SeeBeyond and represents the primary key for the PersonValueObject created. 
&lt;p&gt;The SeeBeyond application server provided timestamps for integration with the Peoplesoft CRM. SeeBeyond also returned the generated primary key, which would be required for persisting associated value objects, such as Address value objects. This is not modeled in the UML sequence diagram, because the central theme is how to collect timing estimates within disparate computing tiers. &lt;pre&gt;protected IPersonValueObject createValueObject(
    String rs )
    {
        IPersonValueObject valueObject = null;
        try
        {
            valueObject = getPersonValueObject();
            if ( valueObject == null )    // create one
            {
                valueObject = new PersonValueObject();
            }
               StringTokenizer st =
                  new StringTokenizer(rs, &quot;^&quot;);
               PersonPrimaryKey pk =
                  new PersonPrimaryKey(st.nextToken());
               valueObject.setPrimaryKey( pk);
               valueObject.setT3( Long.parseLong(st.nextToken()));
               valueObject.setT4( Long.parseLong(st.nextToken()));
                      }
        catch ( Exception exc )
        {
            printMessage(&quot;PersonDAO:createValueObject()-&quot; +
                         exc );
        }

        return( valueObject );
    }
&lt;/pre&gt;
&lt;h3&gt;Architectural Implications&lt;/h3&gt;
&lt;p&gt;Ideally, the best design would allow for a ValueObject to be passed to all middleware tiers. SeeBeyond on the EAI tier actually has asynchronous support using JMS (Java Messaging Service) text messages, but not for JMS ObjectMessage type messages. Most implementers would prefer ObjectMessage type messages. For example, with an ObjectMessage type using JMS, the PersonValueObject would not have been parsed into a String object, but could have been sent directly to SeeBeyond . ObjectMessages - messages containing a serialized Java object - make it clear to programmers which data type and attribute they are receiving and sending. With support for JMS ObjectMessages, the PersonEAI object depicted in Figure 4 could have been implemented in SeeBeyond, which could have marshaled directly the PersonValueObject. For distributed object programmers, this is what it is all about -- transferring objects around the network. 
&lt;p&gt;&lt;img src=&quot;http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Figure4.gif&quot;&gt;&lt;br&gt;&lt;i&gt;Figure 4. View of participating classes for UML Sequence Diagram - Create a PersonValueObject&lt;/i&gt;
&lt;h4&gt;About the Author&lt;/h4&gt;
&lt;p&gt;Frank is a Lead Architect specializing in J2EE application design and implementation of enterprise-wide applications. He can be reached at &lt;a href=&quot;mailto:frank_teti@hotmail.com&quot;&gt;frank_teti@hotmail.com&lt;/a&gt;. 
&lt;h4&gt;Other related articles by Frank Teti:&lt;/h4&gt;
&lt;p&gt;When SOAP Just Won&#039;t Do, Network Computing, 11/03&lt;br&gt;&lt;a href=&quot;http://www.networkcomputing.com/showitem.jhtml?docid=1424ws1&quot;&gt;http://www.networkcomputing.com/showitem.jhtml?docid=1424ws1&lt;/a&gt;
&lt;p&gt;Design for EJB Message-Driven Beans with UML Use Cases, Enterprise Architect, Winter 2003&lt;br&gt;&lt;a href=&quot;http://www.ftponline.com/ea/magazine/winter/columns/modeling/&quot;&gt;http://www.ftponline.com/ea/magazine/winter/columns/modeling/&lt;/a&gt;
&lt;p&gt;The new world of clustering, Application Development Trends, 12/01&lt;br&gt;&lt;a href=&quot;http://www.adtmag.com/article.asp?id=5752&quot;&gt;http://www.adtmag.com/article.asp?id=5752&lt;/a&gt;
&lt;p&gt;Boosting Java Performance, Application Development Trends, 12/00&lt;br&gt;&lt;a href=&quot;http://www.adtmag.com/article.asp?id=2667&quot;&gt;http://www.adtmag.com/article.asp?id=2667&lt;/a&gt;
&lt;p&gt;&amp;nbsp;
&lt;p&gt;참고 ^^ ============== !!
&lt;p&gt;&lt;a title=&quot;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=ContinuousPerformance&quot; href=&quot;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=ContinuousPerformance&quot;&gt;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=ContinuousPerformance&lt;/a&gt;
&lt;p&gt;&amp;nbsp;
&lt;p&gt;&lt;a title=&quot;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=BroemmerPerformance&quot; href=&quot;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=BroemmerPerformance&quot;&gt;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=BroemmerPerformance&lt;/a&gt;
&lt;p&gt;&amp;nbsp;
&lt;p&gt;&lt;a title=&quot;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=DistCompute&quot; href=&quot;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=DistCompute&quot;&gt;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=DistCompute&lt;/a&gt;
&lt;p&gt;&amp;nbsp;
&lt;p&gt;&lt;a title=&quot;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=TestingConcurrent&quot; href=&quot;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=TestingConcurrent&quot;&gt;http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=TestingConcurrent&lt;/a&gt;</description>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/142</guid>
			<comments>http://itgs.tistory.com/entry/Designing-Performance-Testing-Metrics#entry142comment</comments>
			<pubDate>Wed, 29 Aug 2007 17:24:00 +0900</pubDate>
		</item>
		<item>
			<title>COTS Integration</title>
			<link>http://itgs.tistory.com/entry/COTS-Integration</link>
			<description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.sei.cmu.edu/str/descriptions/cbsd.html&quot;&gt;http://www.sei.cmu.edu/str/descriptions/cbsd.html&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.cebase.org/www/frames.html?/www/researchActivities/COTS/integrationmodels.html&quot;&gt;http://www.cebase.org/www/frames.html?/www/researchActivities/COTS/integrationmodels.html&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.ncca.navy.mil/services/software/cots.pdf&quot;&gt;http://www.ncca.navy.mil/services/software/cots.pdf&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.computer.org/portal/cms_docs_software/software/content/value.pdf&quot;&gt;http://www.computer.org/portal/cms_docs_software/software/content/value.pdf&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://tharkun0.ucsd.edu/ResearchCentral/download.jsp?id=138&quot;&gt;http://tharkun0.ucsd.edu/ResearchCentral/download.jsp?id=138&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.stargroup.uwaterloo.ca/~ltahvild/courses/ECE750-11-S05/CBSS-Lecture10.pdf&quot;&gt;http://www.stargroup.uwaterloo.ca/~ltahvild/courses/ECE750-11-S05/CBSS-Lecture10.pdf&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.eetkorea.com/ARTICLES/2004FEB/2004FEB02_ICD_EDA_TA.PDF?SOURCES=DOWNLOAD&quot;&gt;http://www.eetkorea.com/ARTICLES/2004FEB/2004FEB02_ICD_EDA_TA.PDF?SOURCES=DOWNLOAD&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.omg.org/news/meetings/workshops/MDA-SOA-WS_Manual/02-3_Cummins.pdf&quot;&gt;http://www.omg.org/news/meetings/workshops/MDA-SOA-WS_Manual/02-3_Cummins.pdf&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://aswec07.cs.latrobe.edu.au/14.pdf&quot;&gt;http://aswec07.cs.latrobe.edu.au/14.pdf&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://sunset.usc.edu/GSAW/gsaw2006/s4/hohwald.pdf&quot;&gt;http://sunset.usc.edu/GSAW/gsaw2006/s4/hohwald.pdf&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://csdl2.computer.org/persagen/DLAbsToc.jsp?resourcePath=/dl/proceedings/&amp;amp;toc=comp/proceedings/iccbss/2007/2785/00/2785toc.xml&amp;amp;DOI=10.1109/ICCBSS.2007.46&quot;&gt;http://csdl2.computer.org/persagen/DLAbsToc.jsp?resourcePath=/dl/proceedings/&amp;amp;toc=comp/proceedings/iccbss/2007/2785/00/2785toc.xml&amp;amp;DOI=10.1109/ICCBSS.2007.46&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://colab.cim3.net/file/work/SOACoP/2006_05_2324/CCasanave205222006.ppt&quot;&gt;http://colab.cim3.net/file/work/SOACoP/2006_05_2324/CCasanave205222006.ppt&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.army.mil/armybtkc/test/sa/soa.htm&quot;&gt;http://www.army.mil/armybtkc/test/sa/soa.htm&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;오래된 이야기..거버넌스가 힘들다. Cots에 대한 Integration은... &lt;p&gt;현재 몸으로 겪고 있음.  &lt;p&gt;몇개월째..T.T&lt;/p&gt;</description>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/141</guid>
			<comments>http://itgs.tistory.com/entry/COTS-Integration#entry141comment</comments>
			<pubDate>Mon, 27 Aug 2007 14:36:44 +0900</pubDate>
		</item>
		<item>
			<title>S/W Architecture</title>
			<link>http://itgs.tistory.com/entry/SW-Architecture</link>
			<description>&lt;P&gt;※ 아키텍처는 소프트웨어 아키텍처를 뜻합니다. &lt;/P&gt;
&lt;P&gt; 
&lt;P&gt;최근 아키텍처에 대한 품질 평가를 하면서 몇몇 새로운 것들을 느끼고 있다. 
&lt;P&gt;엔지니어들이 느끼는 아키텍처란게 무얼까? 6년전에 만든 아키텍처 문서를 보면서 품질팀에서 아키텍처에 대한 품질을 검사 할 수 없음을 다시 한번 느끼고 있다. 
&lt;P&gt;아키텍트는 아키텍처의 품질 담당자이며 이로 인해 아키텍트가 책임을 지는 일은 상당히 크다라고 할 수 있다. 
&lt;P&gt;어떤 품질에 포커스를 하느냐에 따라 QA( Quality Attribute ) 의 느낌감도 (?) 는 상당히 다르다는 것이다. 
&lt;P&gt;어떤 이는 ATAM을 너무나 쉽게 거론하기도 한다. 
&lt;P&gt;최근 모 회사의 아키텍처 문서를 평가하면서 많은 것들을 느꼈는데… 최근에 제품위주(COTS) 의 아키텍처가 아키텍트들의 머리에 또 다른 사고를 만든다는 것도 알았다. 
&lt;P&gt;그러기 위해서는 COTS를 위한 아키텍처가 필요하며 이에 맞는 적절한 평가가 필요하다고 생각된다. 페이지수가 많거나 학구적이라고 해서 아키텍처 문서라고 하기엔 너무나 고리타분하고…. 외국서적에 나온 듯이 그대로 배낀 패턴이나 스타일로 뒤덮힌 아키텍처 문서도 난무하며… 정말 그런 문서들이 아키텍처 문서인지는 잘 모르겠다. 
&lt;P&gt;개발자입장에서 디자인패턴을 써놓는다고 해서 아키텍처라는 말을 붙이기엔 아키텍처라는 말이 너무나 광범위하고 어떤 면에서는 협소하다고 생각한다. 
&lt;P&gt;최근 몇 년간 SEI 에서 나온 시리즈 물을 몇 번 정독하고… 
&lt;P&gt;포사1.2를 쪼개고… 
&lt;P&gt;각종 Object문서를 봐도 봐도… 
&lt;P&gt;현장에서의 아키텍처문서엔 어떠한 면에선 현실적인 내용이 들어가긴 힘들다는 것이다. 
&lt;P&gt;그저 현학적인 문서들….. 책을 아무리 많이 봐도 익혀지지 않는 것들이 많은 것은 
&lt;P&gt;책의 장수만을 세거나 아니면 너무나 현학적인 책을 봐서 아닐까….. 반성해야 한다. 
&lt;P&gt;아키텍처 문서에는 이러한 것들이 들어있으면 좀더 많은 이해관계자들이 공감하기 좋을 것이다. 
&lt;P&gt; 
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;1.여러 이해관계자가 이해가 가능한 View를 가진 문서 &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;2.비 전문가가 봐도 어느 정도 이해 가능한 합리적이고 쉬운 아키텍처 문서 &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;3.회사나 집단의 아키텍처적인 의사평가를 내리는 과정이나 기술적인 평가를 위해 쓰이게 될 문서 &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;4.회사의 아키텍처 전략 ( 품질속성 ) 을 내포하며 이를 지키기 위해서 어떠한 것들이 내재 되어야 하는지 어떠한 것들이 패턴화 되었는지 등등에 대한 문서, 이를 위한 대안이나 원칙, 정의 등이 포함된 문서 &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;5.비즈니스와 기술을 연결하기 위해 최적의 메커니즘 효율성을 찾아내는 메커니즘적인 문서 &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;6.기타 등등 &lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;br /&gt;하도 많아서 기술하기 힘들지만…. 대략 저러하다.&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;또다른 뷰에서 본다면 아키텍처 정의를 위한 문서들은 어려워서는 안되며 가장 쉬운 것으로 추상화되어 표현되어야 한다는거….&lt;/P&gt;</description>
			<category>S/W Architecture</category>
			<category>architecture</category>
			<category>S/W Architecture</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/140</guid>
			<comments>http://itgs.tistory.com/entry/SW-Architecture#entry140comment</comments>
			<pubDate>Fri, 22 Jun 2007 14:14:27 +0900</pubDate>
		</item>
		<item>
			<title>Relationship between SCA and BPEL</title>
			<link>http://itgs.tistory.com/entry/Relationship-between-SCA-and-BPEL</link>
			<description>&lt;p&gt;&lt;a title=&quot;http://www.osoa.org/display/Main/Relationship+between+SCA+and+BPEL&quot; href=&quot;http://www.osoa.org/display/Main/Relationship+between+SCA+and+BPEL&quot;&gt;http://www.osoa.org/display/Main/Relationship+between+SCA+and+BPEL&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;SCA and BPEL - Rivals or Friends?&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;Sometimes, when talking about composite service-based applications, people get confused about the roles of SCA and of BPEL and consider that these two technologies are in conflict or that they are trying to perform the same roles.&amp;nbsp; This isn&#039;t the case - far from being rivals, SCA and BPEL are firm friends and are complementary parts of a business solution, each with its own role to play.&lt;/p&gt; &lt;p&gt;However, the similarities between SCA and BPEL show why there is the possibility for confusion.&amp;nbsp; First, both BPEL and SCA are described in terms of a formal language that is based on XML.&amp;nbsp; Secondly, both languages may be used to describe a business service that is implemented by composing together other business services and both can describe inbound and outbound service interactions types by WSDL port types.&amp;nbsp; There the similarities end.&amp;nbsp; The important difference between SCA and BPEL is that SCA is all about describing the &lt;b&gt;&lt;em&gt;structure&lt;/em&gt;&lt;/b&gt; of the application while BPEL describes &lt;b&gt;&lt;em&gt;business logic&lt;/em&gt;&lt;/b&gt; involving the &lt;b&gt;&lt;em&gt;sequencing&lt;/em&gt;&lt;/b&gt; of operations in a business process. &lt;p&gt;Putting this in another way, SCA is concerned with what &lt;b&gt;&lt;em&gt;components&lt;/em&gt;&lt;/b&gt; exist in the business application, what &lt;b&gt;&lt;em&gt;services&lt;/em&gt;&lt;/b&gt; those components offer, what service &lt;b&gt;&lt;em&gt;references&lt;/em&gt;&lt;/b&gt; those components depend on, how the components are &lt;b&gt;&lt;em&gt;connected&lt;/em&gt;&lt;/b&gt; together, what endpoint &lt;b&gt;&lt;em&gt;addresses&lt;/em&gt;&lt;/b&gt; and &lt;b&gt;&lt;em&gt;communication methods&lt;/em&gt;&lt;/b&gt; are used for the connections, what &lt;b&gt;&lt;em&gt;policies&lt;/em&gt;&lt;/b&gt; are applied to components and to the connections between them. BPEL is concerned with &lt;b&gt;&lt;em&gt;business logic&lt;/em&gt;&lt;/b&gt; and the &lt;b&gt;&lt;em&gt;sequences of operations&lt;/em&gt;&lt;/b&gt; which are performed to execute an individual business process. BPEL processes provide and consume other services through &lt;b&gt;&lt;em&gt;partnerLinks&lt;/em&gt;&lt;/b&gt;, but these are abstract interfaces that must be connected to actual endpoints and communication methods through configuration. &lt;p&gt;So, SCA describes the structure of a business solution in terms of business components and their connections, but the sequence in which particular services are invoked is determined by the business logic of the implementation used for each component. It is a good combination when the components are implemented as BPEL processes within an overall SCA assembly, since then it is possible to get a combined view of structure and sequence.&amp;nbsp; Of course, SCA does not force this as a requirement and components may be implemented in any supported programming language, such as Java or C++.&amp;nbsp; In this case, sequence decisions are made in the implementation language of the component and it may be harder to work out the sequences involved. &lt;p&gt;So, BPEL and SCA are the firmest of friends and work well together when building business solutions as sets of services. The following sections provide some details and some examples as to how this works in practice. &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;h4&gt;&lt;strong&gt;SCA and the Structure of Composite Applications&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;&lt;img src=&quot;http://www.osoa.org/download/attachments/4028/Example_SCA_Assembly.jpg&quot; align=&quot;left&quot; border=&quot;0&quot;&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;SCA is useful for describing the &lt;b&gt;&lt;em&gt;structure&lt;/em&gt;&lt;/b&gt; of composite service applications.&amp;nbsp; To get a better sense of what this means, an example application is shown in the following diagram:&lt;/p&gt; &lt;p&gt;In this example, the Order Processing service is offered for use by customers, most likely as a Web service available over a general protocol such as SOAP over HTTP.&amp;nbsp; This may have a set of operations such as &quot;createOrder&quot;, &quot;checkAvailability&quot;, &quot;getOrderStatus&quot; and so on.&lt;/p&gt; &lt;p&gt;The Order Processing service is implemented by the OrderProcessing Component.&amp;nbsp; In turn, the OrderProcessing component makes use of services provided by other components, represented by the EventLog component, the AccountsComposite and the WarehouseComposite.&amp;nbsp; The names of those components already indicate how they are implemented - EventLog is a simple implementation, for example a Java class, while AccountsComposite and WarehouseComposite are each a composite set of components which work together to provide the services used by the OrderProcessing component. &lt;p&gt;The OrderProcessing component does not need to know the structure of the AccountsComposite or the WarehouseComposite - but the assemblers and developers responsible for those parts of the solution certainly do! &lt;p&gt;So, SCA shows what components make up a particular business solution and it shows how they are connected together. SCA provides more information than this, if it is needed.&amp;nbsp; For example, SCA knows what binding is used for each connection.&amp;nbsp; The OrderProcessing component may, for example, connect to the PaymentService using an EJB binding, if the AccountsComposite is implemented as a Java EE application using EJBs.&amp;nbsp; Meanwhile the OrderProcessing component might connect to the WarehouseService using a JMS binding using an underlying messaging infrastructure.&amp;nbsp; SCA may also apply particular policies to these connections.&amp;nbsp; For example, accounts information may be regarded as sensitive and so require that all operations on the PaymentService are encrypted.&amp;nbsp; The same operations may also require authentication to ensure that only trusted users are invoking the operations.&amp;nbsp; Meanwhile some of the operations on the WarehouseService, such as those involved in dispatching orders to the customer, must be performed transactionally and reliably, so that the OrderProcessing component can be assured that the order is dispatched once and once only. &lt;p&gt;What SCA does not do is in any way show the &lt;b&gt;&lt;em&gt;sequences&lt;/em&gt;&lt;/b&gt; of operations associated with the OrderProcessing service. So, the checking of the customer&#039;s account status, the checking of the inventory status of the order items, the calculation of the price of the order items, the billing of the customer, the request to dispatch the goods to the customer - all these operations (and more!) may be required to complete a &quot;createOrder&quot; operation, but their sequence is entirely determined by the code used as the implementation of the</description>
			<category>SOA</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/137</guid>
			<comments>http://itgs.tistory.com/entry/Relationship-between-SCA-and-BPEL#entry137comment</comments>
			<pubDate>Wed, 30 May 2007 09:51:56 +0900</pubDate>
		</item>
		<item>
			<title>CPIC - Capital Planning and Investment Control</title>
			<link>http://itgs.tistory.com/entry/CPIC-Capital-Planning-and-Investment-Control</link>
			<description>&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #faffa9&quot;&gt;&lt;br /&gt;예산편성 &amp;amp; 투자관리 - IT 거버넌스에서의 투자 ROI에 대한 문서및 템플릿 Set&lt;/FONT&gt;&lt;/STRONG&gt;&lt;A href=&quot;http://www.cit.nih.gov/home.asp&quot;&gt;&lt;br /&gt;&lt;br /&gt;http://www.cit.nih.gov/home.asp&lt;/A&gt;&lt;br /&gt;&lt;A href=&quot;http://irm.cit.nih.gov/itmra/CPIC.html&quot;&gt;http://irm.cit.nih.gov/itmra/CPIC.html&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #faffa9&quot;&gt;&lt;STRONG&gt;CPIC의 세가지 요소&lt;/STRONG&gt;&lt;br /&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;&lt;br /&gt;선정&lt;br /&gt;&lt;/FONT&gt;
&lt;DIV class=O v:shape=&quot;_x0000_s1026&quot;&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot;&gt;&lt;FONT size=2&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;FONT size=2&gt;-장기 투자 계획의 개발&lt;/FONT&gt;&lt;br /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;FONT size=2&gt;-목표에 도달하기 위해 대안의 평가&lt;/FONT&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;-정보기술 자산 획득을 투자로 인식, 투자 관리방법 사용 &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;-임원 검토 위원회를 구성하여 선정 &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;-측정 가능한 목표와 성과 척도의 개발 &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림&quot;&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;통제&lt;br /&gt;-통합 프로젝트 팀의 구성 &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;-유용한 단위별로 예산 배정 (전체비용의초기결정) &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;-프로젝트 비용, 일정 및 성과의 추적 관리 &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림&quot;&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;평가&lt;br /&gt;-구현 후 검토 실시 &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;mso-line-spacing: &#039;100 0 5&#039;; mso-char-wrap: 1; mso-kinsoku-overflow: 1; mso-word-wrap: 0&quot;&gt;&lt;SPAN style=&quot;mso-bidi-font-family: LilyUPC&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 14pt; FONT-FAMILY: 굴림; mso-ascii-font-family: 굴림; mso-fareast-font-family: 굴림; mso-hansi-font-family: 굴림; mso-fareast-language: KO&quot;&gt;&lt;FONT face=&quot;&#039;Gulim&#039;, &#039;Sans-serif&#039;&quot; size=2&gt;-현재 자산의 능력과 계획된 결과와의 차이 확인&lt;/FONT&gt; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
</description>
			<category>IT ROI</category>
			<category>IT거버넌스</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/136</guid>
			<comments>http://itgs.tistory.com/entry/CPIC-Capital-Planning-and-Investment-Control#entry136comment</comments>
			<pubDate>Fri, 18 May 2007 16:40:27 +0900</pubDate>
		</item>
		<item>
			<title>OSOA - Service Component Architecture Specifications</title>
			<link>http://itgs.tistory.com/entry/OSOA-Service-Component-Architecture-Specifications</link>
			<description>&lt;A href=&quot;http://www.osoa.org/display/Main/Service+Component+Architecture+Specifications&quot;&gt;http://www.osoa.org/display/Main/Service+Component+Architecture+Specifications&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;몇몇개를 읽어보고 있다. 직접 보기전엔 이해가 안갈지도....&lt;br /&gt;최근 이해가 되기 시작했음 -.-&lt;br /&gt;Z&amp;nbsp;</description>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/132</guid>
			<comments>http://itgs.tistory.com/entry/OSOA-Service-Component-Architecture-Specifications#entry132comment</comments>
			<pubDate>Thu, 10 May 2007 17:48:39 +0900</pubDate>
		</item>
		<item>
			<title>IBM ESB 나름 좋음.</title>
			<link>http://itgs.tistory.com/entry/IBM-ESB-%EB%82%98%EB%A6%84-%EC%A2%8B%EB%8B%A4</link>
			<description>&lt;A href=&quot;http://www-128.ibm.com/developerworks/websphere/techjournal/0510_brent/0510_brent.html&quot;&gt;http://www-128.ibm.com/developerworks/websphere/techjournal/0510_brent/0510_brent.html&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;
&lt;LI&gt;&lt;A href=&quot;http://www.ibm.com/developerworks/websphere/techjournal/0512_barcia/0512_barcia.html&quot;&gt;&lt;FONT color=#5c81a7&gt;Part 2: Assembling SCA components&lt;/FONT&gt;&lt;/A&gt; 
&lt;LI&gt;&lt;A href=&quot;http://www.ibm.com/developerworks/websphere/techjournal/0602_barcia/0602_barcia.html&quot;&gt;&lt;FONT color=#5c81a7&gt;Part 3: Integrating SCA modules with imports and exports&lt;/FONT&gt;&lt;/A&gt; 
&lt;LI&gt;&lt;A href=&quot;http://www.ibm.com/developerworks/websphere/techjournal/0602_barcia/0602_barcia.html&quot;&gt;&lt;FONT color=#5c81a7&gt;Part 4: Integrating with JMS and Web services&lt;/FONT&gt;&lt;/A&gt; &lt;br /&gt;
&lt;P&gt;현 프로젝트에서 적용중 -.0- 그러나 난관은 있다.&lt;br /&gt;내가 생각하는 SOA모델이 가장 잘 일치하는 것은 IBM의 SOA모델...&lt;br /&gt;이 이야기를 좀 적어보까 ^^&lt;br /&gt;&lt;br /&gt;어디부터 시작을 해야 이게... 적히게 될려나....&lt;br /&gt;정치부터 해야 하나 -.T&lt;/P&gt;&lt;/LI&gt;</description>
			<category>SCA</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/130</guid>
			<comments>http://itgs.tistory.com/entry/IBM-ESB-%EB%82%98%EB%A6%84-%EC%A2%8B%EB%8B%A4#entry130comment</comments>
			<pubDate>Wed,  9 May 2007 14:33:40 +0900</pubDate>
		</item>
		<item>
			<title>UML2BPEL</title>
			<link>http://itgs.tistory.com/entry/UML2BPEL</link>
			<description>&lt;A href=&quot;http://www.ibm.com/developerworks/kr/library/ws-uml2bpel/&quot;&gt;http://www.ibm.com/developerworks/kr/library/ws-uml2bpel/&lt;/A&gt;</description>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/129</guid>
			<comments>http://itgs.tistory.com/entry/UML2BPEL#entry129comment</comments>
			<pubDate>Wed,  9 May 2007 13:28:33 +0900</pubDate>
		</item>
		<item>
			<title>요즈음 나는 ....</title>
			<link>http://itgs.tistory.com/entry/%EC%9A%94%EC%A6%88%EC%9D%8C-%EB%82%98%EB%8A%94</link>
			<description>1. 몸이 더 안좋아짐. 오늘은 회사를 쉬었음. 토비형을 보고 싶기도 했지만 도무지 보기가 힘든 상황&lt;br /&gt;2. 최근엔 SOA의 SCA대해서 좀더 깊이 연구 하였음. &lt;br /&gt;3. 스프링의 IoC에 대한 좀더 깊은 생각&lt;br /&gt;4. 스프링의 컨트롤러에 대한 여러가지 생각을 하게 됨. - 내부 구조를 뜯다가 서블릿의 그 ( ? ) 구조가 생각나기도 했음. 그러나 스프링은 여전히 국내에서는 무력한 상태임. 참고로 스프링의 컨트롤러는 Servlet Controller는 아님. &lt;br /&gt;5. 아침 스터디중 - TDD에 대한 또 다른 생각중&lt;br /&gt;6. SQL Map - Abator 괘얀음. 그러나 유동성 없음. 조금 하다 보니 DAO를 생성해주는데 &quot;SPRING&quot; 으로 바꾸자 Spring의 JDBC Template를 이용해서 코딩이 Gen 되어 나옴 그런데 코드를 보고 약간 실망...T.T 자동 Gen의 한계가 아닐까라는 생각이 듬. &lt;br /&gt;7. 제품에 대한 의존도및 이것들에 대한 유지보수에 대한 생각중 - 제품자체의 건강함을 위해서 코드는 간결하고 철학을 가져야 함. 내부적인 품질이 지켜지지 않은 모 회사의 제품은 철학도 없고... 사람힘들게 만드는 쓰레기 코드임이 틀림 없음. 이상... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;걍 생각없이 읽어볼만한 pdf 임&lt;br /&gt;&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://itgs.tistory.com/attachment/dk5.pdf&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/pdf.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; attach[1].pdf&lt;/a&gt;&lt;/div&gt;</description>
			<category>나의생각</category>
			<category>S/W Architecture</category>
			<category>SCA</category>
			<category>SOA</category>
			<category>나의 생각</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/128</guid>
			<comments>http://itgs.tistory.com/entry/%EC%9A%94%EC%A6%88%EC%9D%8C-%EB%82%98%EB%8A%94#entry128comment</comments>
			<pubDate>Fri,  4 May 2007 20:02:16 +0900</pubDate>
		</item>
		<item>
			<title>갑자기 S모 회사의 Nasa표준이 생각나는군...끌</title>
			<link>http://itgs.tistory.com/entry/%EA%B0%91%EC%9E%90%EA%B8%B0-S%EB%AA%A8-%ED%9A%8C%EC%82%AC%EC%9D%98-Nasa%ED%91%9C%EC%A4%80%EC%9D%B4-%EC%83%9D%EA%B0%81%EB%82%98%EB%8A%94%EA%B5%B0%EB%81%8C</link>
			<description>&lt;A href=&quot;http://andrei.gmxhome.de/jdepend4eclipse/links.html&quot;&gt;http://andrei.gmxhome.de/jdepend4eclipse/links.html&lt;/A&gt;&lt;A href=&quot;http://classpathhelper.sourceforge.net/&quot;&gt;&lt;br /&gt;http://classpathhelper.sourceforge.net/&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;의존도 검사중 ^^</description>
			<category>Development Area</category>
			<category>의존도</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/126</guid>
			<comments>http://itgs.tistory.com/entry/%EA%B0%91%EC%9E%90%EA%B8%B0-S%EB%AA%A8-%ED%9A%8C%EC%82%AC%EC%9D%98-Nasa%ED%91%9C%EC%A4%80%EC%9D%B4-%EC%83%9D%EA%B0%81%EB%82%98%EB%8A%94%EA%B5%B0%EB%81%8C#entry126comment</comments>
			<pubDate>Wed,  2 May 2007 09:15:40 +0900</pubDate>
		</item>
		<item>
			<title>Spring SCA</title>
			<link>http://itgs.tistory.com/entry/Spring-SCA</link>
			<description>&lt;A href=&quot;http://forum.springframework.org/showthread.php?t=21050&quot;&gt;http://forum.springframework.org/showthread.php?t=21050&lt;/A&gt;&lt;A href=&quot;http://www.osoa.org/display/Main/SCA+and+Spring+Framework&quot;&gt;&lt;br /&gt;&lt;br /&gt;http://www.osoa.org/display/Main/SCA+and+Spring+Framework&lt;/A&gt;&lt;br /&gt;&lt;A href=&quot;http://www.osoa.org/download/attachments/35/SCA_SpringComponentImplementationSpecification-V100.pdf?version=1&quot;&gt;&lt;br /&gt;http://www.osoa.org/download/attachments/35/SCA_SpringComponentImplementationSpecification-V100.pdf?version=1&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;&lt;A href=&quot;http://phillyspring.org/spring-and-bea.pdf&quot;&gt;http://phillyspring.org/spring-and-bea.pdf&lt;/A&gt;&amp;nbsp;: spring weblogic SCA 결합&lt;br /&gt;멋지다. Spring SCA</description>
			<category>SOA</category>
			<category>SCA</category>
			<category>Spring Framework</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/125</guid>
			<comments>http://itgs.tistory.com/entry/Spring-SCA#entry125comment</comments>
			<pubDate>Tue, 24 Apr 2007 09:20:30 +0900</pubDate>
		</item>
		<item>
			<title>LifeRay도 버전이 올라가면서 여러가지 기술이 도입 되었네...</title>
			<link>http://itgs.tistory.com/entry/LifeRay%EB%8F%84-%EB%B2%84%EC%A0%84%EC%9D%B4-%EC%98%AC%EB%9D%BC%EA%B0%80%EB%A9%B4%EC%84%9C-%EC%97%AC%EB%9F%AC%EA%B0%80%EC%A7%80-%EA%B8%B0%EC%88%A0%EC%9D%B4-%EB%8F%84%EC%9E%85-%EB%90%98%EC%97%88%EB%84%A4</link>
			<description>&lt;br /&gt;&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0&quot; width=&quot;402&quot; height=&quot;227&quot;&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;/&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.liferay.com/c/document_library/get_file?folderId=65&amp;amp;name=home_4_2_530x190.swf&quot;/&gt;&lt;!--[if !IE]&gt; &lt;--&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; data=&quot;http://www.liferay.com/c/document_library/get_file?folderId=65&amp;amp;name=home_4_2_530x190.swf&quot; width=&quot;402&quot; height=&quot;227&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://www.liferay.com/c/document_library/get_file?folderId=65&amp;amp;name=home_4_2_530x190.swf&quot;&gt;[Flash] http://www.liferay.com/c/document_library/get_file?folderId=65&amp;amp;name=home_4_2_530x190.swf&lt;/a&gt;&lt;/p&gt;&lt;/object&gt;&lt;!--&gt; &lt;![endif]--&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;A href=&quot;http://content.liferay.com/4.0.0/flash/tutorials/liferay_demo.swf&quot;&gt;http://content.liferay.com/4.0.0/flash/tutorials/liferay_demo.swf&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;END USER를 위한 다큐먼팅 ^^&lt;br /&gt;&lt;A href=&quot;http://www.liferay.com/web/guest/documentation/4_2/end_users&quot;&gt;http://www.liferay.com/web/guest/documentation/4_2/end_users&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;오래전 LifeRay기사를 내면서 많이 고생했던 기억이 난다.&lt;br /&gt;별안간 분석을 하게 되어서 많이 힘들었다. 그때 토비형이 많이 도움 줬던 기억이 생생히 난다.&lt;br /&gt;많은 사람들이 외면했던 것도 기억이 난다.T.T&lt;br /&gt;열심히 분석했더니...기술은 괘얀은듯 했으나 코드는 엉망였다. 꼬리에 꼬리를 무는 구조...&lt;br /&gt;&lt;br /&gt;다만 포틀릿 엔진을 자체 제작 했었다는게 조금 신기 했다. 문서를 자세히 보면 많은 부분에서&lt;br /&gt;포틀릿에 대한 구현이 된것이 보인다.&lt;br /&gt;오래 되었지만...기억상으로는 이 LifeRay는 코드상 재귀 호출을 하고 있었던것으로 보였었다.&lt;br /&gt;기억이 가물가물....T.T&lt;br /&gt;&lt;A href=&quot;http://toby.epril.com/?s=liferay&quot;&gt;http://toby.epril.com/?s=liferay&lt;/A&gt;&lt;br /&gt;참조... ^^&lt;br /&gt;&lt;br /&gt;SOA를 위한 Portal로서의 기능을 갖추기 위해 JBI스팩의 ServiceMix의 연동을 도입하였고...&lt;br /&gt;JBPM등을 도입하였다. 이렇게 되면 어느정도 기술적으로는 SOA를 위한 기술들을 갖추었지만...&lt;br /&gt;SOA는 기술로만 되는게 아니지 않더냐...T.T 수많은 아키텍처적인 고민을 통해 SOA의 &lt;br /&gt;철학이 완성되지만 아직도 많은 고민이 필요하다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzYwMzFAZnMzLnRpc3RvcnkuY29tOi9hdHRhY2gvMC80LmdpZg==&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzYwMzFAZnMzLnRpc3RvcnkuY29tOi9hdHRhY2gvMC80LmdpZg==&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;300&quot; width=&quot;515&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;A href=&quot;http://www.liferay.com/web/guest/products/portal/supported_technologies&quot;&gt;http://www.liferay.com/web/guest/products/portal/supported_technologies&lt;/A&gt;&lt;br /&gt;위의 링크와 같은 기술들이 쓰였다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;분석 당시 아래의 아키텍처때문에 분석을 하게 되었었다. 그것이 가지는 절대적인 미학을 위해 분석을 하게 된것이다.... 그런데 약간은 실망....T.T&lt;br /&gt;얼마나 유연한 구조를 제공하느냐는.... 그런 이유였었다...&lt;br /&gt;그때 당시 나의 가장큰 기술적인 이슈는 당연히 Spring, Hibernate 였다. 많은 레퍼런스가 필요하던 차에&lt;br /&gt;LifeRay는 나게에 빛과 같이 중요한 Portal Framework였다. &lt;br /&gt;얼마전 Portal에 대한 자료를 보다가 문득 생각이 났다.&lt;br /&gt;최근 기업에서도 SOA프로젝트를 한다고 하면 Portal이 빠지지 않고 나온다....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzYwMzFAZnMzLnRpc3RvcnkuY29tOi9hdHRhY2gvMC8zLmdpZg==&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzYwMzFAZnMzLnRpc3RvcnkuY29tOi9hdHRhY2gvMC8zLmdpZg==&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;581&quot; width=&quot;450&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;사용자에게 기술이 무슨 상관이 있으랴.... 사용자는 편리하기만 하면 된다.&lt;br /&gt;그러한 이유에서인지...사용자 위주의&amp;nbsp; Ajax가 도입된것도 많은 발전이 있어 보인다. 그러나...T.T&lt;br /&gt;소스코드의 정제는 없었다는거.... 여전히 같은 아키텍처라는게 맘에 걸린다. ㅋ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다른 서버의 이식성에서는 높은 점수를 주고 싶었다. EJB, Non EJB방식의 지원등이 그러하였고...&lt;br /&gt;500여개의 Client site에 이식하면서 많은 노하우를 쌓은듯...&lt;br /&gt;&lt;br /&gt;
&lt;DIV&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content vAlign=top&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;FIELDSET&gt;&lt;LEGEND&gt;&lt;STRONG&gt;Application Servers&lt;/STRONG&gt;&lt;/LEGEND&gt;
&lt;TABLE cellSpacing=0 cellPadding=8 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;BES&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Borland ES 6.5 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;GER&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Apache Geronimo 1.1&lt;br /&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;GLF&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Sun GlassFish 2.0 M2&lt;br /&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;JB&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;JBoss 4.0.3SP1, 4.0.4, 4.0.5&lt;br /&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;JFX&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;JFox&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;JON&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;JOnAS 4.4.3, 4.7.7&lt;br /&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;JR&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;JRun 4 Updater 3 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;O&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;OracleAS 10.1.3 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;ORI&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Orion 2.0.6 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;P&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Pramati 4.1 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;REX&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;RexIP 2.5 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;SUN&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Sun JSAS 8.01 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;WL&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;WebLogic 8.1 SP4, 9.2&lt;br /&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;WS&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Websphere 5.1, 6.0.x&lt;br /&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FIELDSET&gt;&lt;br /&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;
&lt;TD class=content width=10&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD class=content vAlign=top&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;FIELDSET&gt;&lt;LEGEND&gt;&lt;STRONG&gt;Servlet Containers&lt;/STRONG&gt;&lt;/LEGEND&gt;
&lt;TABLE cellSpacing=0 cellPadding=8 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;JET&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Jetty 5.1.4 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;RES&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Resin 3.0.14 &lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;TOM&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Tomcat 5.0.x/5.5.x &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FIELDSET&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;IMG height=4 alt=&quot;&quot; src=&quot;http://localhost:8080/portal/html/common//image/image_gallery?img_id=14&quot; width=1 border=0&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;FIELDSET&gt;&lt;LEGEND&gt;&lt;STRONG&gt;OS&lt;/STRONG&gt;&lt;/LEGEND&gt;
&lt;TABLE cellSpacing=0 cellPadding=8 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;P&gt;&lt;STRONG&gt;AIX&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;P&gt;&lt;STRONG&gt;BSD&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;Linux&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;Solaris&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;Windows&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;Mac OS X&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FIELDSET&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;
&lt;TD class=content width=10&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD class=content vAlign=top&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;FIELDSET&gt;&lt;LEGEND&gt;&lt;STRONG&gt;Databases&lt;/STRONG&gt;&lt;/LEGEND&gt;
&lt;TABLE cellSpacing=0 cellPadding=8 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;AD&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Apache Derby&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;DB2&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;IBM DB2&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;FIRE&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Firebird&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;HYP&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Hypersonic&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;INT&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;InterBase&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;JDS&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;JDataStore&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;MY&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;MySQL&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;O&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;Oracle&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;PSQL&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;PostgresSQL&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;SAP&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;SAP&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=content&gt;&lt;STRONG&gt;SQL&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD class=content&gt;&amp;nbsp; &amp;nbsp;&lt;/TD&gt;
&lt;TD class=content&gt;SQL Server&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FIELDSET&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;분석당시 많은 불만이 많았던...다큐먼팅은 많이 개선되었지만...아직도...T.T&lt;br /&gt;그러나 문서화면에서는 정말 많은 개선이 있는게 틀림없다.&lt;br /&gt;&lt;A href=&quot;http://www.liferay.com/web/guest/documentation&quot;&gt;http://www.liferay.com/web/guest/documentation&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS : LifeRay Portal의 Demo를 볼수도 있지만... 직접 설치함을 권장함....&lt;br /&gt;사이트 접속 매우 느림...T.T&lt;br /&gt;&lt;br /&gt;오랜만에 글을 써서 두서도 없고 정신도 없다는.... 보실분은 알아서 보실듯....T.T&lt;br /&gt;내일부터는 출퇴근하면서...TDD를 다시 연마 해야겠다는....&lt;br /&gt;흠.... 할게 많다. 말뿐인 아키텍트라는 말 안들으려면.... 할것도 많고... 볼것도 많고...&lt;br /&gt;여러가지 꾸준히 관심도 가져야 하고....&lt;br /&gt;&lt;br /&gt;많은 사람들도 알겠지만... 아키텍처가 어디 기술만 가지고 되더냐....&lt;br /&gt;가끔 기술베이스의 아키텍트를 보기도 하지만.... 기술이라는 거는 언젠가는 &lt;br /&gt;후배들이 차지하게 될텐데.... 게다가 기술은 끊임없이 빠르게 변한다.&lt;br /&gt;또한 경험이 많아야 아키텍트로서 살아 남지 않을까 싶다.&lt;br /&gt;어떤 아키텍트는 프레임워크 검증을 하라고 하면 어떤 사람들은 게시판을 만든다.&lt;br /&gt;그걸로 검증이 될까 ??&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;아키텍트는 두마리의 토끼를 잡아야 한다.&amp;nbsp; 기술, 비지니스.....&lt;br /&gt;기술과 비지니스를 결합하는게 S/W 아키텍트라고 말하고 싶다.&lt;br /&gt;&lt;br /&gt;</description>
			<category>SOA</category>
			<category>LifeRay</category>
			<category>TDD</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/124</guid>
			<comments>http://itgs.tistory.com/entry/LifeRay%EB%8F%84-%EB%B2%84%EC%A0%84%EC%9D%B4-%EC%98%AC%EB%9D%BC%EA%B0%80%EB%A9%B4%EC%84%9C-%EC%97%AC%EB%9F%AC%EA%B0%80%EC%A7%80-%EA%B8%B0%EC%88%A0%EC%9D%B4-%EB%8F%84%EC%9E%85-%EB%90%98%EC%97%88%EB%84%A4#entry124comment</comments>
			<pubDate>Sun, 22 Apr 2007 23:41:39 +0900</pubDate>
		</item>
		<item>
			<title>주인장 이메일 입니다. 연락하실분은 ^^</title>
			<link>http://itgs.tistory.com/entry/%EC%9E%98%EC%8D%A8%EB%A8%B9%EA%B3%A0-%EC%9E%88%EB%8B%A4-%EC%B9%9C%EA%B5%AC%EB%93%A4%ED%95%9C%ED%85%8C-%EC%9D%B4%EB%A9%9C-%EB%B3%B4%EB%82%BC%EB%95%8C%E3%85%8B%E3%85%8B%E3%85%8B</link>
			<description>&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #faffa9&quot;&gt;//잘써먹고 있다. 친구들한테 이멜 보낼때...ㅋㅋㅋ&lt;br /&gt;
&lt;P&gt;// 나와 대화하려면 이거 받으셔야... 제 이메일은 bG92ZUxhenVyQGdtYWlsLmNvbQ==&lt;br /&gt;// 연락주세요 ^^&lt;/P&gt;&lt;/DIV&gt;</description>
			<category>email</category>
			<category>주인장 이메일</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/121</guid>
			<comments>http://itgs.tistory.com/entry/%EC%9E%98%EC%8D%A8%EB%A8%B9%EA%B3%A0-%EC%9E%88%EB%8B%A4-%EC%B9%9C%EA%B5%AC%EB%93%A4%ED%95%9C%ED%85%8C-%EC%9D%B4%EB%A9%9C-%EB%B3%B4%EB%82%BC%EB%95%8C%E3%85%8B%E3%85%8B%E3%85%8B#entry121comment</comments>
			<pubDate>Thu, 19 Apr 2007 16:58:11 +0900</pubDate>
		</item>
		<item>
			<title>ISO 9126 QA</title>
			<link>http://itgs.tistory.com/entry/ISO-9126-QA</link>
			<description>&lt;P&gt;&lt;A href=&quot;http://en.wikipedia.org/wiki/ISO_9126&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #99cc66&quot;&gt;http://en.wikipedia.org/wiki/ISO_9126&lt;/FONT&gt;&lt;/A&gt;&lt;br /&gt;&lt;A href=&quot;http://www.giscampus.co.kr/webzine/charge_enrapport_05/2005_0506/yh/yhr/NT651i.pdf&quot; target=_blank&gt;click&lt;/A&gt;1&lt;br /&gt;&lt;A href=&quot;http://selab.cu.ac.kr/Data/Seminar/2006semi/data/pej_119.pdf&quot; target=_blank&gt;click2&lt;/A&gt;&lt;br /&gt;&lt;A href=&quot;http://comeng.andong.ac.kr/~kimyh/course/lecture/sa/ppt/0201.ppt&quot; target=_blank&gt;click3&lt;/A&gt;&lt;br /&gt;&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://itgs.tistory.com/attachment/dk0.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; 98-147.zip&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;
&lt;P&gt;&lt;br /&gt;ISO 9126 QA&lt;br /&gt;열심히 레포팅중... ^^&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #faffa9&quot;&gt;Functionality&lt;/FONT&gt;&lt;/STRONG&gt; - A set of attributes that bear on the existence of a set of functions and their specified properties. The functions are those that satisfy stated or implied needs.&lt;br /&gt;&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #faffa9&quot;&gt;Reliability&lt;/FONT&gt;&lt;/STRONG&gt; - A set of attributes that bear on the capability of software to maintain its level of performance under stated conditions for a stated period of time. &lt;br /&gt;&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #faffa9&quot;&gt;Usability&lt;/FONT&gt;&lt;/STRONG&gt; - A set of attributes that bear on the effort needed for use, and on the individual assessment of such use, by a stated or implied set of users. &lt;br /&gt;&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #faffa9&quot;&gt;Efficiency&lt;/FONT&gt;&lt;/STRONG&gt; - A set of attributes that bear on the relationship between the level of performance of the software and the amount of resources used, under stated conditions. &lt;br /&gt;&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #faffa9&quot;&gt;Maintainability&lt;/FONT&gt;&lt;/STRONG&gt; - A set of attributes that bear on the effort needed to make specified modifications. &lt;br /&gt;&lt;STRONG&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #faffa9&quot;&gt;Portability&lt;/FONT&gt;&lt;/STRONG&gt; - A set of attributes that bear on the ability of software to be transferred from one environment to another. &lt;br /&gt;&lt;br /&gt;상세도 있음. ^^&lt;/P&gt;</description>
			<category>S/W Architecture</category>
			<category>ISO 9126</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/120</guid>
			<comments>http://itgs.tistory.com/entry/ISO-9126-QA#entry120comment</comments>
			<pubDate>Mon, 16 Apr 2007 11:15:36 +0900</pubDate>
		</item>
		<item>
			<title>회사 집을 오가는 나의 생활</title>
			<link>http://itgs.tistory.com/entry/%ED%9A%8C%EC%82%AC-%EC%A7%91%EC%9D%84-%EC%98%A4%EA%B0%80%EB%8A%94-%EB%82%98%EC%9D%98-%EC%83%9D%ED%99%9C</link>
			<description>&lt;P&gt;현 프로젝트는 SOA프로젝트 .... &lt;br /&gt;컨설팅 기간도 엄청길고.... 최근 몇년간 차세대 프로젝트의 아키텍트로 일하면서 &lt;br /&gt;별별 일을 다 겪었다. 결론... 사람이 기술이나 비지니스 보다 우선하며 사람다음엔 비지니스 그다음엔 기술 순이었다. 그리고 로비는 가장 마지막이 되어가고 있다.&lt;br /&gt;상위레벨에서의 기술은 그져 비지니스를 충족하기 위한 무언가 일 뿐인 경우라고 생각하는 경영자가 많다.&lt;br /&gt;그런 갭을 줄이는게 나의 일이다. &lt;br /&gt;&lt;br /&gt;최근 1-2개월간 집과 회사만을 오가며 일을 하고 있다. 몸이 많이 망가진거 같다.&lt;br /&gt;대규모 프로젝트이기도 하고...할일도 많고....&lt;br /&gt;특히 생각해야 할 것들이 많고 보고서와 분석 레포트가 많아 지고 있다.&lt;br /&gt;보고서와&amp;nbsp; 분석 레포트 많아지면 일이 힘들어 지던데.... 거버넌스 혹은 무언가 부족한 상태인 것으로 보인다.&lt;br /&gt;&lt;br /&gt;여러가지 아키텍처 유형과 내가 가지고 있는 비지니스, 그리고 기술, 컨설팅 기법등에 있어 많은 충돌이 있었다.&lt;br /&gt;하나 크게 깨달은건 언제나 거버넌스는 중요하다라는 것이다.&lt;br /&gt;&lt;br /&gt;누가 이야기 했지..거버넌스 답없다고...그러나 답없지 않다고 생각한다. &lt;br /&gt;나의 비지니스가 성공해야 할텐데... 걱정도 많다.&lt;br /&gt;&lt;br /&gt;최근 나의 비지니스는 2가지로 일축된다.&lt;br /&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #c9edff&quot;&gt;- 회사 - 혁신이 필요하다. 회사 그리고 나....&lt;br /&gt;- 투자 - 투자의 경우 많은 혁신이 있었다. 매년 아무런 노력없이 부동산을 제외하고...&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1500~1000만원의 수익이 들어오고 있다. &lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #ffdaed&quot;&gt;그러나 집에는 내가 자리를 비운사이 우리 와이프가 많이 외로워하고 있었다. 이제 그 자리 채워야 하는데&lt;br /&gt;이만저만한 노력으로 되는게 아니다. 가정을 못지키는 상태에서 기업의 컨설팅이라니.... 여전히 반성중....&lt;/DIV&gt;
&lt;P&gt;여러 측면에서 회사의 관점에서 볼때 경영적인 기법이 필요할때가 아닌가 생각된다.&lt;br /&gt;좀더 객관적인 시각에서 사물을 바라봐야 할 시간인듯...&lt;br /&gt;&lt;br /&gt;며칠전 몇몇 후루꾸 ( ? ) 컨설턴트들을 만났다. 그들과의 2시간동안의 대화를 하면서 &lt;br /&gt;그들에게 컨설턴트라는 이름을 붙인 그 회사...&lt;br /&gt;양심도 없다 라는 생각이 든다. &lt;br /&gt;&lt;br /&gt;PS : 연동을 위해서 가장먼저 해야 할것은 BA, AA이다. BA, AA에서 연동이 시작된다라고 생각이 든다.&lt;br /&gt;여전히 아침엔 한손엔 책을 들고 저녁엔 서브 노트북으로 자료를 보면서 출퇴근을 한다. 하루가 24시간이 아니라 48시간이었으면 좋겠다.T.T&lt;/P&gt;</description>
			<category>나의생각</category>
			<author>TeddyLee</author>
			<guid>http://itgs.tistory.com/119</guid>
			<comments>http://itgs.tistory.com/entry/%ED%9A%8C%EC%82%AC-%EC%A7%91%EC%9D%84-%EC%98%A4%EA%B0%80%EB%8A%94-%EB%82%98%EC%9D%98-%EC%83%9D%ED%99%9C#entry119comment</comments>
			<pubDate>Sun, 15 Apr 2007 23:58:40 +0900</pubDate>
		</item>
		<item>
			<title>iBATIS, DAO, Spring and Middlegen code generation</title>
			<link>http://itgs.tistory.com/entry/iBATIS-DAO-Spring-and-Middlegen-code-generation</link>
			<description>&lt;DIV class=contentItemBody&gt;
&lt;P&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html&quot;&gt;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzYwMzFAZnMyLnRpc3RvcnkuY29tOi9hdHRhY2gvMC8xLmdpZg==&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzYwMzFAZnMyLnRpc3RvcnkuY29tOi9hdHRhY2gvMC8xLmdpZg==&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;294&quot; width=&quot;500&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I&#039;ve previously written a small &lt;A href=&quot;http://del.icio.us/&quot;&gt;del.icio.us&lt;/A&gt; clone using &lt;A href=&quot;http://www.hibernate.org/&quot;&gt;Hibernate&lt;/A&gt; where some of the code was generated using &lt;A href=&quot;http://boss.bekk.no/boss/middlegen/&quot;&gt;Middlegen&lt;/A&gt;. I like the Hibernate approach but it sometimes feels like a heavyweight approach for a simple application (e.g. sledgehammer to crack a walnut). &lt;/P&gt;
&lt;P&gt;I have looked at using Spring and the &lt;A href=&quot;http://www.springframework.org/docs/api/org/springframework/jdbc/core/JdbcTemplate.html&quot;&gt;JDBCTemplate&lt;/A&gt; looks like a nice way to handle JDBC access without the need to write all that tedious connection code and exception handling stuff. However, unless I go to great effort I&#039;d probably end up with SQL hard coded in my Java classes and I&#039;d need to do all the resultset to object mapping by hand. &lt;/P&gt;
&lt;P&gt;I discovered &lt;A href=&quot;http://ibatis.apache.org/&quot;&gt;iBATIS&lt;/A&gt; recently almost by accident. iBATIS used to be a commercial product but has now been donated to the Apache Foundation. iBATIS is an &lt;A href=&quot;http://en.wikipedia.org/wiki/Object-relational_mapping&quot;&gt;O/RM&lt;/A&gt;-like approach. Clinton Begin, iBATIS creator, says that &lt;I&gt;&quot;iBATIS is not an O/RM. It does not bind classes to tables, nor does is it limited to OO languages and/or relational databases&quot;&lt;/I&gt; and elsewhere iBATIS has been described as a convenience framework for JDBC. iBATIS does not offer some of the benefits that Hibernate does (database independence etc) but on the plus side it is very simple to use and even more so if you choose to use Spring&#039;s &lt;A href=&quot;http://www.springframework.org/docs/api/org/springframework/orm/ibatis/SqlMapClientTemplate.html&quot;&gt;SqlMapClientTemplate&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;I came across iBATIS as it was one of the technologies included as an example Jetspeed2 Portlet. iBATIS distribute JPetstore as an example of using Struts, DAO layer and iBATIS together. The Jetspeed2 version of the application uses the Struts bridge to convert the application into a portlet. The idea behind iBATIS is that all your SQL is kept in an external XML SQLMapping file. iBATIS then maps the returned result into a domain object. &lt;/P&gt;
&lt;P&gt;Spring includes support for iBATIS interaction. I spent a little time studying the iBATIS JPetstore example and a version of this which actually uses Spring is further explored in Bruce Tate and Justin Gehtland&#039;s book &lt;I&gt;Better, Faster, Lighter Java&lt;/I&gt; (excerpts of which can be found on the &lt;A href=&quot;http://www.onjava.com/&quot;&gt;OnJava&lt;/A&gt; web site [&lt;A href=&quot;http://www.onjava.com/pub/a/onjava/excerpt/BFLJava_chap8/index.html&quot;&gt;Demonstrating Spring&#039;s Finesse&lt;/A&gt;, &lt;A href=&quot;http://www.onjava.com/pub/a/onjava/excerpt/BFLJava_chap8/index1.html&quot;&gt;Persistence in Spring&lt;/A&gt;]). &lt;/P&gt;
&lt;P&gt;There is a Perl script which can be used to generate &lt;A href=&quot;http://alxeg.narod.ru/ibatis/index.html&quot;&gt;java-beans sources and sql-map config files generator&lt;/A&gt;. There is now also some iBATIS support inside Middlegen tool for the generation of iBATIS SQLMapping XML files and associated domain object &lt;A href=&quot;http://en.wikipedia.org/wiki/Plain_Old_Java_Object&quot;&gt;POJO&lt;/A&gt;s. Looking at the DAO approach used in &lt;I&gt;Better, Faster, Lighter Java&lt;/I&gt; and similarly using Spring&#039;s iBATIS support it seemed very possible to me that I could extend the existing iBATIS Middlegen Plugin so that it would generate the required DAO classes to implement the architecture shown in the diagram below. &lt;/P&gt;&lt;br /&gt;&amp;nbsp; 
&lt;P&gt;The default iBATIS Middlegen plugin generates the CRUD actions needed for the SQL mapping and creates the definition of each domain object. It was relatively straight forward to modify these basic examples to create DAO interfaces, DAO implementation (using Spring SQLMapClientTemplates) and also a Façade interface / implementation. &lt;/P&gt;
&lt;P&gt;To do this I had to learn a to use the &lt;A href=&quot;http://jakarta.apache.org/velocity/docs/vtl-reference-guide.html&quot;&gt;Velocity Templating Language (VTL)&lt;/A&gt; to extend Middlegen code but since I have some shell scripting and XSL experience this is not that daunting a task. &lt;/P&gt;
&lt;P&gt;Using the default Middlegen iBATIS plugin you can create an SQL Mapping file and domain object POJO class. For this example I have created a single Table called ITEM with one column containing an ITEM_ID. The generated iBATIS XML SQLMapping file is shown below. Notice how this contains the full range of CRUD operations. &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=TPoperator&gt;?&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;xml version&lt;/SPAN&gt;=&lt;SPAN class=TPchar&gt;&#039;1.0&#039;&lt;/SPAN&gt;&lt;SPAN class=TPoperator&gt;?&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;!DOCTYPE &lt;/SPAN&gt;sqlMap &lt;SPAN class=TPkeyword2&gt;PUBLIC &lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;-//iBATIS.com//DTD SQL Map 2.0//EN&quot;
    &quot;http://www.ibatis.com/dtd/sql-map-2.dtd&quot;&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;

&lt;SPAN class=TPcomment&gt;&amp;lt;!-- WARNING: This is an autogenerated file --&amp;gt;&lt;/SPAN&gt;

&lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;sqlMap&lt;SPAN class=TPkeyword1&gt;&amp;gt;        &lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;typeAlias alias=&lt;SPAN class=TPstring&gt;&quot;Item&quot; &lt;/SPAN&gt;type=&lt;SPAN class=TPstring&gt;&quot;mypackage.domain.Item&quot;&lt;/SPAN&gt;/&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=TPcomment&gt;&amp;lt;!--
    &amp;lt;cacheModel id=&quot;$table.destinationClassName-cache&quot; type=&quot;MEMORY&quot;&amp;gt;
        &amp;lt;flushInterval hours=&quot;24&quot;/&amp;gt;
        &amp;lt;flushOnExecute statement=&quot;insertItem&quot;/&amp;gt;
        &amp;lt;flushOnExecute statement=&quot;updateItem&quot;/&amp;gt;
        &amp;lt;flushOnExecute statement=&quot;deleteItem&quot;/&amp;gt;
        &amp;lt;property name=&quot;reference-type&quot; value=&quot;WEAK&quot; /&amp;gt;
    &amp;lt;/cacheModel&amp;gt;
        --&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;resultMap class=&lt;SPAN class=TPstring&gt;&quot;Item&quot; &lt;/SPAN&gt;id=&lt;SPAN class=TPstring&gt;&quot;Item-result&quot; &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;result
                property=&lt;SPAN class=TPstring&gt;&quot;itemId&quot;
                &lt;/SPAN&gt;javaType=&lt;SPAN class=TPstring&gt;&quot;java.lang.String&quot;
                &lt;/SPAN&gt;column=&lt;SPAN class=TPstring&gt;&quot;ITEM_ID&quot;
        &lt;/SPAN&gt;/&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;/resultMap&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;select id=&lt;SPAN class=TPstring&gt;&quot;getItem&quot;
        &lt;/SPAN&gt;resultClass=&lt;SPAN class=TPstring&gt;&quot;Item&quot;
        &lt;/SPAN&gt;parameterClass=&lt;SPAN class=TPstring&gt;&quot;Item&quot;
        &lt;/SPAN&gt;resultMap=&lt;SPAN class=TPstring&gt;&quot;Item-result&quot; &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;!&lt;SPAN class=TPbracket&gt;[&lt;/SPAN&gt;&lt;SPAN class=TPkeyword3&gt;CDATA&lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;[
            &lt;/SPAN&gt;select
                ITEM_ID
            from
                ITEM
            where
                ITEM_ID = #itemId#

        &lt;SPAN class=TPbracket&gt;]]&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;/select&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;update id=&lt;SPAN class=TPstring&gt;&quot;updateItem&quot;
        &lt;/SPAN&gt;parameterClass=&lt;SPAN class=TPstring&gt;&quot;Item&quot; &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;!&lt;SPAN class=TPbracket&gt;[&lt;/SPAN&gt;&lt;SPAN class=TPkeyword3&gt;CDATA&lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;[
            &lt;/SPAN&gt;update
                        ITEM
            set

            where
                ITEM_ID = #itemId#
        &lt;SPAN class=TPbracket&gt;]]&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;/update&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;insert id=&lt;SPAN class=TPstring&gt;&quot;insertItem&quot;
        &lt;/SPAN&gt;parameterClass=&lt;SPAN class=TPstring&gt;&quot;Item&quot; &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;!&lt;SPAN class=TPbracket&gt;[&lt;/SPAN&gt;&lt;SPAN class=TPkeyword3&gt;CDATA&lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;[
            &lt;/SPAN&gt;insert into ITEM
              &lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;ITEM_ID &lt;SPAN class=TPbracket&gt;)
            &lt;/SPAN&gt;values
              &lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;#itemId# &lt;SPAN class=TPbracket&gt;)
        ]]&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;/insert&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;delete id=&lt;SPAN class=TPstring&gt;&quot;deleteItem&quot; &lt;/SPAN&gt;parameterClass=&lt;SPAN class=TPstring&gt;&quot;Item&quot;  &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;!&lt;SPAN class=TPbracket&gt;[&lt;/SPAN&gt;&lt;SPAN class=TPkeyword3&gt;CDATA&lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;[
            &lt;/SPAN&gt;delete from ITEM where ITEM_ID = #itemId#
        &lt;SPAN class=TPbracket&gt;]]&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;/delete&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;

&lt;SPAN class=TPkeyword1&gt;&amp;lt;&lt;/SPAN&gt;/sqlMap&lt;SPAN class=TPkeyword1&gt;&amp;gt;&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;The default Middlegen iBATIS plugin will generate corresponding transparent domain object class (business objects), one per table. The domain should capture the relationships between the various system entities much as an Entity Relationship Diagram does and this is why we can generate this from the database directly. The generated classes are a &quot;bare&quot; platform into which you should expect to add more sophisticated behaviours. These really should contain behaviour as you&#039;ll probably recall from object oriented programming first principles a class should contain data and methods. Obviously the precise behaviour cannot be generically generated as it is likely to be domain object specific. If you do not add additional behaviour at this point you may be guilty of using &lt;A href=&quot;http://www.martinfowler.com/bliki/AnemicDomainModel.html&quot;&gt;an Anemic Domain Model.&lt;/A&gt; &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPkeyword1&gt;package &lt;/SPAN&gt;mypackage.domain;

&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;java.io.&lt;SPAN class=TPkeyword2&gt;Serializable&lt;/SPAN&gt;;
&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;java.sql.&lt;SPAN class=TPkeyword2&gt;Timestamp&lt;/SPAN&gt;;
&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;java.math.&lt;SPAN class=TPkeyword2&gt;BigDecimal&lt;/SPAN&gt;;
&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;org.apache.commons.lang.builder.HashCodeBuilder;

&lt;SPAN class=TPcomment&gt;/**
 * @author &amp;lt;a href=&quot;http://boss.bekk.no/boss/middlegen/&quot;&amp;gt;Middlegen&amp;lt;/a&amp;gt;
 *
 */&lt;/SPAN&gt;
&lt;SPAN class=TPkeyword1&gt;public class &lt;/SPAN&gt;Item &lt;SPAN class=TPkeyword1&gt;implements &lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;Serializable &lt;/SPAN&gt;
&lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
    &lt;SPAN class=TPcomment&gt;// fields&lt;/SPAN&gt;
    &lt;SPAN class=TPcomment&gt;/**
     * The itemId field
     */&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;private &lt;/SPAN&gt;java.lang.&lt;SPAN class=TPkeyword2&gt;String &lt;/SPAN&gt;itemId;

    &lt;SPAN class=TPcomment&gt;// getters/setters&lt;/SPAN&gt;
    &lt;SPAN class=TPcomment&gt;/**
     * Returns the itemId
     *
     * @return the itemId
     */&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;java.lang.&lt;SPAN class=TPkeyword2&gt;String &lt;/SPAN&gt;getItemId&lt;SPAN class=TPbracket&gt;() &lt;/SPAN&gt;
    &lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;return &lt;/SPAN&gt;itemId;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

    &lt;SPAN class=TPcomment&gt;/**
     * Sets the itemId
     *
     * @param newItemId the new itemId
     */&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;setItemId&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;java.lang.&lt;SPAN class=TPkeyword2&gt;String &lt;/SPAN&gt;newItemId&lt;SPAN class=TPbracket&gt;) {&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;this&lt;/SPAN&gt;.itemId &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;newItemId;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;


    &lt;SPAN class=TPcomment&gt;/**
     *  Implementation of equals method.
     */&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;public boolean &lt;/SPAN&gt;equals&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;Object &lt;/SPAN&gt;object&lt;SPAN class=TPbracket&gt;) &lt;/SPAN&gt;
    &lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;if &lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;this &lt;/SPAN&gt;&lt;SPAN class=TPoperator&gt;== &lt;/SPAN&gt;object&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;
        &lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
            &lt;SPAN class=TPkeyword1&gt;return true&lt;/SPAN&gt;;
        &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;if &lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPoperator&gt;!&lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;object &lt;SPAN class=TPkeyword1&gt;instanceof &lt;/SPAN&gt;Item&lt;SPAN class=TPbracket&gt;))&lt;/SPAN&gt;
        &lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
            &lt;SPAN class=TPkeyword1&gt;return false&lt;/SPAN&gt;;
        &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
        Item other &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;object;
        &lt;SPAN class=TPkeyword1&gt;return&lt;/SPAN&gt;
                  &lt;SPAN class=TPkeyword1&gt;this&lt;/SPAN&gt;.itemId.equals&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;other.itemId&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;      &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

     &lt;SPAN class=TPcomment&gt;/**
      * Implementation of hashCode method that supports the
      * equals-hashCode contract.
      */&lt;/SPAN&gt;
&lt;SPAN class=TPcomment&gt;/*
    public int hashCode()
    {
        return
             hashCode(this.itemId);     }
*/&lt;/SPAN&gt;
     &lt;SPAN class=TPcomment&gt;/**
      * Implementation of hashCode method that supports the
      * equals-hashCode contract.
      */&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;public int &lt;/SPAN&gt;hashCode&lt;SPAN class=TPbracket&gt;() &lt;/SPAN&gt;
    &lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
        &lt;SPAN class=TPcomment&gt;// TODO generate random number following the contract&lt;/SPAN&gt;
        HashCodeBuilder builder &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;new &lt;/SPAN&gt;HashCodeBuilder&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPnumber&gt;17&lt;/SPAN&gt;,&lt;SPAN class=TPnumber&gt;37&lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
        &lt;SPAN class=TPkeyword1&gt;return &lt;/SPAN&gt;builder
            .append&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;itemId&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;
            .toHashCode&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

    &lt;SPAN class=TPcomment&gt;/**
     *  Implementation of toString that outputs this object id&#039;s
     *  primary key values.
     */&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;String &lt;/SPAN&gt;toString&lt;SPAN class=TPbracket&gt;() &lt;/SPAN&gt;
    &lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword2&gt;StringBuffer &lt;/SPAN&gt;buffer &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;new &lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;StringBuffer&lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;;
        buffer.append&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;itemId=&quot;&lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
        buffer.append&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;this&lt;/SPAN&gt;.itemId&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
            &lt;SPAN class=TPkeyword1&gt;return &lt;/SPAN&gt;buffer.toString&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;;
        &lt;SPAN class=TPcomment&gt;/*
        return
             this.itemId;           */&lt;/SPAN&gt;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;I created Middlegen iBATIS Plugin extensions to generate the next few classes. This is an example of a generated DAO interface class. There will be one DAO interface class per domain object (i.e. one per table). &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPkeyword1&gt;package &lt;/SPAN&gt;mypackage.iface;

&lt;SPAN class=TPkeyword1&gt;import  &lt;/SPAN&gt;mypackage.domain.Item;

&lt;SPAN class=TPkeyword1&gt;public interface &lt;/SPAN&gt;ItemDao
&lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;Item getItem&lt;SPAN class=TPbracket&gt;( &lt;/SPAN&gt;java.lang.&lt;SPAN class=TPkeyword2&gt;String &lt;/SPAN&gt;itemId&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;insertItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;updateItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;deleteItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;

&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;This is DAO implementation of the above interface using Spring&#039;s SqlMappingClientTemplate, again there will be one of these per domain object (i.e. one per table): &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPkeyword1&gt;package &lt;/SPAN&gt;mypackage.sqlmapdao;

&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;mypackage.domain.Item;
&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;mypackage.iface.ItemDao;
&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

&lt;SPAN class=TPkeyword1&gt;public class &lt;/SPAN&gt;SqlMapItemDao &lt;SPAN class=TPkeyword1&gt;extends &lt;/SPAN&gt;SqlMapClientDaoSupport &lt;SPAN class=TPkeyword1&gt;implements &lt;/SPAN&gt;ItemDao
&lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;Item getItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;java.lang.&lt;SPAN class=TPkeyword2&gt;String &lt;/SPAN&gt;itemId&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
        Item item &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;new &lt;/SPAN&gt;Item&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;;
        item.setItemId&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;itemId&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPkeyword1&gt;return &lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item&lt;SPAN class=TPbracket&gt;) &lt;/SPAN&gt;getSqlMapClientTemplate&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;.queryForObject&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;getItem&quot;&lt;/SPAN&gt;,item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;insertItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;) {&lt;/SPAN&gt;
        getSqlMapClientTemplate&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;.insert&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;insertItem&quot;&lt;/SPAN&gt;,item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;updateItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
        getSqlMapClientTemplate&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;.update&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;updateItem&quot;&lt;/SPAN&gt;,item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;deleteItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
        getSqlMapClientTemplate&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;.delete&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;deleteItem&quot;&lt;/SPAN&gt;,item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;In this most simple example the usage of a façade seems fairly pointless. The idea comes into it&#039;s own when you start to have more than one table of data represented in your domain. A façade collects all the publicly accessible DAO methods into a single interface. It also serves as an attachment point for other services, such as transaction support. In writing a Struts Action you would query against the façade rather than trying to obtain a DAO method directly. There will be only one instance of the façade layer interface and implementation it will likely contain references to all the DAO interfaces for every publicly accessible domain object. &lt;/P&gt;
&lt;P&gt;See &lt;A href=&quot;http://www.onjava.com/pub/a/onjava/excerpt/BFLJava_chap8/index1.html&quot;&gt;Persistence in Spring&lt;/A&gt; for more details about why we might want to generate a façade interface and implementation. &lt;/P&gt;
&lt;P&gt;Façade interface: &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPkeyword1&gt;package &lt;/SPAN&gt;mypackage.domain.logic;

&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;mypackage.domain.Item;

&lt;SPAN class=TPkeyword1&gt;public interface &lt;/SPAN&gt;Façade
&lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;Item getItem&lt;SPAN class=TPbracket&gt;( &lt;/SPAN&gt;java.lang.&lt;SPAN class=TPkeyword2&gt;String &lt;/SPAN&gt;itemId&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;insertItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;updateItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;deleteItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;

&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;Façade implementation: &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPkeyword1&gt;package &lt;/SPAN&gt;mypackage.domain.logic;

&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;mypackage.iface.ItemDao;
&lt;SPAN class=TPkeyword1&gt;import &lt;/SPAN&gt;mypackage.domain.Item;

&lt;SPAN class=TPkeyword1&gt;public class &lt;/SPAN&gt;FaçadeImpl &lt;SPAN class=TPkeyword1&gt;implements &lt;/SPAN&gt;Façade
&lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;private &lt;/SPAN&gt;ItemDao itemDao;

&lt;SPAN class=TPcomment&gt;//-------------------------------------------------------------------------&lt;/SPAN&gt;
&lt;SPAN class=TPcomment&gt;// Setter methods for dependency injection&lt;/SPAN&gt;
&lt;SPAN class=TPcomment&gt;//-------------------------------------------------------------------------&lt;/SPAN&gt;


    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;setItemDao&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;ItemDao itemDao&lt;SPAN class=TPbracket&gt;) {&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;this&lt;/SPAN&gt;.itemDao &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;itemDao;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

&lt;SPAN class=TPcomment&gt;//-------------------------------------------------------------------------&lt;/SPAN&gt;
&lt;SPAN class=TPcomment&gt;// Operation methods, implementing the Façade interface&lt;/SPAN&gt;
&lt;SPAN class=TPcomment&gt;//-------------------------------------------------------------------------&lt;/SPAN&gt;



    &lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;Item getItem&lt;SPAN class=TPbracket&gt;( &lt;/SPAN&gt;java.lang.&lt;SPAN class=TPkeyword2&gt;String &lt;/SPAN&gt;itemId&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
    	&lt;SPAN class=TPkeyword1&gt;return this&lt;/SPAN&gt;.itemDao.getItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;itemId&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;insertItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;this&lt;/SPAN&gt;.itemDao.insertItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;updateItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;this&lt;/SPAN&gt;.itemDao.updateItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

    &lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;deleteItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item item&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
        &lt;SPAN class=TPkeyword1&gt;this&lt;/SPAN&gt;.itemDao.deleteItem&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
    &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;As you can see from the above examples, I have now extended the Middlegen iBATIS Plugin to create a simple version of the entire Spring based DAO layer code. I&#039;m currently looking into generating more complex domain relationship behaviour but this has so far only been slightly hampered by my limited VTL scripting skills but it is certainly possible to do this with Middlegen as the Hibernate and EJB plugins produce something similar. I am hoping to better capture &lt;I&gt;one-to-many&lt;/I&gt; relationships in the domain model so that I can detect these and generate appropriate SQLMapping and Java code. For example if we added a new domain object called CATEGORY it might contain many ITEMS and could therefore our Category domain object might contain: &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPkeyword1&gt;private &lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;List &lt;/SPAN&gt;items;

&lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;List &lt;/SPAN&gt;getItems&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;
&lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;return &lt;/SPAN&gt;items;
&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

&lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;setItems&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;List &lt;/SPAN&gt;items&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;
&lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
    &lt;SPAN class=TPkeyword1&gt;this&lt;/SPAN&gt;.items &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;items;
&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;The following could be generated inside an appropriate XML SQL Mapping file: &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPoperator&gt;&amp;lt;&lt;/SPAN&gt;select
    id&lt;SPAN class=TPoperator&gt;=&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;getItemsByCategoryCode&quot;&lt;/SPAN&gt;
    parameterClass&lt;SPAN class=TPoperator&gt;=&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;java.lang.String&quot;&lt;/SPAN&gt;
    resultMap&lt;SPAN class=TPoperator&gt;=&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;itemMap&quot;&lt;/SPAN&gt;&lt;SPAN class=TPoperator&gt;&amp;gt;        &lt;/SPAN&gt;
    select
        item_id,
        item_name,
        category_code
    from
        items
    where
        category_code &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;#value#;
&lt;SPAN class=TPoperator&gt;&amp;lt;/&lt;/SPAN&gt;select&lt;SPAN class=TPoperator&gt;&amp;gt;&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;&lt;SMALL&gt;&lt;FONT size=2&gt;* where &lt;B&gt;itemMap&lt;/B&gt; is already defined someplace.&lt;/FONT&gt;&lt;/SMALL&gt; &lt;/P&gt;
&lt;P&gt;The Spring DAO implementation of this could then look something like: &lt;/P&gt;&lt;PRE class=codeSample&gt;&lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;List &lt;/SPAN&gt;findItems&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Category category&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
    getSqlMapClientTemplate&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;.queryForList&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;getItemsByCategoryCode&quot;&lt;/SPAN&gt;,category&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;

&lt;SPAN class=TPkeyword1&gt;public void &lt;/SPAN&gt;createCategoryWithItems&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Category category&lt;SPAN class=TPbracket&gt;){&lt;/SPAN&gt;
    getSqlMapClientTemplate&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;.execute&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;new &lt;/SPAN&gt;SqlMapClientCallback&lt;SPAN class=TPbracket&gt;() {&lt;/SPAN&gt;
         &lt;SPAN class=TPkeyword1&gt;public &lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;Object &lt;/SPAN&gt;doInSqlMapClient&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;SqlMapExecutor executor&lt;SPAN class=TPbracket&gt;) &lt;/SPAN&gt;&lt;SPAN class=TPkeyword1&gt;throws &lt;/SPAN&gt;&lt;SPAN class=TPkeyword2&gt;SQLException &lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;{&lt;/SPAN&gt;
                 executor.startBatch&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;;
        &lt;SPAN class=TPkeyword1&gt;for &lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Iterator it&lt;SPAN class=TPoperator&gt;=&lt;/SPAN&gt;category.getItems&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;.iterator&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;; it.hasNext&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;; &lt;SPAN class=TPbracket&gt;) {&lt;/SPAN&gt;
                Item item &lt;SPAN class=TPoperator&gt;= &lt;/SPAN&gt;&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;Item&lt;SPAN class=TPbracket&gt;) &lt;/SPAN&gt;it.next&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;;
                executor.insert&lt;SPAN class=TPbracket&gt;(&lt;/SPAN&gt;&lt;SPAN class=TPstring&gt;&quot;insertItem&quot;&lt;/SPAN&gt;, item&lt;SPAN class=TPbracket&gt;)&lt;/SPAN&gt;;
            &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
                 executor.executeBatch&lt;SPAN class=TPbracket&gt;()&lt;/SPAN&gt;;
                 &lt;SPAN class=TPkeyword1&gt;return null&lt;/SPAN&gt;;
         &lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
 &lt;SPAN class=TPbracket&gt;})&lt;/SPAN&gt;;
&lt;SPAN class=TPbracket&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;P&gt;Nothing that I have generated so far is especially complicated but it is still nice to be able to generate basic business objects and a working DAO layer without much effort. I&#039;d be happy to share the Velocity templates that I used to create these classes. &lt;/P&gt;
&lt;DIV class=tags&gt;Tags : &lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/tags/spring&quot; rel=tag&gt;spring&lt;/A&gt; &lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/tags/middlegen&quot; rel=tag&gt;middlegen&lt;/A&gt; &lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/tags/ibatis&quot; rel=tag&gt;ibatis&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#trackbacks&quot;&gt;TrackBacks[0]&lt;/A&gt; &lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comments&quot;&gt;Comments[12]&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Posted by markmc on 12 December 2005 17:29:55 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=contentItem&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;Comments&lt;/DIV&gt;
&lt;DIV class=subtitle&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class=odd style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1134461229466&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;&lt;A name=comment1134461229466&gt;Re: iBATIS, DAO, Spring and Middlegen code generation&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Comment from &lt;A title=http://olivierziller.blogspot.com href=&quot;http://olivierziller.blogspot.com/&quot; target=_blank rel=nofollow&gt;Olivier Ziller&lt;/A&gt; on 13 December 2005 08:07:09 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1134461229466 href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1134461229466&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=responseBody&gt;hello, i think you should take a look at http://ibatis.apache.org/abator.html &lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=even style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1134462633455&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;&lt;A name=comment1134462633455&gt;Re: iBATIS, DAO, Spring and Middlegen code generation&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Comment from &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/ href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/&quot; target=_blank rel=nofollow&gt;markmc&lt;/A&gt; on 13 December 2005 08:30:33 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1134462633455 href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1134462633455&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=responseBody&gt;Abator looks cool but is there anyway it could be run from Ant as I find Eclipse awkward to use. My preference is to use Netbeans. &lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=odd style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 16px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1134509423466&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;&lt;A name=comment1134509423466&gt;Re: iBATIS, DAO, Spring and Middlegen code generation&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Comment from Olivier Ziller on 13 December 2005 21:30:23 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1134509423466 href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1134509423466&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=responseBody&gt;&quot;The core code generation functionality of Abator does not require Eclipse, and can be run as a standalone JAR - I&#039;ll post some instructions about how to do that if anyone is interested.&quot; i tkink you could ask this question on the ibatis list. &lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=even style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1134552504641&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;&lt;A name=comment1134552504641&gt;Re: iBATIS, DAO, Spring and Middlegen code generation&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Comment from &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/ href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/&quot; target=_blank rel=nofollow&gt;markmc&lt;/A&gt; on 14 December 2005 09:28:24 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1134552504641 href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1134552504641&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=responseBody&gt;Hi Olivier, 
&lt;P&gt;I downloaded Abator yesterday and had a little look at. I took a look at the source code and very impressive it was too but from what I have seen so far it did not look very extensible. &lt;/P&gt;
&lt;P&gt;Compare iBATIS Abator code that generates the domain bean: &lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://svn.apache.org/repos/asf/ibatis/trunk/java/mapper/mapper2/tools/abator/org.apache.ibatis.abator.core/src/org/apache/ibatis/abator/core/internal/java/JavaModelGeneratorDefaultImpl.java&quot; rel=nofollow&gt;JavaModelGeneratorDefaultImpl.java&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;with the Middlegen velocity template that does the same job: &lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://cvs.sourceforge.net/viewcvs.py/*checkout*/middlegen/middlegen/plugins/ibatis/src/middlegen/plugins/ibatis/iBatis-bean.vm&quot; rel=nofollow&gt;iBatis-bean.vm&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Middlegen is a free general-purpose database-driven code generation engine which uses Velocity templating. It is used in communities other than iBATIS (including Hibernate) and so therefore has the advantage that it is a little more widely used and tested. &lt;/P&gt;
&lt;P&gt;Say for example I wanted to add something to all my insertXXX DAO methods, using Abator I would have to modify the Java generation source code and recompile it. If I wanted to make a change to a particular generated method using Middlegen I would only need to modify a Velocity template file, which is very easy to do. &lt;/P&gt;
&lt;P&gt;I&#039;m sure the code that Abator produces is probably a little superior to what the iBATIS Middlegen plugin currently produces but this is easily remedied. I will certainly take a look at the source code that Abator produces once I manage to get it working! &lt;/P&gt;
&lt;P&gt;For the reason that it is easily configurable, extensible and more widely used, I would expect in the future I would still choose to use Middlegen rather than iBATIS Abator to generate my iBATIS related code. &lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=odd style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1135033539359&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;&lt;A name=comment1135033539359&gt;Re: iBATIS, DAO, Spring and Middlegen code generation&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Comment from Othon Sanchez on 19 December 2005 23:05:39 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1135033539359 href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1135033539359&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=responseBody&gt;First, i have to say thanks for this article. Second, i&#039;m trying to implement ibatis, spring and JSF. Not so hard until now but i have a special requirement, i need to handle the transaction in a EXTERNAL way, like the documentation of iBatis suggest. My quesyion is, Do you know how can i implement iBatis and Spring handling by my own the transaction??. DO i need to configurate something else in the applicationContext.xml or dataAccessContext-xxx.xml?. Anyway, thanks fro your help &lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=even style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1135076697216&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;&lt;A name=comment1135076697216&gt;Re: iBATIS, DAO, Spring and Middlegen code generation&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Comment from &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/ href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/&quot; target=_blank rel=nofollow&gt;markmc&lt;/A&gt; on 20 December 2005 11:04:57 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1135076697216 href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1135076697216&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=responseBody&gt;Hi Othon, 
&lt;P&gt;I started replying to this and it got too large to be a comment, so I&#039;ve added a new blog entry called &lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/20/1135076527290.html&quot; rel=nofollow&gt;Transaction Management with iBATIS and Spring&lt;/A&gt; for you. &lt;/P&gt;
&lt;P&gt;Hope it helps, &lt;/P&gt;Mark &lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=odd style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1136630247314&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;&lt;A name=comment1136630247314&gt;Re: iBATIS, DAO, Spring and Middlegen code generation&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Comment from &lt;A title=http://www.edinburghwebservices.co.uk href=&quot;http://www.edinburghwebservices.co.uk/&quot; target=_blank rel=nofollow&gt;John Boyes&lt;/A&gt; on 07 January 2006 10:37:27 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1136630247314 href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1136630247314&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=responseBody&gt;Thanks for the article Mark, very informative. I was about to use Abator but after some research agree with your conclusions and am also going to go with middlegen - customisation of the generated code is a crucial factor and easier with middlegen at present as you say. Would be very interested in seeing the velocity templates and any java modifications you made to the middlegen ibatis plugin, as I&#039;m about to embark on the same dao-generating exercise. Thanks, John &lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=even style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1136801082195&quot;&gt;Reply&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=title&gt;&lt;A name=comment1136801082195&gt;Re: iBATIS, DAO, Spring and Middlegen code generation&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=metadata&gt;Comment from &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/ href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/&quot; target=_blank rel=nofollow&gt;markmc&lt;/A&gt; on 09 January 2006 10:04:42 GMT &lt;A title=http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1136801082195 href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/2005/12/12/1134408595646.html#comment1136801082195&quot;&gt;#&lt;/A&gt; &lt;/DIV&gt;
&lt;DIV class=responseBody&gt;Hi John, 
&lt;P&gt;I have extended &lt;A href=&quot;http://www.mail-archive.com/middlegen-user@lists.sourceforge.net/msg01881.html&quot; rel=nofollow&gt;Takashi Okamoto&#039;s Middlegen/iBATIS plugin modifications&lt;/A&gt;. (I&#039;m not actually sure how it differs from the iBATIS plugin currently in the Middlegen CVS). &lt;/P&gt;
&lt;P&gt;The following &quot;distribution&quot; contains iBATIS plugin source plus my modifications (I make no claims about production worthiness) and the sample iBATIS/Middlegen application. I have modified the sample application to additionally use Apache Derby and Spring. I&#039;ve also added one or two extra ant targets so the process would now be: &lt;/P&gt;
&lt;P&gt;ant create-tables&lt;br /&gt;ant middlegen&lt;br /&gt;ant compile&lt;br /&gt;ant run&lt;br /&gt;&lt;/P&gt;&lt;A href=&quot;http://www.bris.ac.uk/is/projects/portal/team/mark/middlegen-2.1.zip&quot; rel=nofollow&gt;middlegen-2.1.zip&lt;/A&gt; [8.2Mb] &lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=odd style=&quot;PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px&quot;&gt;
&lt;DIV class=&quot;response approved&quot;&gt;
&lt;DIV class=contentItemLinks&gt;&lt;A href=&quot;http://cse-mjmcl.cse.bris.ac.uk/blog/replyToBlogEntry.action?entry=1134408595646&amp;amp;comment=1138624279770&qu