2012년 8월 24일
Spring 프레임워크와 iBatis를 연동
목적 :
Spring 프레임워크와 iBatis를 연동한다.
준비물 :
1. JDK : JDK 1.5 이상 설치되어있어야 함
2. 웹서버 : 아파치 톰캣 5.5.23
3. 라이브러리 : Spring프레임워크 1.2.9 (다운로드 : http://www.springframework.org/download)
4. 라이브러리 : iBatis 2.3 (다운로드 : http://ibatis.apache.org/javadownloads.cgi)
5. 개발툴 : WTP (이클립스 플러그인) (다운로드 : http://www.eclipse.org/downloads/)
By Project에서 이클립스랑 통합된 All-in-one 버전을 추천
6. 지식 수준 : Java, 서블릿 사용가능, J2EE환경에 대한 기초지식
시작하기 전에 :
1. JDK 1.5 이상이 설치 되어있어야 한다.
2. tomcat 5.5.23 이 설치 되어있어야 한다.
3. 개발툴이 설치되어 있어야 한다.
시작 :
모두 다운로드 받았으면
[1. 프로젝트 생성 및 lib 넣어주기]
이클립스(WTP)에서 다이나믹 웹 프로젝트를 만들고
spring jar와 ibatis 관련 jar등을 lib 폴더에 넣어준다.
그 외에 common 관련 lib 들도 넣어주고..
jdbc용 라이브러리들도 넣어줘야 한다.
(이 부분이 좀.. 불친절해서 시간이 더 소요될지도 모르겠다..)
[2. web.xml 설정]
그리고 WEB-INF 폴더 밑에 있는 web.xml 을 수정한다.
<web-app>
<display-name>licenceweb</display-name>
노드 아래에
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dataAccessContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
어플리케이션 설정과
DB설정을 위해 이 부분을 추가하고
<servlet>
<servlet-name>licenceweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>licenceweb</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
스프링 연동을 위해 서블릿 설정을 한다.
보너스로 톰캣 인코딩 설정을 위해(post, get 파라미터용, 한글이 안 깨지도록)
<!-- 인코딩 필더 설치 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
을 추가한다.
[3. licenceweb-servlet.xml 설정]
(* licenceweb은 디스플레이 이름과 동일하게..다른 걸로 바꾸었다면 그 이름으로 한다.)
spring을 위한 xml 설정파일이다.
기본적으로 루트는 <beans>로 시작하고
그 하위 노드를 추가한다.
<!-- ========================= VIEW DEFINITIONS ========================= -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
VIEW를 위해서 정의하고.
(이 부분의 역할은 서버의 view에서 넘겨줄 페이지를 위해 prefix랑 suffix를 설정하는 부분..
추후에 자세히 설명하겠다..)
<!-- ========================= DEFINITIONS OF PUBLIC CONTROLLERS ========================= -->
<bean
id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean name="/login.do" class="com.comtrue.pc.licenceweb.web.LoginController">
<property name="licenceWeb" ref="licenceWeb"/>
</bean>
<bean name="/logout.do" class="com.comtrue.pc.licenceweb.web.LogoutController">
</bean>
...
컨트롤러를 위해 이 부분을 정의한다.
(설정에 있어서는 클래스의 public, protected 처럼 지정할 수 있지만
여기서는 일단 public 만 넣어둔다.)
[4. applicationContext.xml 설정]
어플리케이션 컨텍스트를 설정하는 부분이다
db 설정 파일을 스프링에서 쓸 수 있게하고
트랜잭션 등을 설정한다.
밸리데이션 등을 지정할 수도 있다.
<beans>
<!-- ========================= GENERAL DEFINITIONS ========================= -->
<!-- Configurer that replaces ${...} placeholders with values from properties files -->
<!-- (in this case, mail and JDBC related properties) -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>WEB-INF/db_mssql.properties</value>
</property>
</bean>
스프링의 PropertyPlaceholderConfigurer를 위해
jdbc파일의 경로를 지정하여 쓸 수 있게 하고
<bean
id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
트랜잭션 매니저를 지정한다.
<bean id="licenceWeb" parent="baseTransactionProxy">
<property name="target">
<bean class="com.comtrue.pc.licenceweb.domain.logic.LicenceWebImpl">
<property name="accountDao" ref="accountDao"/>
<property name="licenceDao" ref="licenceDao"/>
</bean>
</property>
</bean>
스프링프레임워크의 서비스 부분을 위한 DAO를 설정하여 트랜잭션 관리를 지정한다.
[5. db_mssql.properties 설정]
####################################
# MSSQL 2000
####################################
jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url=jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=데이터베이스이름;
jdbc.username=아이디
jdbc.password=비밀번호
[6. dataAccessContext.xml 설정]
<beans>
<!-- ========================= RESOURCE DEFINITIONS ========================= -->
<!-- Local Apache Commons DBCP DataSource that refers to a combined database -->
<!-- (see dataAccessContext-jta.xml for an alternative) -->
<!-- The placeholders are resolved from jdbc.properties through -->
<!-- the PropertyPlaceholderConfigurer in applicationContext.xml -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>
dataSource에 jdbc 설정을 알린다. 이 부분은 5번의 프로퍼티 파일에서 읽어왔기 때문에
${} 식으로 받아서 서버에서 처리하게 된다.
<!-- Transaction manager for a single JDBC DataSource -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
이 부분은.. 트랜잭션 매니저 bean을 설정하는 부분..
<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sqlmap-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
이 부분은 iBatis 연동을 위해 sql map 설정파일의 경로를 지정하고
dataSoruce를 지정한다.
<!-- ========================= DAO DEFINITIONS: IBATIS IMPLEMENTATIONS ========================= -->
<bean id="accountDao" class="com.comtrue.pc.licenceweb.dao.ibatis.SqlMapAccountDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
이 부분은 Dao를 구현한 클래스를 정의한다.
[7. sqlmap-config.xml 설정]
iBatis 연동을 위해 sqlmap 설정한다.
<sqlMapConfig>
<sqlMap resource="com/comtrue/pc/licenceweb/dao/ibatis/maps/Account.xml" />
<sqlMap resource="com/comtrue/pc/licenceweb/dao/ibatis/maps/Licence.xml" />
</sqlMapConfig>
Dao 클래스들이 사용하는 쿼리를 담은 xml 경로를 지정한다.
[8. Account.xml 설정, 객체마다 해야함]
Dao 클래스에서 사용하는 쿼리를 입력해두는 파일
<sqlMap namespace="Account">
<resultMap id="result" class="com.comtrue.pc.licenceweb.domain.Account">
<result property="userid" column="userid" columnIndex="1"/>
<result property="name" column="name" columnIndex="2"/>
<result property="email" column="email" columnIndex="3"/>
</resultMap>
<select id="getAccountByUseridAndPassword" resultMap="result">
select userid, name, email
from ACCOUNT
where userid = #userid# and password = #password#
</select>
</sqlMap>
resultMap 은 결과 형태를 지정하는 노드고
select 노드는 select 할 때를 위한 쿼리를 담는 곳이다.
이때 resultMap 속성에 resultMap 의 id를 지정한다. 그러면.. 결과 시에
resultMap 형식으로 결과를 갖고 온다.
[9. SqlMapAccountDao.java 구현 예]
public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {
public Account getAccount(String userid, String password) throws DataAccessException
{
Account account = new Account();
account.setUserid(userid);
account.setPassword(password);
return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUseridAndPassword", account);
}
}
getSqlMapClientTemplate()의 queryForObject()를 사용해서
seletc 쿼리를 수행한다. 결과는 resultMap 형식의 클래스로 돌려받게 된다.
Dao를 구현한 클래스들은 서비스 형식의 클래스에서 사용하는 방식으로 개발을 한다.
Dao를 직접 View부분에서 지정하진 않고..
p.s. 2주전쯤 프레임워크 적용을 했었는데..
혹 도움이 될까해서 올려봅니다..
Java 클래스 부분 설명이 없어서.. 이것만 보고 할 순 없지만요..
출처 - ITWILLCAMPUS
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기