티스토리 뷰

Spring

[Spring] Mybatis, Datasource 설정

망나니개발자 2017. 11. 15. 15:11
반응형

이번 단계에서는 Mybatis(마이 바티스)와 DataSource(데이터소스)에 대해서 설정해보도록 하겠습니다. Mybatis는 대표적인 Object Mapping 기술 중 하나인데 Object Mapping에 대해서 모르신다면 여기를 참고해서 이해해주시면 될 것 같습니다.

 

 

1. Datasource 설정하기


 

시스템에서 가장 자원을 많이 먹는 작업중의 하나가 I/O입니다. 데이터베이스와 현동할 때 getConnection()을 이용하여 connection객체를 사용하는 작업 역시 I/O(Input, Output)를 필요로 하기에 자원을 많이 잡아먹는데, Connection Pool(커넥션 풀)에서 Connection 객체를 생성해놓고 DB작업 시에 빌린 후 다시 반납하는 효율적인 방법을 만들어냈는데, DataSource(데이터소스)란 Connection Pool을 구현하기 위한 스펙을 정해놓은 인터페이스 입니다. 즉 DB 연동과 관련된 로직들이 추상화되어 있으며 DB연결을 위해 사용되는 객체이고 이것을 Spring에서 사용하기 위해서 설정해보도록 하겠습니다.

 

 

[ context-datasource.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:aop="http://www.springframework.org/schema/aop"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd">

   	<bean id="dataSourceSpied" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
	     <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
	     <property name="url" value="jdbc:log4jdbc:mysql://127.0.0.1:3306/stgdb" />
	     <property name="username" value="root" />
	     <property name="password" value="apmsetup" />
	</bean>
     
    <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
        <constructor-arg ref="dataSourceSpied" />
        <property name="logFormatter">
            <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
                <property name="loggingType" value="MULTI_LINE" />
                <property name="sqlPrefix" value="SQL         :  "/>
            </bean>
        </property>
    </bean>
</beans>

 

context-datasource.xml은 WEB-INF/config/spring 에 생성하면 됩니다. 여기에 생성해주어야 하는 이유는 전 장에 우리가 WEB-INF/config/spring의 context-*.xml 형식의 설정을 읽어드리겠다고 적어두었기 때문입니다.

 

사용하기 위한 DB의 주소와 포트번호 그리고 데이터베이스 이름을 아래의 빨간 부분에 명시해주어야 합니다. 저같은 경우에는 mysql과 연동하였기 때문에 url의 value에 mysql이 포함되어 있습니다. 저의 경우에는 localhost의 데이터베이스를 이용하며, 포트는 3306 그리고 stgdb라는 데이터베이스를 사용하겠다고 적어두었습니다. 

 

 

 

2. Mybatis 설정하기


 

context-sqlmap.xml ]

 

우리가 context-servlet.xml을 만드는 이유는 mybatis를 사용하여 데이터베이스에 쉽게 접근하기 위함입니다. 기존에 getConnection()을 이용하여 접근했다면 이제 mybatis를 사용하면 보다 편리함을 느낄 수 있을 것입니다.

<?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-4.0.xsd">
       					   
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="/WEB-INF/config/sqlmap/mapper-config.xml" />
        <property name="mapperLocations" value="/WEB-INF/config/sqlmap/mapper/**/*.xml" />
	</bean>
	<bean id = "sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name = "sqlSessionFactory" ref = "sqlSessionFactory"></constructor-arg>
	</bean>
</beans>

 

위에서 보면 sqlSession과 sqlSessionFactory를 설정해주고 있는데, sqlSession이란 sql문을 실제로 호출해주는 객체로 sqlSession 객체를 이용하여 우리가 정의한 sql문으로 접근할 수 있습니다. sqlSessionFactory란 sqlSession을 만드는 역할을 담당합니다. 그러므로 아마 직접적으로 sqlSessionFactory 객체를 사용하는 경우는 없을 것 같네요! 아래의 빨간 내모에서는 우리가 설정한 mybatis관련 설정파일의 위치와 우리가 저장한 sql관련 xml파일의 위치를 명시해주고 있습니다. 

 

 

mapper-config.xml ]

 

mapper-config.xml을 만드는 이유는 우리가 실제 프로젝트를 진행하다 보면 com.s4c.stg.user.UserVO 처럼 패키지 명과 그 안의 클래스 명이 너무 길어지는 경우가 많은데, 그것을 userVO처럼 줄여 사용하기 위한 것들을 정의해 줍니다. mapper-config.xml은 WEB-INF/config/sqlmap 폴더에 생성하면 됩니다.

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

    <typeAliases>
           
        <!-- 사용자 -->
        <typeAlias alias="userVO" type="com.s4c.stg.user.UserVO"/>
        
    </typeAliases>

