Spring-boot : MyBatis를 이용하여 MySQL 연동하기

Fleuve·2020년 6월 16일
5

Spring-boot 익히기

목록 보기
1/1
post-thumbnail

1. MyBatis를 사용하는 이유?

우선 MyBatis를 알기 전에 JDBC를 먼저 알아야한다. 간단하게 JDBC는 Java에서 DB연동하기 위한 API다. 이 JDBC만 사용하게 되면 Java소스 와 Query소스가 겹치게 되고 관리가 어려워진다. 하지만 MyBatis는 SQL문을 XML형식의 파일로 분리시켜 저장 관리를 할 수 있고 Java소스 에서 id만 호출하여 개발을 하는데 편리해지는 장점이 있다.

2. Spring Boot MySQL연동 하기

프로젝트를 생성할 때 아래와 같이 SQL의존성을 포함합니다.
MySQL Driver는 Java Applecation이 MySQL에 접근할 수 있도록 돕는 드라이브입니다.
MyBatis Framework는 이번에 사용할 Framework입니다.

3. DB연결 정보 등록하기

/src/main/resources/application.properties파일에 아래와 같이 DB연결 정보를 등록합니다.

1. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2. spring.datasource.url=jdbc:mysql://localhost:3306/[DB이름]/serverTimeZone=UTC&CharacterEncoding=UTF-8
3. spring.datasource.username=[username]
4. spring.datasource.password=[password]

4. MyBatis 초기화하기

MyBatis는 App 전체에서 활용할 수 있도록 Application Class에서 초기화 합니다.
아래 코드를 참고해 JavaBean을 생성합니다.

package me.fleuve.springboot03;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@SpringBootApplication
public class SpringBoot03Application {

	public static void main(String[] args) {
		SpringApplication.run(SpringBoot03Application.class, args);
	}
    
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		sessionFactory.setDataSource(dataSource);
		
		Resource[] res = new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*Mapper.xml");
		sessionFactory.setMapperLocations(res);
		
		return sessionFactory.getObject();
	}

}

5. DTO 생성하기

Lombok을 이용하여 간편하게 정의합니다.
다음 경로로 아래 코드를 작성합니다.
/src/main/java/domain/aritifact/dto/UserDTO.java

package me.fleuve.springboot03.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@AllArgsConstructor // 자동으로 모든 매개변수를 받는 생성자를 생성
@Getter // Getter 생성
@Setter // Setter 생성
public class UserDTO {
    private int seq;
    private String name;
    private String country;

Lombok이 적용되지 않으시는 분들은 아래 처럼 Lombok을 설치 하신 후 이클립스를 재시작 하시면 됩니다.

6. DAO 생성하기

DAO는 class가 아니라 interface로 선언하여 데이터와 관련된 작업을 정의합니다.

다음 경로에 아래 코드를 작성합니다.
/src/main/java/domain/artifact/dao/UserDAO.java

package me.fleuve.springboot03.dao;

import me.fleuve.springboot03.dto.UserDTO;

import java.util.List;

public interface UserDAO {
List<UserDTO> selectUsers(UserDTO param) throws Exception;

7. SQL Mapper 생성하기

SQL Mapper는 실행할 SQL문을 정의해두는 파일입니다.
Application class에 정의 했던 /src/main/resource/mappers/*Mapper.xml과 같이 다음 경로에 아래 코드를 작성합니다
/src/main/resource/mappers/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="me.fleuve.springboot03/dao.UserDAO"><!--namespace를 통해 UserDAO와 연결합니다. -->
  		
  <select id="selectUsers" parameterType="me.fleuve.springboot03.dto.UserDTO"
resultType="me.fleuve.springboot03.dto.UserDTO"><!-- selectUsers()메서드를 호출하면 실행할 SELECT문이며, 
						UserDTO 객체를 파라미터로 받아, UserDTO객체를 반환합니다.-->
  	SELECT `seq`, `name`, `country`
    FROM lab03
    <if test='country != null and country != ""'><!-- 만약 파라미터에 country가 있다면 SQL문에 WHERE절을 추가합니다. -->
    	WHERE country = #{country}
    </if>
  </select>

</mapper>

8. Controller 생성하기

사용자 요청을 처리하고 응답을 전송하는 컨트롤러를 정의합니다.
/src/main/java/domain/artifact/controller/UserController.java

package me.fleuve.springboot03.controller;

import java.util.List;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import me.fleuve.springboot03.dao.UserDAO;
import me.fleuve.springboot03.dto.UserDTO;

@RestController
@MapperScan(basePackages="me.fleuve.springboot03.dao")//탐색할 패키시 설정
public class UserController {
	@Autowired
	private UserDAO userDAO;//UserDAO bean을 자동으로 주입
	
	@RequestMapping("/users")
	public List<UserDTO> users(@RequestParam(value="country", defaultValue = "")String country) throws Exception { //query String으로 county를 받도록 설정
		final UserDTO param = new UserDTO(0, null, country);//전달 받은 country를 받은 UserDTO 객체 생성 이 객체는 MyBatis에 파라미터로 전달
		final List<UserDTO> userList = userDAO.selectUsers(param);// 22번 째 줄에서 생성한 객체를 파라미터로 전달하여 DB로부터 사용자 목록을 불러온다.
		return userList;
	}
	
}

결과

서버를 실행하고 Postman에서 아래 API를 호출하면 다음과 같은 응답을 받습니다. http://localhost:8080/users

county를 파라미터로 넘기게 되면 다음과 같이 냥국에 해당하는 데이터만 조회를 할 수 있습니다.http://localhost:8080/users?country=냥국

🚨 마치며

이렇게 Spring boot에서 MyBatis를 사용하여 MySQL에 연동을 해봤습니다. 잘못된 점이 있으면 언제든지 피드백주시면 감사드리겠습니다.
예제 코드는 저의 Github에 공개 되었습니다.

https://github.com/ghd64845/spring_boot/tree/master/spring-boot-03

2개의 댓글

comment-user-thumbnail
2021년 3월 25일

안녕하세요. 유익한 글 잘 보고 있습니다!
위 예제와 똑같이 따라했는데 UserController 에서 다음과 같은 에러가 계속 발생합니다.. ㅜㅜㅜ
무엇이 문제일까요..?

error: constructor UserDTO in class UserDTO cannot be applied to given types;
required: no arguments
found: int,String,String
reason: actual and formal argument lists differ in length

1개의 답글