Spring4 + MyBatis + Oracle 을 연동해 봅니다. 앞에서 만들었던 샘플 프로젝트 ( "Spring MVC 샘플 프로젝트 버전3 에서 버전 4로 마이그레이션 하기" ) 를 사용합니다.
1. 먼저 설치한 Oracle 데이터베이스에 유저를 추가하고 테스트용 테이블 을 생성합니다. SYSTEM 계정으로 들어가서 다음 명령으로 사용자를 추가합니다. 아이디와 비밀번호는 xeuser 입니다.
GRANT CONNECT, RESOURCE TO xeuser IDENTIFIED BY xeuser; |
SQL Developer 에서 명령 실행은 실행하고자 하는 쿼리를 블럭으로 선택한 후 F9 또는 Ctrl+Enter 입니다.
이제 생성된 계정으로 들어가서 테스트용 테이블을 생성합니다.
CREATE TABLE TB_BOARD (
NUM NUMBER(10) NOT NULL,
NAME VARCHAR2(20) NOT NULL,
TITLE VARCHAR2(100) NOT NULL,
CONTENT CLOB NULL,
READ_COUNT NUMBER(10) DEFAULT 0 NOT NULL,
WRITE_DATE DATE NOT NULL
);
ALTER TABLE TB_BOARD ADD CONSTRAINT PK_BOARD PRIMARY KEY (NUM);
INSERT INTO TB_BOARD VALUES (1, '홍길동','게시물 작성', '글 내용', 0, SYSDATE);
SELECT * FROM TB_BOARD;
ALTER TABLE TB_BOARD DROP CONSTRAINT PK_BOARD;
DROP TABLE TB_BOARD;
SQL Developer 에서 스크립트 실행은 F5 입니다. 아래의 DROP 명령은 삭제할 때 만 사용합니다.^^
2. pom.xml 파일에 필요한 의존성을 추가합니다. 추가 후 프로젝트에 마우스 오른쪽 키를 클릭하여 Maven -> Update Project 를 실행합니다.
<!-- 오라클 JDBC 드라이버를 가져오기 위해 리포지토리를 추가합니다. -->
<repositories>
<repository>
<id>oracle</id>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>
<!-- 스프링에서 JDBC 를 사용하기 위한 라이브러리 입니다. -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- 컨넥션 풀을 위한 라이브러리 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- 오라클 JDBC 드라이버 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>12.1.0.2</version>
</dependency>
<!-- MyBatis 라이브러리 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 마이바티스와 스프링 연동을 위한 라이브러리 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
필요한 라이브러리가 있을 경우 http://search.maven.org 등에 들어가서 검색을 해서 찾아서 넣으면 됩니다.
3. root-context.xml 파일에 데이터베이스 연결 설정, MyBatis 설정, Transaction 을 추가 한다. 스프링 루트 컨텍스트 입니다.
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 데이터베이스 연결 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe" />
<property name="username" value="xeuser"/>
<property name="password" value="xeuser"/>
</bean>
<!-- SqlSession -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- MyBatis 설정 파일의 위치를 지정합니다. -->
<property name="configLocation" value="classpath:/mybatis-config.xml" />
<!-- SQL 파일의 위치를 지정합니다. -->
<property name="mapperLocations" value="classpath:/sqlmap/*.xml" />
</bean>
<!-- SqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!-- 지정된 베이스 패키지에서 DAO(Mapper) 를 검색하여 등록합니다. -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.tistory.pentode.service.dao" />
</bean>
<!-- 트랜잭션 매니저 bean 을 등록합니다. -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 아노테이션 기반의 트랜잭션을 사용합니다. -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
위에서 beans, tx 등의 네임스페이스가 사용되었습니다. 파일 상단에 xmlns 로 지정 되는 부분입니다. 파일 내부에서 사용되는 태그의 네임페이스가 지정되어야 합니다. eclipse 의 에디터로 설정파일을 열면 하단의 네임스페이스 탭에서 필요한 네임스페이스를 선택하여 쉽게 추가할 수 있습니다.
4. 웹 컨텍스트를 설정합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.tistory.pentode" />
</beans:beans>
위에서 두개의 컨텍스트를 설정했습니다. Root 컨텍스트와 Web 컨텍스트 입니다. 스프링 컨텍스트는 빈을 관리한다고 생각하면 되겠습니다. Root 가 최상위가 되고 그 하위 컨텍스트로 Web 컨텍스트가 만들어집니다. 웹 컨텍스트는 여러개 만들 수 있습니다. Servlet-Dispatcher 를 여러개 설정하면 됩니다.
같은 레벨의 컨텍스트 사이에서는 상대방의 Bean 에 접근을 할 수가 없지만 상위 컨텍스트의 Bean 에는 접근이 가능합니다. 즉 Root 컨텍스트는 모든 하위 컨텍스트에서 공유가 되는겁니다. 그래서 보통 공통으로 사용할 필요가 있는 데이터베이스 연결, 서비스, DAO 등을 Root 컨텍스트에서 설정하고, 웹 컨텍스트에서만 사용되는 Controller 는 각각의 웹 컨텍스트에서 설정하는 식으로 많이 사용됩니다.
root-context.xml 과 servlet-context.xml 파일에서 보면 각각 <bean/> 태그와 <beans:beans/> 태그가 사용되고 있다는 것을 알 수 있습니다. 둘의 기능적 차이는 없습니다. 완전히 같은 것 입니다. 그런데 표기 방법이 달라지는 것은 디폴트 네임스페이스 때문입니다.
최상위 요소 <beans 바로 뒤에 나오는 xmlns= 로 바로 시작하는 네임스페이스가 디폴트 네임 스페이스 입니다. 디폴트 이외에는 xmlns:beans= 처럼 네임스페이스를 적어야 합니다. 디폴트 네임스페이스는 본문에 태그를 적을때 네임스페이스를 빼고 적어도 됩니다.
<beans xmlns="http://www.springframework.org/schema/beans" ....... /> <!-- 기본 네임스페이스가 beans 이므로 바로 쓸 수 있습니다. --> <bean ....> </bean> </beans> <beans:beans xmlns="http://www.springframework.org/schema/mvc" .... /> <!-- 기본 네임스페이스가 mvc 이므로 bean 앞에 네임스페이스를 적어야 합니다. --> <beans:bean ...> </beans:bean> </beans:beans> |
5. mybatis-config.xml 마이바티스 설정파일을 작성합니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 여러가지 기본 옵션을 지정합니다. -->
<settings>
<!-- 오라클 필드 속성이 READ_COUNT 처럼 언더 스코어가 있을 때 VO 의 readCount 처럼 카멜 케이스로 변환 되게 합니다. -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<typeAlias alias="boardVO" type="com.tistory.pentode.vo.BoardVO"/>
</typeAliases>
</configuration>
6. Tb_Board_SQL.xml SQL 맵핑 파일을 만듭니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 맵핑될 DAO 인터페이스의 Full name 을 줍니다. -->
<mapper namespace="com.tistory.pentode.service.dao.BoardDAO">
<!-- id 속성은 DAO 의 메소드와 같아야 한다. 여기의 boardVO 는 mybatis-confg.xml 에 Alias 되어 있습니다. -->
<select id="selectBoardList" resultType="boardVO">
SELECT NUM
, NAME
, TITLE
, CONTENT
, READ_COUNT
, WRITE_DATE
FROM TB_BOARD
ORDER BY NUM DESC
</select>
</mapper>
7. VO 클래스를 만듭니다. 일부만 적었습니다. getter/setter 는 이클립스 Source 메뉴에서 Generate Getters and Setters 기능으로 자동으로 만들 수 있습니다. toString() 메소드도 자동으로 추가할 수 있습니다.
package com.tistory.pentode.vo;
import java.sql.Date;
public class BoardVO {
private Integer num;
private String name;
private String title;
private String content;
private Integer readCount;
private Date writeDate;
8. DAO 인터페이스를 만듭니다.
package com.tistory.pentode.service.dao;
import java.util.List;
import com.tistory.pentode.vo.BoardVO;
public interface BoardDAO {
List selectBoardList() throws Exception;
}
9. 서비스 인터페이스를 만듭니다.
package com.tistory.pentode.service;
import java.util.List;
import com.tistory.pentode.vo.BoardVO;
public interface BoardService {
List selectBoardList() throws Exception;
}
10. 서비스 구현 클래스를 만듭니다.
package com.tistory.pentode.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.tistory.pentode.service.BoardService;
import com.tistory.pentode.service.dao.BoardDAO;
import com.tistory.pentode.vo.BoardVO;
@Service("boardService")
public class BoardServiceImpl implements BoardService {
@Autowired
private BoardDAO boardMapper;
@Override
@Transactional
public List selectBoardList() throws Exception {
return boardMapper.selectBoardList();
}
}
11. 컨트롤러에 Request를 추가합니다.
@Resource(name = "boardService")
private BoardService boardService;
@RequestMapping(value = "/boardList.do")
public String boardList(Model model) throws Exception {
List list = boardService.selectBoardList();
logger.info(list.toString());
model.addAttribute("list", list);
return "boardList";
}
12. 뷰페이지를 만듭니다.
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr"/>
<title>Home</title>
</head>
<body>
<h1>Board List</h1>
<table border="1">
<thead>
<tr>
<th>번호</th>
<th>이름</th>
<th>제목</th>
<th>조회</th>
<th>작성일</th>
</tr>
</thead>
<tbody>
<c:forEach var="item" items="${list}">
<tr>
<td>${item.num}</td>
<td>${item.name}</td>
<td>${item.title}</td>
<td>${item.readCount}</td>
<td>${item.writeDate}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
13. 결과를 확인해 봅니다.
스프링에 마이바티스 오라클 연동을 해 보았습니다. 이제 간단한 프로그램을 만들기 위한 기본이 어느정도 된것 같습니다.
※ 전체소스
- 글 등록 기능 추가한 소스 입니다.
'프로그래밍 > 스프링프레임워크' 카테고리의 다른 글
실행 흐름에 끼어들기(Filter,Interceptor,AOP) 1 - Servlet Filter (0) | 2018.04.02 |
---|---|
Spring Framework 메세지 국제화(다국어 지원) 사용하기 (4) | 2018.04.02 |
Spring MVC 샘플 프로젝트 버전3 에서 버전 4로 마이그레이션 하기 (0) | 2018.04.01 |
Spring Framework을 사용한 웹애플리케이션 개발환경 만들기 (0) | 2018.04.01 |
Apache Tiles 설정하기 (0) | 2018.04.01 |