[Spring boot] MyBatis 사용하기 (익숙하지 않은 기술에 경험을 쌓자)

JO Yeongmu·2024년 5월 18일
0

Spring Boot

목록 보기
5/8
post-thumbnail

목표 🏆

  • jpa가 아닌 다른 DB 접근 기술을 활용하자 (MyBatis)
  • gradle이 아닌 maven을 이용하자
  • mysql이 아닌 h2 내장 DB를 적극 활용하자
  • yml 형식이 아닌 properties를 사용해보자

제가 항상 늘 사용하던 ..jpa...gradle..mysql...yml...없이...


application.properties 작성 📗

spring.datasource.diver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:todo
spring.datasource.username=아이디
spring.datasource.password=비밀번호

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

mybatis.config-location=classpath:mybatis/mybatis-config.xml

예시 schema.sql + data.sql 작성 ⚙️

  • schema.sql
DROP TABLE IF EXISTS todo;

CREATE TABLE todo
(
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(255) NOT NULL,
    isCompleted CHARACTER NOT NULL
);
  • data.sql
insert into todo (content, isCompleted) values ('Study spring', 'N');
insert into todo (content, isCompleted) values ('Study mybatis', 'N');

xml 작성 ⚙️

  • mybatis-config.xml
<?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/todo-mapper.xml"/>
    </mappers>
</configuration>
  • todo-mapper.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="com.example.todo.mapper.TodoMapper">
    <insert id="save">
        INSERT INTO todo(CONTENT, ISCOMPLETED)
        VALUES (#{todo.content}, #{todo.isCompleted})
    </insert>
</mapper>

  • 현재 구조


Vo 작성 ⚙️

package com.example.todo.vo;


public class Todo {
    private String content;
    private String isCompleted;

    public Todo(String content, String isCompleted) {
        this.content = content;
        this.isCompleted = isCompleted;
    }
    
    public Todo(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getIsCompleted() {
        return isCompleted;
    }

    public void setIsCompleted(String isCompleted) {
        this.isCompleted = isCompleted;
    }
}


mapper 작성 (중요) ⚙️

package com.example.todo.mapper;

import com.example.todo.vo.Todo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface TodoMapper {
    void save(@Param("todo") Todo todo);
}

  • mybatis xml 의 값과 정확하게 매칭 되지 않으면 오류가 뜹니다 !


service 작성 ⚙️

package com.example.todo.service;

import com.example.todo.mapper.TodoMapper;
import com.example.todo.vo.Todo;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TodoService {

    private final TodoMapper todoMapper;

    public TodoService(TodoMapper todoMapper) {
        this.todoMapper = todoMapper;
    }

    public void addTodo(Todo todo) {
        todo.setIsCompleted("N");
        todoMapper.save(todo);

    }
}

controller 작성 ⚙️

package com.example.todo.controller;

import com.example.todo.service.TodoService;
import com.example.todo.vo.Todo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class TodoController {

    private final TodoService todoService;

    public TodoController(TodoService todoService) {
        this.todoService = todoService;
    }

    @PostMapping("/todo")
    @ResponseBody
    public String addTodo(@RequestBody Todo todoParam) {
        Todo todo = new Todo(todoParam.getContent());
        todoService.addTodo(todo);
        return "success";
    }
}

테스트 성공 🎉

  • postman 으로 테스트한 결과 성공 !

  • h2 데이터 확인



느낀점 ✏️

토이 프로젝트에서는 간단한 쿼리들 밖에 없기 때문에 JPA가 너무 편하게 느껴졌습니다.
JPA를 활용할 때는 복잡한 동적 쿼리들에 대해서 querydsl을 활용하여 고민하거나 fetch join 등 을 고민하면 되었습니다.
그로인한 단점이 SQL 쿼리문이 점점 어색하게 느껴져 가는 느낌이 있었습니다.
결론 적으로는, mybatis를 활용하면 쿼리문을 직접 작성하기 때문에 SQL 쿼리문에 더욱 익숙해 질 수 있을 것 같으며, 쿼리문을 통한 튜닝도 가능할 것 같다는 생각에 긍정적으로 봅니다 ㅎㅎ

profile
도전해 보는 것이 성장의 첫걸음입니다 :)

0개의 댓글