Spring Boot와 MyBatis로 기본 CRUD API 구현하기

이번 글에서는 Spring Boot와 MyBatis를 이용해 기본적인 데이터 CRUD 기능을 제공하는 REST API를 구현하는 방법을 정리한다. MySQL 데이터베이스에 user 테이블을 생성하고, MyBatis의 XML 매퍼와 어노테이션을 혼용하여 간단한 사용자 관리 API를 만든다.

1. 데이터베이스 테이블 준비

다음과 같은 user 테이블을 MySQL에 생성한다.


CREATE TABLE user (
  id INT AUTO_INCREMENT PRIMARY KEY,
  userName VARCHAR(50),
  passWord VARCHAR(50),
  realName VARCHAR(50)
);

2. 프로젝트 구성 및 의존성

Spring Boot 2.7.4 기반 프로젝트를 생성하고, pom.xml에 다음 의존성을 추가한다.

  • spring-boot-starter-web
  • mybatis-spring-boot-starter (2.2.2)
  • mysql-connector-java (5.1.47)
  • lombok (1.16.18)
  • hutool-all (5.4.1) – 문자열 포매팅 등 유틸리티용

3. 디렉토리 구조

소스 코드는 다음과 같은 패키지로 구성한다.

  • com.Control – 컨트롤러
  • com.Control.revice – 요청 DTO
  • com.Dao – 엔티티
  • com.Dao.Mapper – MyBatis 매퍼 인터페이스
  • com.Service.Impl – 서비스 구현

매퍼 XML 파일은 resources/mapper/ 디렉토리에 위치시킨다.

4. 애플리케이션 설정 파일

application.yaml에 데이터소스와 MyBatis 관련 설정을 추가한다.


server:
  port: 8002

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3339/sys?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  type-aliases-package: com.Dao

logging:
  level:
    com.example.mapper: debug

참고: MySQL 5.x는 com.mysql.jdbc.Driver, MySQL 6+는 com.mysql.cj.jdbc.Driver를 사용한다.

5. 엔티티 클래스

User 클래스는 데이터베이스의 user 테이블과 매핑된다. Lombok의 @Data로 getter/setter를 자동 생성한다.


package com.Dao;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String userName;
    private String passWord;
    private String realName;
}

6. 요청 DTO 클래스

userparam은 클라이언트로부터 전달받은 데이터를 담는 DTO이다.


package com.Control.revice;

import lombok.Data;

@Data
public class userparam {
    int id;
    String name;
    String userName;
    String passWord;
    String realName;
}

7. MyBatis 매퍼 인터페이스

UserMapper는 CRUD 메서드를 정의하며, 일부는 XML 파일로, 일부는 어노테이션으로 구현한다.


package com.Dao.Mapper;

import com.Control.revice.userparam;
import com.Dao.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper {
    User Sel(int id);
    int Up(userparam user);
    int Int(userparam ints);
    int Del(userparam del);
}

8. 매퍼 XML 파일

resources/mapper/UserMapper.xml에서 SelUp 메서드의 SQL을 정의한다.


<?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.Dao.Mapper.UserMapper">

    <select id="Sel" resultType="com.Dao.User">
        select * from user where id = #{id}
    </select>

    <update id="Up" parameterType="com.Control.revice.userparam">
        update user set userName = #{name} where id = #{id}
    </update>

</mapper>

추가/삭제는 인터페이스에 어노테이션으로 처리한다.

9. 서비스 계층

UserService는 매퍼를 호출하고 결과를 가공한다.


package com.Service.Impl;

import cn.hutool.core.util.StrUtil;
import com.Control.revice.userparam;
import com.Dao.User;
import com.Dao.Mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    @Autowired
    UserMapper userMapper;

    public User Sel(int id){
        return userMapper.Sel(id);
    }
    public Object Up(userparam user){
        int num = userMapper.Up(user);
        return StrUtil.format("Updated {} rows", num);
    }
    public Object Int(userparam ints){
        int num = userMapper.Int(ints);
        return StrUtil.format("Inserted {} rows", num);
    }
    public Object Del(userparam del){
        int num = userMapper.Del(del);
        return StrUtil.format("Deleted {} rows", num);
    }
}

10. 컨트롤러

UserController는 RESTful API 엔드포인트를 제공한다.


package com.Control;

import com.Control.revice.userparam;
import com.Service.Impl.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@ResponseBody
@RequestMapping("/testBoot")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/getUser/{id}")
    public String GetUser(@PathVariable int id){
        return userService.Sel(id).toString();
    }

    @PutMapping("/update")
    public String updateUser(@RequestBody userparam user){
        return userService.Up(user).toString();
    }

    @PutMapping("/insert")
    public String insertUser(@RequestBody userparam ints){
        return userService.Int(ints).toString();
    }

    @DeleteMapping("/delete")
    public String deleteUser(@RequestBody userparam del){
        return userService.Del(del).toString();
    }
}

11. 메인 클래스 및 Mapper 스캔

@MapperScan 애노테이션으로 매퍼 인터페이스의 위치를 지정한다.


package com;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.Dao.mapper")
public class SpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
}

12. 실행 및 테스트

애플리케이션을 실행한 후 다음 엔드포인트로 요청을 보내면 CRUD 동작을 확인할 수 있다.

  • GET /testBoot/getUser/1 – ID가 1인 사용자 조회
  • PUT /testBoot/update – body에 { "id":1, "name":"newname" } 형식으로 전송하여 사용자 이름 업데이트
  • PUT /testBoot/insert – body에 { "userName":"test", "passWord":"123", "realName":"Test User" } 전송하여 새 사용자 추가
  • DELETE /testBoot/delete – body에 { "id":1 } 전송하여 사용자 삭제

태그: Spring Boot MyBatis MySQL REST API CRUD

5월 30일 21:16에 게시됨