티스토리 뷰

프로그래밍/웹

Spring - Mysql 연동

박스여우 2017. 2. 8. 00:05

안녕하세요 박스여우입니다. 이번 포스팅은 요즘 프로젝트를 진행하며 사용하고 있는 Spring에 대한 포스팅을 작성해 보도록 하겠습니다. Spring에서는 JDBC를 사용하지만, Mybatis라는 프레임워크를 사용합니다. 따라서 이번 포스팅에서는 Spring에서 Mybatis를 이용하여 Mysql을 사용하는 방법에 대해 알아보도록 하겠습니다.



Mybatis란?

우선 Mysql을 연동하기 전에 Mysql을 관리하게될 Mybatis라는 녀석에 대해서 알아보고 넘어가도록 하겠습니다. Mybatis는 JDBC로 처리하는 상당 부분의 작업을 대신해주고 SQL 문을 코드로부터 완전히 분리해줄 수 있는 퍼시스턴스 프레임워크 입니다. Spring에서 직접 JDBC를 사용하여 DB를 사용할 수 있지만, Mybatis를 사용하는 것이 사실상 표준화되어있다고 볼 수 있습니다.

Mybatis의 장점 중 가장 큰 점은 바로 빠른 개발이 가능하다는 점에 있습니다. 개발이 빠르다는 것은 생산성이 높다는 것입니다. 이에 대한 내용은 Mybatis를 사용하시다 보면 느끼실 수 있겠지만 순수하게 DBCP만을 썼을때에는 Connection, ResultSet, Statement, Transaction 등을 모두 개발바 스스로가 관리해야 합니다. 하지만 Mybatis는 이러한 것들을 관리해주며 DB를 다루는 코드를 현저하게 줄여줍니다. 이외에도 Mybatis를 사용하게 되면 PrepareStatment와 같이 SQL Injection을 고려하지 않아도 되며, 다양하고 편리한 기능들을 사용할 수 있습니다.


이렇게 설명만 들어서는 정확히 Mybatis가 무엇을 하는 것인지 감이 안 올 것 같습니다. 아래에서 본격적으로 Mybatis를 적용해 사용해보며 Mybatis의 사용방법을 알아보도록 하겠습니다.



Spring에 Mysql을!

그럼 본격적으로 Spring에서 Mysql을 사용하기 위한 연동작업을 진행해 보도록 하겠습니다. 만약 Spring 빌드환경이 셋팅되지 않으셨다면 이전 포스팅 부터 따라서 진행하고 오시는 것을 추천해 드립니다. 그리고 원활한 진행을 위해 database에 id와 name 컬럼을 가지고 있는 테이블을 하나 생성해 주시기 바랍니다.


Maven dependency 추가

우선 Mybatis와 Mysql JDBC를 사용하기 위해 Maven(pom.xml) dependency를 추가해 주셔야 합니다. 아래 4가지 라이브러리를 추가해 주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
 
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql-version}</version>
</dependency>
 
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.7</version>
</dependency>
 
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.2</version>
</dependency>
 
cs

root-context 설정
dependency를 추가하셨으면 root-context.xml내에 mysql의 접속정보와 sqlSession과 sqlSession을 관리하는 sqlSessionFactory, 트랜젝션을 관리하는 transactionManager를 선언해 둡니다. mysql 접속정보(dataSource)의 url과 username, password는 자신의 db에 맞게 설정해 주시면 됩니다.


mybatis-config 생성

mybatis에 대한 세팅을 하기 위해 src/main/resources/mybatis/ 경로에 mybatis-config.xml을 생성해 주시고 아래와 같이 XML을 작성해 주세요.

1
2
3
4
5
6
7
8
9
10
<?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>
    <mappers >
        <mapper resource ="/mybatis/mapper-test.xml"/>
    </mappers >
</configuration>
cs
mapper는 SQL을 매핑하여 메소드 형태로 사용할 수 있도록 해 주는 mybatis의 가장 큰 장점 중 하나입니다. mapper를 생성하면 mybatis-config에 등록하여 사용 가능하도록 할 수 있습니다.


