iBatis에서 이어진 MyBatis는 훌륭한 SQL Mapper입니다. JPA 등 훌륭한 ORM 등이 있지만, 복잡한 연관관계에는 Query를 직접 입력하는 MyBatis처럼 훌륭한 프레임워크는 없습니다.
이번 글에서는 스프링 부트와 MyBatis를 연동합니다.
이전 글에서 MariaDB를 연동했어야 진행할 수 있습니다.
먼저 Dummy Data를 생성합니다. 터미널이나 DBeaver에서 실행합니다. 이전 글에서 portfolio라는 이름의 DB와 TB_TEST라는 테이블을 작성한 상태입니다.
INSERT INTO TB_TEST (name, content)
VALUES ('테스트 이름 1', '테스트 내용 1'),
('테스트 이름 2', '테스트 내용 2'),
('테스트 이름 3', '테스트 내용 3');
아래는 DBeaver 화면입니다. 테스트용 데이터가 저장된 것을 확인할 수 있습니다.
main > resources > application.properties에 아래 코드가 있어야 합니다.(저는 초기 프로젝트 세팅에서 작성했습니다.) 아래 코드는 Query가 입력된 xml 파일과 myBatis를 연동하는 역할을 합니다.
mybatis.mapper-locations=classpath:mappers/**/*.xml
VO는 Value Object, 즉 값 객체라는 뜻입니다. 객체와 객체가 통신할 때 담는 그릇이라고 생각하면 됩니다. main > java > com.portfolio > domain 아래에 TestVO를 작성합니다. TestVO는 앞서 만든 TB_TEST에 대응하는 Entity입니다.
package com.portfolio.domain;
import lombok.Data;
@Builder
@Data
public class TestVO {
private int id;
private String name;
private String content;
}
mapper는 interface입니다. Query가 작성된 xml과 대응합니다.
package com.portfolio.mapper;
import com.portfolio.domain.TestVO;
public interface TestMapper {
void create(TestVO vo);
}
xml은 실제 Query를 작성하는 부분입니다. main > resources > mappers 아래에 작성합니다. <mapper namespace>
xml에 대응하는 mapper interface를 작성합니다.
<?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.portfolio.mapper.TestMapper">
<insert id="create">
INSERT INTO TB_TEST(NAME, CONTENT)
VALUES (#{NAME}, #{CONTENT})
</insert>
</mapper>
test > java > com.portfolio > 아래에 mybatis 폴더를 생성합니다. MyBatisTests 이름의 클래스를 생성하고 아래 코드를 입력합니다.
package com.portfolio.mybatis;
import com.portfolio.domain.TestVO;
import com.portfolio.mapper.TestMapper;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
@MybatisTest
public class MyBatisTests {
@Autowired(required = false)
private TestMapper mapper;
@Test
public void create() {
TestVO testVO = TestVO.builder()
.name("test")
.content("test")
.build();
mapper.create(testVO);
}
}