본문 바로가기
Framework/Spring

[SPRING 시작-5] #Mybatis 연동 및 설정 / Eclipse+Spring+Maven+Mybatis

by 나비와꽃기린 2016. 10. 13.

지금까지 프로젝트 생성, web.xml 설명, Interceptor 설정, logger 설정 등에 대해알아보았다.


이제부터 생성했던 프로젝트에 Mybatis를 연동하여 DB에서 데이터를 조회해 오는테스트를 해보고자 한다.



<<최종구조>>



최종 구조는 위와 같다. 차근차근 따라해 본다 ㅎㅎ



1. mybatis lib 추가

STS maven 프로젝트에서는 pom.xml을 사용하여 라이브러리를 관리하기 때문에

http://mkil.tistory.com/192 을 참고하여 다음과 같은 dependencypom.xml에 추가한다.


<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.2</version>
</dependency>
 
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.0</version>
</dependency>
 
<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>



2. DB 연동 lib 추가 (Oracle사용)

(1) 다음 디펜던시를 추가한다.


<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.4.0</version>
</dependency>


(2) <dependencies> 앞에 해당 repositories 추가


위의 ojdbc 디펜던시만으로는 해결이 안난다. 따라서 ojdbc를 직접 받을 수 있는 repository를 참조할 수 있도록 수동으로 등록해 준다.


<repositories>
<repository>
	<id>mvn2</id>
	<url>http://repo1.maven.org/maven2/</url>
	<releases>
		<enabled>true</enabled>
	</releases>
	<snapshots>
		<enabled>true</enabled>
	</snapshots>
</repository>
 
<repository>
	 <id>oracle</id>
	 <name>ORACLE JDBC Repository</name>
	 <url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
</repository> 
</repositories>

혹시 여기까지 했는데..........이 방법이 안된다면!!!

그래서... Cannot load JDBC driver class 'oracle.jdbc.OracleDriver' 가 난다면.... tomcat을 다운받은 곳의 lib 디렉토리에 직접 ojdbc14.jar를 넣어주면 깔끔히 해결된다 -_-;;;


아. 그리고 뭔진 모르겠는데 STS에 내장된 tomcat으로는 안되더라... (이유가뭐지?)

그래서 필자는 톰캣을 추가하고 해당 프로젝트를 올려주었다...

(내가 잘못 알고 있는게 있는걸까 ㅜㅜ)





3. jdbc 설정 파일 context-jdbc.xml 생성

src/java/resources 폴더 밑에 config 디렉토리를 생성 후

jdbc 설정을 관리할 xml 파일을 만든다. 파일 이름은 마음대로……..필자는 context-jdbc.xml로 생성했다.




4. context-jdbc.xml 설정 / DB 연결

DB 설정정보를 적어준다. url / username / password 를 작성해주면 된다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@IP주소입력하세요:PORT입력하세요:DB스키마명적어주세요" />
		<property name="username" value="USERNAME입력하세요”/>
		<property name="password" value="PASSWORD입력하세요”/>
	</bean>
</beans>




5. web.xml에서 jdbc 설정 파일을 읽도록 설정

