Spring MyBatis를 이용하여 DB 연결하기
안녕하세요. YeopBox의 상큼한놈 입니다.
이번에는 스프링 프레임워크에서 DB를 연동하는 방법에 대하여 간략하게 알아보도록 하겠습니다.
MyBatis를 이용하여 실제 JDBC 연결단은 XML 설정으로 코드와 분리하여 구현할 예정입니다.
스프링 프레임워크나 전자정부프레임워크에서 DB연동시 자주 사용함으로 MyBatis에 대해서는 자세히 알아두는 것이 좋습니다.
프로젝트 설정파일 수정하기
DB및 MyBatis 라이브러리를 추가하기 위하여 maven 설정파일인 pom.xml에 아래 dependency를 추가해 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<!-- DB 설정 --> <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> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>3.0.7</version> </dependency> <!-- DB 끝 --> |
/webapp/WEB-INF 하단에 있는 web.xml의 servlet contextConfigLocation 설정을 아래와 같이 변경해 줍니다.
기존에 /webapp/WEB-INF 하단에 있던 servlet-context.xml 혹은 dispatcher-servlet.xml 파일은 resources/spring/servlet 폴더를 생성한 뒤 그 하단으로 옮겨줍니다.
이후 dispatcher-servlet.xml 파일을 servlet-context.xml으로 수정해 줍니다.
이제 resource/spring/servlet 하단에 있는 *-context.xml 파일은 자동으로 설정 파일이 로드됩니다.
1 2 3 4 5 6 7 8 9 10 11 |
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:spring/servlet/*-context.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> |
resource/spring/servlet하단에 db-context.xml 파일을 생성한 뒤 아래 코드를 복사해 줍니다.
datasource 설정을 자신의 DB 환경에 맞게 수정해 준 뒤, typeAliasesPackage및 basePackage 값을 본인의 package 명으로 변경해 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org//context http://www.springframework.org/schema/context/spring-context.xsd"> <tx:annotation-driven transaction-manager="transactionManager" /> <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <beans:property name="driverClassName" value="org.mariadb.jdbc.Driver" /> <beans:property name="url" value="jdbc:mariadb://127.0.0.1:3306/test" /> <beans:property name="username" value="username" /> <beans:property name="password" value="password" /> </beans:bean> <beans:bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"> <beans:property name="dataSource" ref="dataSource" /> <beans:property name="mapperLocations" value="classpath:query/*.xml" /> <beans:property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> <!--본인의 패키지 명으로 변경 --> <beans:property name="typeAliasesPackage" value="com.yeopbox"/> </beans:bean> <beans:bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--본인의 패키지 명으로 변경 --> <beans:property name="basePackage" value="com.yeopbox.**.mapper" /> </beans:bean> <beans:bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <beans:property name="dataSource" ref="dataSource" /> </beans:bean> </beans:beans> |
resource/mybatis 경로에 mybatis-config.xml 파일을 생성한 뒤 아래 항목을 복사해 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?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> <setting name="cacheEnabled" value="true" /> <setting name="lazyLoadingEnabled" value="false" /> <setting name="multipleResultSetsEnabled" value="true" /> <setting name="useColumnLabel" value="true" /> <setting name="useGeneratedKeys" value="false" /> <setting name="defaultExecutorType" value="SIMPLE" /> <setting name="defaultStatementTimeout" value="60000" /> <setting name="safeRowBoundsEnabled" value="false" /> <setting name="mapUnderscoreToCamelCase" value="false" /> <setting name="localCacheScope" value="SESSION" /> <setting name="jdbcTypeForNull" value="VARCHAR" /> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" /> </settings> </configuration> |
추후 VO 파일을 추가할 예정이지만 매퍼 파일을 먼저 만들도록 하겠습니다.
resource/query 경로에 main.xml이라는 매퍼 XML 파일을 생성합니다.
getCurTime은 현재 DB의 시간을 받아오는 쿼리로 간단하게 만들어 보았습니다.
1 2 3 4 5 6 7 |
<?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="com.yeopbox.main.mapper.MainMapper"> <select id="getCurTime" resultType="mainVo"> select current_timestamp as curTime </select> </mapper> |
프로젝트 코드 파일 추가하기
MainVO 빈 객체는 심플하게 현재 시간에 대한 String 값을 받아오는 것으로 생성하였습니다.
Getter,Setter 및 생성자와 toString 오버라이드 메소드를 생성해 주었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.yeopbox.main.vo; public class MainVo { public MainVo() {} private String curTime; public String getCurTime() { return curTime; } public void setCurTime(String curTime) { this.curTime = curTime; } @Override public String toString() { return "MainVo{" + "curTime='" + curTime + '\'' + '}'; } } |
이번엔 Mapper를 생성해 줍니다. 이전 Mybatis 1.3.0 이전 버전에서는 SqlSessionDaoSupport를 상속받아 DAO를 생성한 뒤 해당 DAO를 이용하였지만,
이후에는 Mapper 인터페이스를 생성한 뒤 XML과 매핑하여 이용하는 방식으로 변경되었다고 합니다.
필자의 경우 Mapper 인터페이스를 이용하여 구현하였습니다.
1 2 3 4 5 6 7 8 9 |
package com.yeopbox.main.mapper; import com.yeopbox.main.vo.MainVo; import org.springframework.stereotype.Repository; @Repository("mainMapper") public interface MainMapper { public MainVo getCurTime(); } |
이번엔 Service에 대한 인터페이스를 생성하였습니다. 현재 시간을 받아오는 getCurTime 메소드를 하나 정의하였습니다.
1 2 3 4 5 6 7 |
package com.yeopbox.main.service; import com.yeopbox.main.vo.MainVo; public interface MainService { public MainVo getDbTime(); } |
이후 MainService를 구현한 서비스 클래스를 생성하였습니다.
MainMapper에서 getCurTime을 받아오도록 구현하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.yeopbox.main.service; import com.yeopbox.main.mapper.MainMapper; import com.yeopbox.main.vo.MainVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; @Service("MainServiceImpl") @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class) public class MainServiceImpl implements MainService { @Autowired private MainMapper mainMapper; @Override public MainVo getDbTime() { return mainMapper.getCurTime(); } } |
최종적으로 log를 통하여 현재 DB의 시간을 로그를 통하여 확인할 수 있도록 구현하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.yeopbox.main.controller; import com.yeopbox.main.service.MainService; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class MainController { private static final Logger log = LogManager.getLogger(MainController.class); @Autowired @Qualifier("MainServiceImpl") private MainService mainService; @RequestMapping("/") public String main(){ log.info("{} 들어옴.",System.currentTimeMillis()); log.info("{} 현재 DB 시간.",mainService.getDbTime()); return "index"; } } |
지금까지 따라와 주셨으면 프로젝트 구성은 아래와 같이 되어 있을 겁니다.
이제 프로젝트를 기동해 보면 아래와 같이 정상적으로 DB와 접속하여 현재 시간을 받아오는 것을 확인할 수 있습니다.
이제 정상적인 연결및 동작을 확인하였으니, VO와 매핑 XML 파일을 수정하여 데이터베이스에서 CRUD를 할 수 있도록 코드를 주물러 주시면 됩니다.
마치며…
이번에는 간단하게 스프링 프레임워크에서 MyBatis를 이용하여 DB에 연결하는 방법에 대하여 알아보았습니다.
필자가 포스트를 작성한 시점에서 최신의 lib를 이용하였는데, 그로 인하여 이용 방법이 기존과는 조금 다른점이 있더라구요.
특히 DAO가 아닌 Mapper를 이용한 CRUD는 참신하게 다가왔습니다.
Spring은 그 범위가 넓어서 알아가는 재미가 있는 것 같습니다. 부가적으로 필요한 내용이나 궁금한 내용이 있으신 분은 댓글 남겨주세요.
감사합니다.