티스토리 뷰
* 스프링에서 데이터베이스 연동
추가되는 jar : commons-pool.jar, ibatis-2.3.2.715.jar
1. 데이터베이스 연동
(1) 스프링의 데이터베이스 주요 연동지원
- template 클래스를 통한 데이터 접근지원 : 데이터에 접근하는 코드는 거의 동일한 코드 구성을 갖는다. 개발자가 중복된 코드를 입력해야 하는 성가신 작업을 줄일수 있다. JDBC 뿐만 아니라 , HIbernate , iBATIS 같은 다양한 기술에 대해 template 클래스를 제공하고 있다.
- DaoSupport 클래스를 이용한 DAO 클래스 지원 : DAO 클래스의 주된 역할은 데이터베이스 Connection을 이용해서 데이터 접근을 처리하는 것이다. 스프링은 이렇게 DAO 에서 기본적으로 필요로 하는 기능을 제공하는 DaoSupport 클래스를 제공하고 있다.
- 의미있는 예외클래스 제공 : JDBC에서 발생하는 모든 예외는 SQLException이라서 예외처리가 어려웠다.
스프링은 데이터베이스 처리과정에서 발생한 예외가 왜 발생했는지를 좀 더 구체적으로 확인할 수 있도록 데이터베이스 처리와 관련된 예외클래스를 제공한다. ( OptimisticLockingFailureException , DataRetrievalFailureException 등 )
스프링이 제공하는 예외클래스들은 모두 DataAccessException 클래스를 상속받는다. RuntimeExcepiton 계열이라서 필요한 경우에만 예외처리를 한다. 스프링에서 제공하는 모든 tempate 클래스는 내부적으로 발생하는 예외 클래스를 스프링이 제공하는 예외 클래스로 알맞게 변환해서 예외를 발생시킨다. 따라서 스프링이 제공하는 template 클래스를 사용하면 데이터베이스 연동을 위해 사용하는 기술에 상관없이 동일한 방식으로 예외처리가 가능하다.
(2) DataSource 설정
- 커넥션 풀( DBCP )을 이용한 DataSource 설정 :
<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>
- JNDI 을 이용한 DataSource 설정 : 스프링 2.0 부터 지원. 이것을 사용하기 위해서는 jee 네임스페이스 및 관련 XML 스키마로 등록해주어야 한다.
resource-ref = "true" 인 경우에는 java:comp/env 가 검색할 이름앞에 붙는다.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- JNDI DataSource for JEE environments -->
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/>
- DriverManager 을 이용한 DataSource 설정
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<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>
2. 스프링의 iBATIS 연동
스프링은 SqlMapClient를 사용할 때 발생하는 코드 중복을 없애고 SQLException을 스프링이 제공하는 예외클래스로 변환해주는 SqlMapClientTemplate클래스를 제공한다.
1) SqlMapClient를 위한 스프링설정
스프링은 SqlMapClient를 스프링 설정파일에서 쉽세 설정할수 있는 SqlMapClientFactoryBean 클래스를 제공한다. 이클래스를 사용하면 SqlMapClient를 스프링 빈으로 설정할 수 있다.
*******일반적인 iBATIS 사용법***********************
public class DaoiBATIS {
private static SqlMapClient sqlMapper ;
static {
try{
Reader reader = Resources.getResourceAsReader("ibatis/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch(IOException e){
throw new RuntimeException("Something bad happened while building the SqlMapClient instance,"+e, e);
}
}//end static
************************************************************************************
<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/SqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
2) SqlMapClientTemplate 을 위한 스프링 설정
SqlMapClientTemplate 클래스는 iBATIS의 SqlMapClient 클래스가 제공하는 대부분의 메소드와 동일한 이름과 파라미터타입, 리턴타입을 갖는 메소드를 정의하고 있다. 차이점은 SQLException 대신에 스프링이 제공하는 예외를 발생시킨다.
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
3) SqlMapClientDaoSupport 을 위한 스프링 설정
<bean id="boardDao" class="test.web.SqlMapBoardDao">
<property name="sqlMapClientTemplate" ref="sqlMapClientTemplate"/>
</bean>
위 1) 2) 3) 작업을 간략하게 할 수 있다.
<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>
<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/SqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="boardDao" class="test.web.SqlMapBoardDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
SqlMapClientDaoSupport을 상속받은 클래스는 getSqlMapClientTemplate() 메소드를 사용해서 SqlMapClientTemplate을 구할수 있다.
* 스프링에서 데이터베이스 연동
1. 데이터베이스 연동실습순서
web브라우저 <--> BoardXXXActionController <--> BoardImpl <--> SqlmapBoardDao <---> 오라클DB
1) jdbc.properties 설정
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:ORCL
jdbc.username=scott
jdbc.password=tiger
2) 데이터베이스 연동을 위한 2 개의 설정파일( xml ) 작성
(1) applicationContext.xml
: 공통적인 작업설정을 하는 설정파일.
: jdbc.properties 설정과 BoardImpl 빈 설정
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>WEB-INF/jdbc.properties</value>
</list>
</property>
</bean>
<!-- ====== BUSINESS OBJECT DEFINITIONS ======================== -->
<bean id="board" class="test.web.BoardImpl">
<property name="boardDao" ref="boardDao"/>
</bean>
(2) dataAccessContext-local.xml : DataSource 얻기 작업과 DAO 빈 설정작업
<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>
<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/SqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="boardDao" class="test.web.SqlMapBoardDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
*SqlMapConfig.xml 내용은 다음과 같다.
<sqlMapConfig>
<sqlMap resource="ibatis/Board.xml"/>
</sqlMapConfig>
*Board.xml 내용은 다음과 같다.
<sqlMap namespace="Board">
<typeAlias alias="board" type="test.web.Board"/>
<select id="getBoardList" resultClass="board">
SELECT num , author , title , email FROM springboard ORDER BY num desc
</select>
<select id="getRetrieveList" parameterClass="String" resultClass="board">
SELECT num , author , title , email , content FROM springboard WHERE num = #num#
</select>
<select id="getNewNum" resultClass="String">
SELECT MAX( num ) FROM springboard
</select>
<insert id="setBoardWrite" parameterClass="board">
INSERT INTO springboard ( num , author, email, title, content, passwd, rep_root ) VALUES ( #num# , #author#, #email# , #title#, #content# , #passwd# , #num# )
</insert>
<delete id="setDelete" parameterClass="String">
DELETE FROM springboard WHERE num = #num#
</delete>
<update id="setBoardUpdate" parameterClass="board">
UPDATE springboard SET title= #title# , content = #content# , author=#author# , email = #email# WHERE num = #num#
</update>
..........
3) SqlMapBoardDao 구현
public class SqlMapBoardDao extends SqlMapClientDaoSupport implements BoardDao {
public List getBoardList() throws DataAccessException{
return getSqlMapClientTemplate().queryForList("getBoardList");
}
public Board getRetrieveList( String num) throws DataAccessException{
return (Board) getSqlMapClientTemplate().queryForObject("getRetrieveList" , num);
}
public String getNewNum() throws DataAccessException{
return (String) getSqlMapClientTemplate().queryForObject( "getNewNum" );
}
public void setBoardWrite( Board data) throws DataAccessException{
getSqlMapClientTemplate().insert( "setBoardWrite" , data );
}
public void setDelete( String num ) throws DataAccessException {
getSqlMapClientTemplate().delete( "setDelete" , num );
}
public void setBoardUpdate( Board data ) throws DataAccessException{
getSqlMapClientTemplate().update( "setBoardUpdate" , data );
}
}//end class
4) BoardImpl 구현
public class BoardImpl implements BoardFacade {
private BoardDao boardDao;
public void setBoardDao( BoardDao boardDao){
System.out.println("BoardImpl.setBoardDao"+ boardDao);
this.boardDao = boardDao;
}//
//----------------------------------------------
public List getBoardList(){
System.out.println( "BoardImpl.getBoardList()");
return this.boardDao.getBoardList();
}
.............
5) BoardListActionController 구현 ( 각각의 Controller 을 하나씩 구현해야 한다 )
public class BoardListActionController extends AbstractCommandController {
private BoardFacade board;
public void setBoard(BoardFacade board) {
System.out.println("BoardActionController.setBoard");
this.board = board;
}
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
ArrayList list = (ArrayList)board.getBoardList();
System.out.println(">>>>DeptActionController>>>>>>" + list.size());
ModelAndView mav = new ModelAndView();
mav.setViewName( "list" );
mav.addObject( "board.list" , list );
return mav;
}//end handleRequest
'공부 > Spring' 카테고리의 다른 글
Spring의 이해 (0) | 2016.12.16 |
---|