우선 MyBatis를 알기 전에 JDBC를 먼저 알아야한다. 간단하게 JDBC는 Java에서 DB연동하기 위한 API다. 이 JDBC만 사용하게 되면 Java소스 와 Query소스가 겹치게 되고 관리가 어려워진다. 하지만 MyBatis는 SQL문을 XML형식의 파일로 분리시켜 저장 관리를 할 수 있고 Java소스 에서 id만 호출하여 개발을 하는데 편리해지는 장점이 있다.
프로젝트를 생성할 때 아래와 같이 SQL의존성을 포함합니다.
MySQL Driver는 Java Applecation이 MySQL에 접근할 수 있도록 돕는 드라이브입니다.
MyBatis Framework는 이번에 사용할 Framework입니다.
/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]
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();
}
}
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을 설치 하신 후 이클립스를 재시작 하시면 됩니다.
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;
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>
사용자 요청을 처리하고 응답을 전송하는 컨트롤러를 정의합니다.
/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
안녕하세요. 유익한 글 잘 보고 있습니다!
위 예제와 똑같이 따라했는데 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