Database ( DB )/ibatis, mybatis

Springboot에서 Mybatis 사용하는 방법

노루아부지 2022. 11. 2. 23:55

Springboot에서 Mybatis 사용하는 방법

 

 

 

1. Mybatis란?

Mybatis는 Java Persistence Framework의 하나로 XML 서술자나 Annotation을 사용하여 저장 프로시저나 SQL Query로 객체들을 연결시킵니다.

Mybatis는 IBATIS 3.0의 포크이며 IBATIS의 원 개발자들이 포함된 팀에 의해 유지 보수되고 있습니다.

 


2. 환경 설정

Mybatis를 사용하기 위해서는 먼저 Dependency, 접속 정보 설정 등의 환경 설정을 먼저 해야 합니다.

 

2.1. Dependency

Mybatis를 사용하기 위해서는 Maven이나 Gradle을 사용하여 Dependency를 추가해야 합니다.

 

2.1.1. Maven

pom.xml에 다음 코드를 추가합니다.

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.2.2</version>
</dependency>

<dependency>
  <groupId>org.mariadb.jdbc</groupId>
  <artifactId>mariadb-java-client</artifactId>
  <scope>runtime</scope>
</dependency>

 

2.1.2. Gradle

build.gradle에 다음 코드를 추가합니다.

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

 

 

2.2. application.properties

spring boot의 설정 파일인 application.properties나 application.yml에 Database 접속 정보와 mybatis 설정을 합니다.

#mariadb
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/test
spring.datasource.username=계정명
spring.datasource.password=계정 암호

# mybatis
mybatis.mapper-locations=classpath:mapper/*.xml

 

 

2.3. mapper 폴더 생성

application.properties에 설정한 경로에 mapper 폴더를 생성합니다.

중요! 무조건 소문자로 생성해야 합니다.

Springboot에서 Mybatis 사용하는 방법

 

 

 

3. Springboot에서 Mybatis 사용하는 방법

Springboot에서 mybatis를 사용하는 방법은 두가지가 있습니다.

  • mapper xml에 쿼리문을 만드는 방법
  • java에서 쿼리를 수행하는 방법

 

본격적인 방법을 알아보기에 앞서 User class를 생성합니다.

@Getter
@Setter
public class User {
  private int userId;
  private String userName;
  private String email;
}

 

 

3.1. xml에 쿼리문을 만드는 방법

먼저, mapper class에 insert method를 선언합니다.

이름은 UserDao, UserMapper, UserRepository 등 다양하게 사용하시면 됩니다.

@Mapper
public interface UserDao {
  int insert(User user);
}

 

그다음 xml에 insert query를 작성합니다.

<?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.example.demo.UserDao">
  <insert id="insert" parameterType="com.example.demo.User">
    insert into user (user_id, user_name, email)
    values (#{userId}, #{userName}, #{email})
  </insert>
</mapper>

 

 

그다음 테스트를 진행합니다.

import org.junit.jupiter.api.DisplayName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Transactional
class UserDaoTest {
  @Autowired
  private UserDao userDao;

  @org.junit.jupiter.api.Test
  @DisplayName("insert user")
  void insert() {
    int result = userDao.insert(new User(3, "test", "test@gmail.com"));
    assertEquals(1, result);
  }
}

 

insert에 문제가 없다면 이 테스트는 성공합니다. mybatis의 insert는 성공했다면 1이 리턴됩니다.

이 테스트를 실행한 후에 데이터베이스의 데이터를 실제로 확인해보면 데이터가 없는데, 이것은 정상입니다.

테스트에서 추가, 수정, 삭제된 데이터는 데이터베이스에 남지 않아야 하기 때문에 @Transactional annotation을 사용해서 테스트가 끝나면 rollback 합니다.

만약 데이터가 정상적으로 들어간 것을 확인하려면 @Transactional을 주석으로 막고 다시 실행하면 됩니다.

 

 

 

3.2. mapper에 직접 쿼리를 쓰는 방법

다음과 같이 mapper에 직접 쿼리를 사용합니다.

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;

@Mapper
public interface UserDao {
  int insert(User user);
  
  @Update("update user set user_name = #{userName} where user_id = #{userId}")
  int update(User user);
}

 

테스트를 진행합니다.

package com.example.demo;

import org.junit.jupiter.api.DisplayName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Transactional
class UserDaoTest {
  @Autowired
  private UserDao userDao;
    
  @org.junit.jupiter.api.Test
  @DisplayName("update user")
  void update() {
    int result = userDao.insert(new User(4, "test", "test@gmail.com"));
    assertEquals(1, result);

    result = userDao.update(new User(4, "test2", "test2@gmail.com"));
    assertEquals(1, result);
  }
}

update를 하기 위해서는 insert 된 데이터가 있어야 합니다.

따라서 하나의 테스트 안에서 데이터를 먼저 insert 한 후, update가 정상 동작하는지 확인합니다.

728x90
loading