DTO-Data Transfer Object 선언

Mapper에 사용될 Data 형식을 선언하기 위해 DTO를 생성해 주도록 하겠습니다. DTO는 Data Transfer Object의 약자로 이름 그대로 Data를 교환하기 위한 Object입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.test.dto;
 
public class TestDTO {
    private String id, name;
 
    public TestDTO() {
    }
 
    public String getId() {
        return id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
cs

DTO는 사용되는 모든 멤버 변수에 대해 getter와 setter를 선언해 주어야 하며 매개변수가 없는 기본생성자를 반드시 선언해 두어야만 Mapper에서 사용할 수 있습니다.


mapper-test.xml 생성

테스트용 mapper를 만들기 위해서 위의 mybatis-config 파일을 생성한 경로에 mapper-test.xml 파일을 생성하고 아래와 같이 XML을 작성해 주세요

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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.test.mapper.TestMapper">
 
    <resultMap type="com.test.dto.TestDTO" id="TestResultList">
        <result property="id" column="id" />
        <result property="name" column="name" />
    </resultMap>
 
    <select id="selectUsers" resultMap="TestResultList">
        SELECT id,name FROM user
    </select>
 
    <insert id="insertUser" parameterType="com.test.dto.TestDTO">
        INSERT into user (id, name) values(#{id}, #{name})
    </insert>
    
</mapper>
cs
내용을 보시면 아시겠지만 쿼리를 매핑하고 위에서 선언한 DTO클래스를 통해 매개변수 또는 select 내용을 반환받습니다. 또한, TestResultList와 같이 Result Map을 선언하여 사용하게 되면 List<Type>과 같은 형태로 쿼리 수행 결과가 반환됩니다.


TestMapper 선언

Mapper에 매핑된 쿼리를 프로그래밍적으로 메소드를 호출하여 사용하기 위해서는 Mapper의 어노테이션을 선언한 Mapper 인터페이스를 생성해 주어야 합니다.

1
2
3
4
5
6
7
8
9
package com.test.mapper;
 
import com.test.dto.TestDTO;
 
public interface TestMapper{
    
    public List<TestDTO> selectUsers();
    public void insertUser(TestDTO data);
}
cs
위의 코드와 같이 mapper에 선언해 둔 쿼리와 이름, 매개변수, 반환 타입 등을 일치하게 선언해 주면 드디어 Mapper 선언이 끝나게 됩니다. 이렇게 선언된 Mapper는 sqlSession을 통해 꺼내서 사용할 수 있습니다.

TestMapper 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Controller
public class HomeController {
 
@Controller
public class HomeController {
    
    @Autowired
    private SqlSession sqlSession;
    
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        TestMapper mapper = sqlSession.getMapper(TestMapper.class);
        TestDTO dto = new TestDTO();
        dto.setId("testId");
        dto.setName("testName");
        mapper.insertUser(dto);
        
        TestDTO user = mapper.selectUsers().get(0);
        System.out.println(user.getId());
        System.out.println(user.getName());
        return "home";
 }
}
cs

@Autowired 어노테이션을 통해 SqlSession 객체는 Spring, Mybatis의 라이프사이클을 따라 자동으로 바인딩 되며 12번 라인과 같이 sqlSession을 통해 등록해 두었던 mapper를 사용할 수 있습니다.


위의 과정을 모두 잘 따라오셨다면 서버를 실행하신 뒤 출력되는 결과를 확인하실 수 있으실 겁니다. 긴 과정 따라오시느라 수고하셨습니다. 감사합니다.



'프로그래밍 > ' 카테고리의 다른 글

Nodejs - Request의 paramaters 사용  (0) 2017.02.12
Nodejs mongodb  (0) 2017.02.11
Javascript - JQuery없이 POST 전송하기(Google URL Shortener)  (0) 2016.11.14
AngularJS  (0) 2016.08.18
AngularJS  (0) 2016.08.09
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
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
글 보관함