SPRING/web mvc 설정

[ SPRING ] spring 2.5 + ibatis web mvc

정윤재 2013. 10. 27. 22:35

http://shonm.tistory.com/entry/SPRING-25-web-mvc-기본-설정


에 이어서 여기에 ibatis 를 이용해서 database 를 연결 하는 설정을 해 보도록 하겠다.


일단 ibatis-xxx.jar 를 추가 시키는 것이 필요하다.


그리고 database 연결을 위해 db connection 을 위한 driver 라이브러리를 추가 해야 한다.


(database 연결 방식은 여러가지가 있는데 나는 실무에서 자주 쓰이느 was 에 jndi 로 


설정해 놓는 방식을 이용해 보겠다.)


나는 mysql 을 사용 하였으므로 mysql-connector-java-5.1.6.jar 을 추가 하였다.


이제 database 를 연결 시켜 보겠다.


우선 저번 장에서 eclipse + tomcat 으로 돌려 보았을 것이므로 tomcat 이 설치 되어 


있을 것이다. 나는 tomcat 7 대 버전으로 돌리고 있는데 이 정도 버전이면 


$TOMCAT_HOME/lib 에 mysql-connector-java-5.1.6.jar 같은 database 에 맞는 driver


를 위치 시켜야 한다. 이클립스와 연결 되어 있는 tomcat 에 파일을 복사하도록 하자


(tomcat 5.5 이전의 버전은 $TOMCAT_HOME/common/lib 라는 경로에 위치해야 한다.)


저번 장에서 eclipse + tomcat 으로 돌려 보았을 것으므로 project explorer 나 navigator에


Servers 라는 녀석이 있을 것이다.




여기에 server.xml 이라는 녀석이 있는데 이 녀석이 was 의 설정을 담당하는 파일이다.


여기에 jndi 로 설정하기 위해선


<Host>

<Context docBase="SpringWebSample" path="/SpringWebSample" reloadable="true" source="org.eclipse.jst.jee.server:SpringWebSample">


~~~~~~~~


</Context>

</Host>



~~~~ 라는 부분에 아래와 같이 설정을 해주는 것이 필요하다.


            <Resource name="jdbc/mysql"

                     auth="Container"

                     type="javax.sql.DataSource"

                     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

                     driverClassName="com.mysql.jdbc.Driver"

                     defaultAutoCommit="false"

                     url="jdbc:mysql://db_ip:db_port/db_name"

                     username="user_name"

                     password="user_password"

                     maxActive="20"

                     maxIdle="10"

                   maxWait="-1"/> 



이 뿐만 아니라 web.xml 에 아래와 같은 부분을 추가 해야 한다.


  <!-- jndi setting -->

   <resource-ref>

        <description>DB Connection</description>

        <res-ref-name>jdbc/mysql</res-ref-name>

        <res-type>javax.sql.DataSource</res-type>

        <res-auth>Container</res-auth>

    </resource-ref>


(중요한 점은 server.xml 의 Resource name= 부분과 web.xml 의 res-ref-name 태그 내용을


맞추어 줘야 한다는 것이고 server.xml 의 경우 위치를 맞춰주는 것이 중요하다.)


이제 ibatis 설정인 sqlMapConfig 을 해보자


sqlMapConfig-Mysql.xml 파일을 만들고 아래와 같이 작성한다.


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMapConfig

PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

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


<sqlMapConfig>

<transactionManager type="JDBC" commitRequired="false">

      <dataSource type="JNDI">

              <property name="DataSource" value="java:/comp/env/jdbc/mysql" />                     

      </dataSource>

</transactionManager>

<sqlMap resource="/conf/ibatis/sql/board.xml"/>

</sqlMapConfig>



 /conf/ibatis/sql/board.xml 파일을 아래와 같이 작성하여 쿼리를 작성해 본다.


(나는 연결 된 데이터베이스에 user,contents 컬럼이 있는 test_tbl 이라는 table이 있다.)


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMap      

    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      

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

    

    <sqlMap namespace="board">

    

    <select id="getBoardList" resultClass="com.test.vo.BoardVO">

select user,contents from test_tbl limit 10

</select>

    

    </sqlMap



이제 이 설정들을 사용하기 위해 datasource 나 sqlMapClient bean을 만들어 보자


applicationContext.xml 에 아래와 같이 database 관련 설정을 해 본다.


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

    "http://www.springframework.org/dtd/spring-beans.dtd">


<beans>


<!--  Mysql setting sample -->

<bean id="dataSource-Mysql" class="org.springframework.jndi.JndiObjectFactoryBean">

<property name="jndiName" value="jdbc/mysql"/>

<property name="resourceRef" value="true" />

</bean>

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

<property name="configLocation" value="classpath:/conf/ibatis/sqlMapConfig-Mysql.xml" />

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

</bean>

<bean id="trManager-Mysql" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

</bean>


</beans>



