본문으로 바로가기

MyBatis는 개발자의 부담이 적고, 생상선 향상에 도움이 된다고 한다. 원래 JDBC를 이용해서 프로그램 소스 안에서 복잡하게 SQL문을 작성하는 방식이다. JDBC로 된 프로젝트를 본 적 있는데 진짜 복잡해서 한눈에 보기 힘들었다. JDBC는 SQL을 수정해야 할 경우 프로그램을 수정해야 하기 때문에 유연성 또한 좋지 못하다. 마이바티스는 SQL을 xml에서 작성하기때문에 SQL 수정이 자유롭고 가독성 또한 좋다.



1) pom.xml

Mybatis 라이브러리를 추가한다.

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
<!-- MyBatis -->
<dependency>
    <groupid>org.springframework</groupid>
    <artifactid>spring-jdbc</artifactid>
    <version>${org.springframework-version}</version>
</dependency>
<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis</artifactid>
    <version>3.2.8</version>
</dependency>
<dependency>
    <groupid>org.mybatis</groupid>
    <artifactid>mybatis-spring</artifactid>
    <version>1.2.2</version>
</dependency>
 
<!-- MySQL -->
<dependency>
    <groupid>mysql</groupid>
    <artifactid>mysql-connector-java</artifactid>
    <version>5.1.35</version>
</dependency>
 
<!-- log4j-remix -->
<dependency>
    <groupid>org.lazyluke</groupid>
        <artifactid>log4jdbc-remix</artifactid>
    <version>0.2.7</version>
</dependency>
cs

마이바티스 라이브러리와 MySQL connector 라이브러리, log4j-remix라이브러리를 추가한다.


2) src/main/resources/spring

context-datasource.xml 추가

context-mapper.xml 추가

web.xml 설정파일에 context-*.xml 로 context설정파일들을 모두 불러올 수 있게끔 해놨다. 파일 그림의 오른쪽 상단에 S표시가 뜨면 Spring 으로 등록이 된 것이다. 만약 뜨지 않는다면, 프로젝트의 properties에서 spring에서 추가해주던가, 자동으로 읽게 해주면 된다.



3) context-datasource.xml - MySQL 연결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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.xsd">
 
    <bean id="dataSourceSpied" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://주소:포트명/스키마명"/>
        <property name="username" value="아이디"/>
        <property name="password" value="비밀번호"/>
    </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>
cs

- 6행 : 기존에는 dataSource인데 dataSourceSpied로 변경한다. 11~19행에서 가로채서 쿼리를 정렬해주기 위해서이다.

- 8행 : 개인PC로 연결할 경우 localhost/스키마명 또는 127.0.0.1/스키마명 으로 해주면 된다.

- 9행 : mysql 연결할때 아이디이다. 보통 root

- 10행 : mysql에서 사용하는 비밀번호이다.

- 13행~21행 : 6행의 dataSourceSpied를 가로채서 새로운 dataSource가 쿼리를 정렬해준다.



4) context-mapper.xml - Spring 연결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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.xsd">
    
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:/mapper/**/*_sql.xml" />
    </bean>
     
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSession"/>
    </bean>
 
</beans>
cs

- 7행 : name의 dataSources는 sqlSession Bean 에서 사용할 이름이고, ref의 dataSource는 context-datasource.xml에 정의한 Bean을 참조하는 것이다.

- 8행 : SQL문을 편집할 수 있는 xml을 모아두는 폴더이다. 중간에 **를 해준 것은 유연한 폴더구조의 변경을 위해서 이다. mapper 폴더 밑에 폴더들 안에 있는 _sql.xml 을 모두 읽는다.

- 11행 : 마이바티스 스프링 연동모듈의 핵심부분이다. sqlSessionTemplate는 sqlSession을 구현하고 코드에서 sqlSession을 대체하는 역할을 한다.



