2008/09/11 21:54

Struts2 + Spring2 + iBatis

1.WEB-INF/lib 에 위치할 jar파일

Struts2관련

           commons-fileupload.jar

           commons-io.jar

           freemarker.jar

           ognl.jar

           struts2-core.jar

           xwork.jar

Spring관련

           Struts2-spring-plugin.jar

           Spring.jar

ibatis 및 DBCP, log4j, JSTL 기타등등

           commons-dbcp.jar

           commons-logging.jar

           commons-pool.jar

           ibatis.jar

           log4j.jar

           jstl.jar

           standard.jar

           sqljdbc.jar

           commons-collection.jar

           commons-lang.jar



2.web.xml

           스트러츠2 관련

<filter>

         <filter-name>struts2</filter-name>

        <filter-class>

            org.apache.struts2.dispatcher.FilterDispatcher

        </filter-class>

</filter>


<filter-mapping>

        <filter-name>struts2</filter-name>

        <url-pattern>/*</url-pattern>

</filter-mapping>


          

스프링 관련

<!--컨텍스트 로더 리스너에서 읽는 applicationContext 설정 파일 위치 지정-->

<context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>

            /WEB-INF/applicationContext*.xml

        </param-value>

  </context-param>

          

<!--컨텍스트 로더 리스너 지정-->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>



3.applicationContext.xml


dtd 선언

<beans xmlns="http://www.springframework.org/schema/beans"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http:/www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

       http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">


jdbc.property 파일 로딩(DB 접속 관련 정보)

<bean id="propertyConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

        <property name="locations">

        <list>

                    <value>WEB-INF/config/jdbc.properties</value>

        </list>

        </property>

        <property name="fileEncoding">

        <value>UTF-8</value>

        </property>

</bean>


<!--apache의 DBCP Connection Pool 사용-->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

 destroy-method="close">

        <property name="driverClassName" value="${jdbc.driverClassName}"/>

        <property name="url" value="${jdbc.url}"/>

        <property name="username" value="${jdbc.username}"/>

        <property name="password" value="${jdbc.password}"/>

 </bean>



<!--iBATIS SQLMaps의 설정 SqlMap setup for iBATIS Database Layer -->

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

           <property name="configLocation">

                     <value>WEB-INF/config/sqlmapConfig.xml</value>

           </property>

           <property name="dataSource" ref="dataSource"/>

</bean>



<!--Transaction manager for iBATIS Daos

DB연결에 관련된 설정을 DataSource 형태로 지정을 했기 때문에 Transaction 관리를 Spring의 DataSourceTransactionManager가         담당하도록 지정한다.-->

<bean id="txManager"

                     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource">

        <ref local="dataSource"/>

        </property>

</bean>

   

<!-- Enable @Transactional support

Business Logic 클래스(여기서는 *ServiceImpl 클래스)에 어노테이션으로 한줄로 해결 할수 있다는데 확실히 아직 모르겠음. 그외 방법으로 Spring의 AOP, Advice를 이용 -->

<tx:annotation-driven transaction-manager="txManager"/>



4.sqlmapConfig.xml

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<!--

elecment XML 파일을 이용하여 build되는 다양한 옵션과 SQL Map Client instance를

최적화 하기 위한 설정들 이다.

setting element 와 모든 attributes는 모두 선택옵션이다.

-->

<sqlMapConfig>

   <settings      cacheModelsEnabled="true"         classInfoCacheEnabled="true"

                     errorTracingEnabled="true"          enhancementEnabled="true"

                     lazyLoadingEnabled="true"          maxRequests="512"

                     maxSessions="128"                   maxTransactions="32"

                     useStatementNamespaces="true" />

                 

<!- 해당 SQL문서 위치-a

  <sqlMap resource="com/rainmac/dao/ibatis/board-dao.xml"/>

  <sqlMap resource="com/rainmac/dao/ibatis/user-dao.xml"/>

  <sqlMap resource="com/rainmac/dao/ibatis/attachFile-dao.xml"/>


</sqlMapConfig>



5.struts.xml

<struts>

<constant name="struts.objectFactory" value="spring" />

<package name="default" extends="struts-default" >

<action name="main" method="main" class="mainAction">

                     <result>/main.jsp</result>

                     <result name="input">/main.jsp</result>

</action>                   

</package>


<include file="/com/rainmac/action/user.xml" />

           <include file="/com/rainmac/action/board.xml"/>

           <include file="/com/rainmac/action/attachFile.xml"/>           

</struts>



6.board.xml


<package name="board" namespace="/board" extends="struts-default">

          <!-- Board -->

        <action name="boardList" method="boardList" class="boardAction" >

            <result name="success">/view/board/boardList.jsp</result>

            <result name="input">/view/board/boardList.jsp</result>

        </action>

<action name="boardUpdate" method="boardUpdate" class="boardAction">

            <result type="chain" name="success">boardList</result>

        </action>

</package>



7. applicationContext.xml


<bean id="boardService" class="com.rainmac.serviceImpl.BoardServiceImpl">

        <property name="boardDao" ref="boardDao"/>

        <property name="articleDao" ref="articleDao"/>

        <property name="attachFileService" ref="attachFileService"/>

</bean>

<bean id="boardDao" class="com.rainmac.dao.ibatis.BoardDaoiBatis">

        <property name="sqlMapClient" ref="sqlMapClient"/>

</bean>

<bean id="boardAction" class="com.rainmac.action.BoardAction" scope="prototype">

        <property name="boardService" ref="boardService"/>

        <property name="articleService" ref="articleService"/>

        <property name="userService" ref="userService"/>

</bean>


Spring IOC 란?

IOC (Inversion of Control)

역제어라는 뜻으로 제어권의 반환을 뜻한다.

기존의 개발자들이  New 연산자, 인터페이스 호출, 팩토리 호출방식으로
객체의 인스턴스를 생성함으로 인스턴스 생성 방법에 대한 제어권을 개발자들이 가지고 있었다.
IOC 란 인스턴스 생성의 제어를  개발자 본인이 아닌 다른 누군가에게 반환 준다는 개념이다.
여기서 말하는 다른 누군가란 EJB, Servlet 등 bean을 관리해 주는 컨테이너이다.
즉 IOC 란 인스턴스의 생성부터 소멸까지의 인스턴스의 생명주기 관리를 내가 아닌 컨테이너가 대신 해준다는 뜻이다.


Spring 컨테이너

Spring 컨테이너는 IOC를 지원한다. Spring 컨테이너란 beans 를 관리하고 애플리케이션 중요 부분을 형성한다.
즉 Spring 컨테이너는 메타데이터(xml 설정)를 통해  bean를 인스턴스화 하고 이를 조합하여 관리하는 역할을 한다.
컨테이너는 관리되는 bean 들을 의존성 삽입(Dependency Injection)을 통해 IOC 를 지원한다. 


DI (Dependency Injection)
DI(의존성 삽입) 은 Spring 컨테이너가 IOC 를 지원하는 새로운 형태다.

DI는  클래스 사이의 의존관계를 빈 설정정보를 바탕으로 컨테이너가 자동적으로 연결해 주는 것을 의미한다.
Spring 컨테이너가 지원하는 DI 는 두가지 유형이 있다.


- Setter Injection
Setter Method를 명시하여 자동적으로 의존성 삽입이 이루어 지는 유형


- Constructor Injection

인자를 가지고 있는 생성자를 호출 할때 의존성 삽입이 이루어 지는 유형 



8.BoardServiceImpl.java

public class BoardServiceImpl implements BoardService{

             private BoardDao boardDao;

             private AttachFileService attachFileService;

             private ArticleDao articleDao;

            

             public void setArticleDao(ArticleDao articleDao) {

                           this.articleDao = articleDao;

             }

             public void setAttachFileService(AttachFileService attachFileService) {

                           this.attachFileService = attachFileService;

             }


             public void setBoardDao(BoardDao boardDao) {

                           this.boardDao = boardDao;

             }

public List getBoards() {

                          return boardDao.getBoards();

             }

             public Object getBoardInfo(HashMap<String, Object> map){

                          return boardDao.getBoardInfo(map);

             }

}



9.흐름

*Action >> *Service(Interface) >> *ServiceImpl >> *DAO(Interface) >> *DaoiBatis


출처 : http://purehani.egloos.com/tb/1511164 노르웨이숲님의 블로그..

Trackback 0 Comment 0