이게 끝났다면 query 를 가져올 수 있는 dao (data access object) 를 만들어 줘야 한다.


interface 를 이용해서 객체지향설계원칙 SOLID 에 맞게 구현해 보도록 하자 (OCP 에 맞게...)



BasicDAO.java 



package com.test.dao;


import java.sql.SQLException;

import java.util.List;


import com.test.vo.BoardVO;


public interface BasicDAO {

public List getBoardList() throws SQLException;

}



BasicDAOImple.java



package com.test.dao;


import java.sql.SQLException;

import java.util.List;


import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.test.vo.BoardVO;

import com.ibatis.sqlmap.client.SqlMapClient;


public class BasicDAOImple extends SqlMapClientDaoSupport implements BasicDAO {



@Override

public List getBoardList() throws SQLException{

// TODO Auto-generated method stub

return (List)getSqlMapClientTemplate().queryForList("getBoardList");

}


}



dao 를 만들어 주었다면 가져다 쓰는 비즈니스 로직도 만들어 줘야 한다.


BasicService.java


package com.test.biz;


import java.util.List;


public interface BasicService {

public String getPageName();

public List getBoardList();

}



BasicServiceImpl.java

package com.test.biz;

import java.util.List;

import com.test.dao.BasicDAO;

public class BasicServiceImpl implements BasicService{

private BasicDAO basicDAO;

public void setBasicDAO(BasicDAO basicDAO) {
this.basicDAO = basicDAO;
}


public String getPageName(){
return "BasicSample.jsp";
}
public List getBoardList(){
List list = null;
try{
list = basicDAO.getBoardList();
}catch(Exception e){
e.printStackTrace();
}
return list;
}
}



비즈니스 로직을 view(jsp) 에 전달 하는 controller 도 필요 하다.



BasicController.java



package com.test.controller;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.validation.BindException;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.Controller;


import com.test.biz.BasicService;


public class BasicController implements Controller{

private BasicService basicService;

public void setBasicService(BasicService basicService) {

this.basicService = basicService;

}

@Override

public ModelAndView handleRequest(HttpServletRequest request,

HttpServletResponse response) throws Exception {

// TODO Auto-generated method stub

ModelAndView mav = new ModelAndView();

//mav.addObject("pageName",basicService.getPageName());

//mav.setViewName("/sample/basicSample");

mav.addObject("boardList",basicService.getBoardList());

mav.setViewName("/sample/boardList");

return mav;

}



}



해당 내용을 보여줄 view 페이지도 필요하다.

(jstl 등으로 보여주면 깔끔해서 좋겠지만 여기서의 주요 내용은 view 단이 아니므로

기본적인 문법만 쓰도록 한다.)


boardList.jsp


<%@ page language="java" contentType="text/html; charset=US-ASCII"

    pageEncoding="US-ASCII"%>

<%@ page import="java.util.*,com.test.vo.*" %>

<%

List list = (List)request.getAttribute("boardList");

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">

<title>board list</title>

</head>

<body>

<table border="1">

<tr>

<td>user</td>

<td>contents</td>

</tr>

<%

for(int i=0;i<list.size();i++){

BoardVO boardVO = (BoardVO)list.get(i);

%>

<tr>

<td><%=boardVO.getUser() %></td>

<td><%=boardVO.getContents() %></td>

</tr>

<%} %>

</table>

</body>

</html>



dispatcher-servlet.xml 에 dao 나 service bean 설정이 필요하다.


dispatcher-servlet.xml 



<?xml version="1.0" encoding="UTF-8"?>

<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:context="http://www.springframework.org/schema/context"

    xmlns:lang="http://www.springframework.org/schema/lang"

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

    xmlns:util="http://www.springframework.org/schema/util"

    xmlns:p="http://www.springframework.org/schema/p"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

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

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd

        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd

        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">

     

     <!-- annotation setting -->   

    <context:component-scan base-package="com.test"/>

    <context:annotation-config/>


    <bean id="annotationMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

        <property name="alwaysUseFullPath" value="true"/>

        <property name="order" value="1"/>

    </bean>



    <!-- basic xml setting -->

<bean id="basicController" class="com.test.controller.BasicController">

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

</bean>

<bean id="basicService" class="com.test.biz.BasicServiceImpl">

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

</bean>

<bean id="basicDAO" class="com.test.dao.BasicDAOImple">

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

</bean>


<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/jsp/" />

<property name="suffix" value=".jsp" />

</bean>

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="urlMap">

<props>

<prop key="/basic/basic.do">basicController</prop>

</props>

</property>

</bean>



</beans>



위와 같이 설정 하면 아래와 같이 list 화면을 얻으면서 ibatis 설정이 정상적으로


되었음을 확인 할 수 있다.


(http://localhost:8080/SpringWebSample/basic/basic.do)




자세한 내용을 보고 싶다면 아래 첨부 파일을 확인 하면 된다.


아래 소스에는 annotation을 사용한 내용도 있다.



SpringWebSample.zip