</configuration>

개발자마다 클래스나 변수 이름 등을 다르게 설정하므로 흐름을 이해하였다면 자신에게 맞게 설정해주시면 됩니다. com.s4c.stg.user.UserVO는 com.s4c.stg.user패키지의 UserVO클래스로 그것을 userVO로 사용하겠다는 것입니다. 이 패키지와 클래스는 다음 장에서 추가하도록 하겠습니다.

 

 

[ userMapper.xml ]

<?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.s4c.stg.user.userMapper">
    
    <select id="selectUser" resultType="userVO">
        SELECT id
        , pw
        , money
        FROM user
    </select>
    
</mapper>

 

userMapper.xml은 WEB-INF/config/sqlmap/mapper/user 에 생성하면 됩니다. 꼭 마지막 폴더가 user가 아니여도 mapper 하위의 폴더면 괜찮습니다.(이러한 이유는 위에 sqlSessionFactory 설정을 할 때 sql관련 파일을 여기에 위치시키겠다고 설정하였기 때문입니다) 여기에는 사용 할 sql문을 적어주면 됩니다. 여기서 resultType= userVO라고 설정해 두었는데, 이게 가능한 이유는 우리가 위에서 userVO를 typeAliase 해주었기 때문입니다! 여기에 적혀있는 select id는 다음 장에서 우리가 자바로 구현한 메소드와 이름이 같아야 합니다!

 

 

3. Log4j 설정하기


 

우리가 하는 행동들을 로그 기록으로 출력하기 위해 작성하는 것입니다. 가볍게 생각하시고 코드만 넣으시면 될 것 같습니다. 아래의 파일들은 모두 src/main/resources에 작성해주시면 됩니다.

 

[ logback.xml ]

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
	<configuration>
	    <include resource="org/springframework/boot/logging/logback/base.xml"/>
	    
	    <!-- log4jdbc-log4j2 -->
	    <logger name="jdbc.sqlonly"     level="DEBUG" />
	    <logger name="jdbc.sqltiming"     level="INFO" />
	    <logger name="jdbc.audit"         level="WARN" />
	    <logger name="jdbc.resultset"     level="ERROR" />
	    <logger name="jdbc.resultsettable" level="ERROR" />
	    <logger name="jdbc.connection"     level="INFO" />
	 
	</configuration>

 

log4jdbc.log4j2.properties ]

 

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

[ log4j.xml ]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="info" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

 

[ 전체 파일 화면 ]

 

 

 

 

 

관련 포스팅

  1. Maven 기반의 Spring 프로젝트 만들기 (1/5)
  2. Spring 개발환경 설정하기 (2/5)
  3. Dispatcher Servlet 설정하기 (3/5)
  4. MyBatis, Datasource 설정 (4/5)
  5. DB에서 데이터 조회하기 (5/5)

 

반응형
댓글
댓글쓰기 폼
  • 나그네 log4j와 logback 겹치는것 아닌가요..?! 2018.07.15 22:13
  • 망나니개발자 앗 그렇네요!!!! 추후에 수정하도록 하겠습니다:) 감사합니다! 2018.07.18 20:21 신고
  • 1억받고싶은개발자 글에서 MyBatis는 ORM보다는 SQLMapper 라고 적는게 맞지 않나 싶습니다. ORM은 직접적인 쿼리를 사용하지 않는건데..MyBatis에서는 직접적으로 SQL을 적어줘야하는거고...아닌가요..? 2021.03.20 19:32
  • 망나니개발자 지적해주신 부분이 맞는데, Sql Mapper보다는 Object Mapping이라는 용어가 더 어울릴 것 같아서 해당 용어로 수정하였습니다! 좋은 지적 감사합니다:)
    안그래도 Spring 관련 포스팅이 너무 예전에 작성한 것이고, 전문성이 좀 떨어지는 것 같아서 다시 작성해야하나 고민을 하고 있는 상황입니다. (다른 글들도 꾸준히 잘못된 내용을 발견하면 수정하고 있습니다:)
    좋은 지적 감사하고, 빠르게 다시 포스팅하여 혼란을 줄 수 있는 글들은 내리던지 보완하던지 하도록 하겠습니다!
    감사합니다!
    2021.03.20 23:50 신고
반응형
공지사항
Total
2,853,164
Today
315
Yesterday
4,328
TAG
more
«   2022/08   »
  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      
글 보관함