
jpa가 아닌 다른 DB 접근 기술을 활용하자 (MyBatis)gradle이 아닌 maven을 이용하자mysql이 아닌 h2 내장 DB를 적극 활용하자yml 형식이 아닌 properties를 사용해보자제가 항상 늘 사용하던 ..jpa...gradle..mysql...yml...없이...
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
DROP TABLE IF EXISTS todo;
CREATE TABLE todo
(
id INTEGER PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(255) NOT NULL,
isCompleted CHARACTER NOT NULL
);
insert into todo (content, isCompleted) values ('Study spring', 'N');
insert into todo (content, isCompleted) values ('Study mybatis', 'N');
<?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>
<?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>

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;
}
}
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);
}

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);
}
}
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";
}
}



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