초리의 블로그

Spring Mybatis 연동하기 본문

Mybatis

Spring Mybatis 연동하기

초리84 2017. 7. 2. 21:16

안녕하세요~ 이렇게 저의 블로그에 방문해 주셔서 감사합니다.


이 포스팅에선 Spring 프로젝트에 Mybatis를 연동하기를 해보겠습니다.

스프링 시작하기.(Hello World를 출력해 봅시다.) (http://chori84.tistory.com/32)에 이어서 시작을 할거에요.


사용하는 DB는 mysql이니 DB에 따라 Driver를 바꿔주시면 됩니다.

Java 클래스를 이용한 설정도 가능하지만,

여기서 저는 xml을 이용하여 설정 및 mapper를 이용하는 방법을 포스팅하겠습니다.


먼저, maven repository(https://mvnrepository.com)에서 Spring JDBC, mysql, mybatis 관련 dependency를 검색해서 pom.xml 파일에 추가할게요.

그리고 테스트를 위하여 spring test도 넣겠습니다.

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
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>${spring.version}</version>
</dependency>
 
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>${spring.version}</version>
</dependency>
 
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-dbcp2</artifactId>
  <version>2.1.1</version>
</dependency>
 
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.43</version>
</dependency>
 
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.4</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.1</version>
</dependency>
cs


Controller 외에 Repository와 Service를 bean으로 등록하기 위해 전에 만들어 두었던 applicationContext-application.xml에 component-scan을 추가 했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 
    <context:component-scan base-package="com.chori.springStudy">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
    </context:component-scan>
</beans>
cs


그리고 데이터베이스 접속을 설정을 위한 dataSource를 등록합니다.

저는 applicationContext-datasource.xml 를 만들어 추가했습니다.

추가적으로 datasource.properties를 만들어 database를 접속하는 개인적인 정보를 가려줬구요.

관련 내용은 util:properties를 이용한 프로퍼티 사용(http://chori84.tistory.com/18)을 참조해 주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/util
                           http://www.springframework.org/schema/util/spring-util.xsd">
 
    <util:properties id="datasourceProperties" location="classpath:datasource.properties" />
 
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="#{datasourceProperties['mysql.url']}" />
        <property name="username" value="#{datasourceProperties['mysql.userId']}" />
        <property name="password" value="#{datasourceProperties['mysql.userPassword']}" />
    </bean>
</beans>
cs


그 후에 애플리케이션 컨텍스트에 SqlSessionFactory를 추가해주고 sqlSession을 사용하기 위해 SqlSessionTemplate도 추가해줬습니다.

SqlSessionFactory 빈의 프로퍼티에 dataSource를 넣어주고, mybatis-config.xmlMapper.xml 파일들도 넣어주었습니다. (곧 만들거에요~)

이건 applicationContext-persistence.xml을 만들어 추가했습니다.

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

mybatis-config.xml은 mybatis 설정 정보입니다.

1
2
3
4
5
6
7
<?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="user" type="com.chori.springStudy.user.domain.User"></typeAlias>
    </typeAliases>
</configuration>
cs


현재는 기본 셋팅을 사용하기 위해 다른 설정들은 하지 않았고, User 도메인만 user로 별칭을 줘서 mapper에서 패키지를 다 적을 필요 없이 user만으로 사용 가능합니다.


Mapper 파일에서 쿼리를 적어줍니다.

userMapper.xml 이에요.

mybatis-config.xml에서 별칭을 줬기 때문에 resultType을 그냥 user로 사용할 수 있어요.

1
2
3
4
5
6
7
8
9
10
<?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="mapper.com.chori.springStudy.userMapper">
    <select id="findAll" resultType="user">
        SELECT name, company, computer
        from USER
    </select>
</mapper>
 
cs



지금까지 파일 구조는 아래 처럼 했어요.


이제 설정이 잘 되었는지 테스트 해봅시다!

User 테이블은 아래 처럼 되있구요. 데이터는 한 줄만 넣어놨어요.


User 도메인 클래스구요. (mybatis-config.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
package com.chori.springStudy.user.domain;
 
public class User {
    String name;
    String company;
    String computer;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getCompany() {
        return company;
    }
 
    public void setCompany(String company) {
        this.company = company;
    }
 
    public String getComputer() {
        return computer;
    }
 
    public void setComputer(String computer) {
        this.computer = computer;
    }
}
 
cs


UserDao 클래스입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.chori.springStudy.user.dao;
 
import com.chori.springStudy.user.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import javax.sql.DataSource;
import java.util.List;
 
@Repository
public class UserDao {
    @Autowired
    SqlSession sqlSession;
 
    public List<User> findAll() {
        return sqlSession.selectList("mapper.com.chori.springStudy.userMapper.findAll");
    }
}
 
cs


UserDaoTest 클래스를 만들어서 테스트를 해봅시다.

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
package com.chori.springStudy.user.dao;
 
import com.chori.springStudy.user.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import java.util.List;
 
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
        "classpath:spring/applicationContext-*.xml"
})
public class UserDaoTest {
    @Autowired
    UserDao userDao;
 
    @Test
    public void findAllTest() {
        List<User> userList = userDao.findAll();
 
        assertThat(userList.size(), is(1));
 
        userList.forEach(user -> {
            System.out.println(user.getName());
            System.out.println(user.getCompany());
            System.out.println(user.getComputer());
        });
    }
}
cs


테스트를 실행하면 테스트도 잘 통과했고, 조회된 결과도 잘 출력 되네요.


최종 파일 구조는 이렇게 만들었어요~


applicationContext를 저렇게 여러개 만들 수도 있지만 하나에 다 몰아 넣어도 상관 없어요.

다만, Java 개발을 할 때도 역할에 따라 class를 나누듯이 applicationContext 설정 파일도 역할에 따라 나눠 봤습니다.


참조

http://www.mybatis.org/spring/ko/

Comments