본문 바로가기
Java/Spring Framework

[SPRING 시작-5] #MYBATIS 연동 및 설정 / ECLIPSE+SPRING+MAVEN+MYBATIS Framework/Spring

by 놀러와요 2019. 9. 9.
반응형

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

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

 

<<최종구조>>

 

 

 

 

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

 

1. mybatis lib 추가

 

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

http://mkil.tistory.com/192 을 참고하여 다음과 같은 dependency를 pom.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. Mybatis와 Spring 연결

 

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값이 같은 것을 확인 할 수 있다.

 

이것은 ref의 dataSource가 context-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=히히히히ㅣㅎ,…. (생략) }]

 

출처 : http://mkil.tistory.com/296?category=541781

반응형