5) log4j.xml 수정

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?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="%d %5p [%c] %m%n" />
        </layout>
    </appender>
    
    <!-- *추가* -->
    <appender name="console-infolog" class="org.apache.log4j.ConsoleAppender">
          <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" value="%d %5p %m%n"/>
          </layout>  
    </appender>
    <!--  -->
    
    <!-- Application Loggers -->
    <logger name="tody" additivity="false">
        <level value="debug" />
        <appender-ref ref="console"/>
    </logger>
    
    <!-- *추가* -->
    <!-- Query Loggers -->
     <logger name="jdbc.sqlonly" additivity="false"> 
       <level value="info"/>
       <appender-ref ref="console-infolog"/>
     </logger>
         
     <logger name="jdbc.resultsettable" additivity="false"> 
       <level value="info"/>
       <appender-ref ref="console"/>
     </logger>
     <!--  -->
    
    <!-- 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="off" />
        <appender-ref ref="console" />
    </root>
    
</log4j:configuration>
cs

- 29행 : 쿼리를 출력하는 Logger를 추가한다.

- 34행 : 쿼리의 결과를 출력하는 Logger를 추가한다.



6) mapper 폴더 생성

이곳에 SQL문을 작성할 xml들을 저장할 것이다.



7) src/main/java에 tody.lovely.common.dao 생성



8) AbstactDAO.java 생성

context-mapper.xml에서 선언한 sqlSessionTemplate를 사용할 DAO를 만들 것이다. 개발할 때 조금 더 편하게 로그를 남기기위해 insert, delete, update, select 메서드들을 재정의 하여 각 비즈니스 로직을 담당할 DAO를 생성하여 지금 만들 DAO를 상속할 것이다. 지금 만들 DAO는 Factory 패턴화 시킨 것으로 비즈니스 로직을 모듈화 한 것이다. Factory 패턴화에 대해 공부하는 것도 좋다.


AbstactDAO.java

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package tody.lovely.common.dao;
 
import java.util.List;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
 
public class AbstractDAO {
     
protected Log log = LogFactory.getLog(AbstractDAO.class);
     
    @Autowired
    private SqlSessionTemplate sqlSession;
      
    protected void printQueryId(String queryId) {
        if(log.isDebugEnabled()){
            log.debug("\t QueryId  \t:  " + queryId);
        }
    }
      
    public Object insert(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.insert(queryId, params);
    }
      
    public Object update(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.update(queryId, params);
    }
      
    public Object delete(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.delete(queryId, params);
    }
      
    public Object selectOne(String queryId){
        printQueryId(queryId);
        return sqlSession.selectOne(queryId);
    }
      
    public Object selectOne(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.selectOne(queryId, params);
    }
      
    @SuppressWarnings("rawtypes")
    public List selectList(String queryId){
        printQueryId(queryId);
        return sqlSession.selectList(queryId);
    }
      
    @SuppressWarnings("rawtypes")
    public List selectList(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.selectList(queryId,params);
    }
 
}
cs

- 15행 : SqlSessionTemplate를 선언하고 Autowired Annotaion을 통해서 xml에 선언했던 의존관계를 자동으로 주입한다.

** 만들지 않아도 된다. DAO에서 쓸 기능들을 모아둔 것이기 때문이다. AbstractDAO를 만들지 않아도 DAO에서 직접 이 기능들을 쓰면 된다.



9) 서버 실행

오류없이 돌아가면 정상적으로 연동이 된것이다.



도움을 준 블로그 : http://addio3305.tistory.com


댓글을 달아 주세요

  1. 프루미 2019.04.25 16:51

    오타신고 I를 대문자로

    <groupid>
    <artifactid>

  2. BlogIcon 코머 2019.05.07 10:59

    좋은글 감사합니다
    AbstactDAO.java
    클래스명 오타입니다 r 빠졌어요 !
    에러 뜨길래 발견

  3. 익명 2020.02.05 17:15

    비밀댓글입니다

  4. 윤쨩 2020.05.08 14:39

    오라클이나 MySQL은 1번 pom 에 등록하는것과 2번 mapper에 등록하는 이름만 다르고 나머지는 동일한가요?