본문 바로가기
프로그래밍/스프링프레임워크

스프링 프레임웍에서 MyBatis, Oracle 사용하기

by pentode 2018. 4. 1.

Spring4 + MyBatis + Oracle 을 연동해 봅니다. 앞에서 만들었던 샘플 프로젝트 ( "Spring MVC 샘플 프로젝트 버전3 에서 버전 4로 마이그레이션 하기" ) 를 사용합니다.

 

1. 먼저 설치한 Oracle 데이터베이스에 유저를 추가하고 테스트용 테이블 을 생성합니다.  SYSTEM 계정으로 들어가서 다음 명령으로 사용자를 추가합니다. 아이디와 비밀번호는 xeuser 입니다.

 

GRANT CONNECT, RESOURCE TO xeuser IDENTIFIED BY xeuser;

 

Oracle 테스트 계정 추가

 

 

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 의 에디터로 설정파일을 열면 하단의 네임스페이스 탭에서 필요한 네임스페이스를 선택하여 쉽게 추가할 수 있습니다.

 

beans 네임스페이스

 

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. 결과를 확인해 봅니다.

 

결과 화면

 

스프링에 마이바티스 오라클 연동을 해 보았습니다. 이제 간단한 프로그램을 만들기 위한 기본이 어느정도 된것 같습니다.

 

※ 전체소스

srping_mybatis.zip
다운로드

 

- 글 등록 기능 추가한 소스 입니다.

srping_mybatis_insert.zip
다운로드

 

반응형