<!-- jdbc 설정 -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath*:config/*.xml</param-value>
</context-param>

서버가 기동될 때 해당 위치에 있는 xml파일을 읽으라는 의미이다.

보통은, config 디렉토리 생성 후, spring에 관련한 여러 설정파일인 xml을 만들어 넣고

해당 구문에서 classpath*:config/*.xml 이런 식으로 config 아래 모든

xml 확장자파일을 읽으라고 지정할 수 있다.

(설정파일을 하나하나 등록하는 것보다 한꺼번에 읽을 수 있도록 하기 위함이다.)


특정 xml만 지정하려면 classpath*:config/XXX-context.xml과 같이 사용할수도 있다.




6. MybatisSpring 연결

src/java/resources/config context-mapper.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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" >
        	<list>
				<value>classpath*:com/common/sql/*.xml</value>
			</list>
		</property>
		<property name="configLocation">
			<value>classpath:config/mybatis-env-setting.xml</value>
		</property>
    </bean>
     
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionTemplate"/>
    </bean>  
</beans>

!! 설정이 중요하다


(1) dataSource 설명

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

처음 name값은 context-mapper.xml 에서 사용할 id 같은 값을 의미한다.

중요한 것은 ref값이다. 잘 보면 ref에 작성한 값과 4번에서 작성한 context-jdbc.xml 에서의 bean id값이 같은 것을 확인 할 수 있다.

이것은 refdataSourcecontext-jdbc.xml에서 정의한 bean을 참조한 것을 의미한다.


(2) mapperLocations 설명

<property name="mapperLocations" >
   <list>
	<value>classpath*:com/common/sql/*.xml</value>
   </list>
</property>

이 부분은 앞으로 작성해나갈 SQL문들이 위치할 장소를 지정해주는 부분이다.

com.common.sql 이라는 패키지를 생성했고 그 안에서 생성한 모든 -.xml 파일들을 읽어드리라는 의미가 된다.


(3) sqlSessionTemplate 설명

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
   >constructor-arg index="0" ref="sqlSessionTemplate"/>
</bean>

mybatis spring 연동 모듈의 핵심 부분이다.

SqlSessionTemplate라는 클래스가 SqlSession을 구현해준다.




7. servlet-context.xml에 스캔 설정


WEB-INF\spring\appServlet\servlet-context.xml 에 다음으 추가한다.

<!-- component scan (Controller) -->
<context:component-scan base-package="com.common.*">
	<context:include-filter type="annotation" expression="org.springframework.context.annotation.Configuration"/>
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	<context:include-filter type="regex"
		expression="(service|controller|dao)\..*" />
</context:component-scan>

이거 설정안해주면 Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field:

가 날수도. autowired에 대한 어노테이션 설정을 해주는 것 같다 (확실하진...않다)




8 Controller, DAO, Service ,SQL 생성 및 작성

test 용이라.. namespace들이 엉망진창이다….

HomeController에서 testSql에서 common까지…………. 중구난방 이구만 -_-;;

다음과 같이 4개의 파일을 생성해준다.


(1) HomeController

@Controller
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	@Autowired
	private commonService commonService;
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		
		Map map = new HashMap();
		map.put("docnum", "108");
		
		List list=commonService.selectList(map);
		
		logger.info("결과 logger:::::::::::::::: "+list);
		
		return "home";
	}
}


(2) commonService

@Service
public class commonService {
	
	@Autowired
	private commonDao commonDao;
	
	public List selectList(Map param){
		List list=commonDao.selectList(param);
		return list;
	}

}


(3) commonDao

@Repository
public class commonDao {
	
	@Autowired
	@Resource(name="sqlSession")
	private SqlSessionTemplate  sqlsession;
	
	@SuppressWarnings("unchecked")
	public List selectList(Map param) {
		List result = sqlsession.selectList("testSql.selectList",param);
		return  result ;
	}
}


(4) testSql

<?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">

<mapper namespace="testSql">
	 <select id="testSql.selectList" parameterType="java.util.HashMap" resultType="java.util.HashMap">
		SELECT * FROM PT_ABRD_MAIN where DOCNUM= #{docnum}
	</select>                                                                                                             
</mapper>



9. 서버 기동 후, 결과 확인

controller에서 data를 잘 가져오는지 앞서 설정했던 logger로 찍어봤더니 잘 가져온다.


2016-10-12 16:34:30,876  INFO [com.core.spring.HomeController] 결과 logger:::::::::::::::: [{INSTIME=2016-09-05 09:48:39.0, INSUSER=portaladmin, VIEWCOUNT=34, DOCNUM=102, UPDTIME=2016-09-0 ………………………. (많아서 생략)




10. Mybatis 확인

그럼 파라미터를 넘겨서 mybatis가 잘 설정 되었는지도 확인해볼까?

컨트롤러에서 하드코딩으로 파라미터 하나를 넘겨보았다.

Map map = new HashMap();
map.put("docnum", "108");
List list=commonService.selectList(map);

그리고 xml에서 파라미터를 매핑시켜줬다.

<select id="testSql.selectList" parameterType="java.util.HashMap" resultType="java.util.HashMap">
	SELECT * FROM PT_ABRD_MAIN where DOCNUM= #{docnum}
</select>

2016-10-12 16:49:15,635  INFO [com.core.spring.HomeController] 결과 logger:::::::::::::::: [{INSTIME=2016-09-07 13:26:43.0, INSUSER=portaladmin, ATTACH=N, VIEWCOUNT=3, TITLE=히히히히ㅣㅎ,…. (생략) }]

 


잘나옴! mybatis 연동도 이렇게 끝.

댓글2