본문 바로가기
스프링/MyBatis

스프링부트 2.7.x 버전에서 MyBatis 시작하기

by 진믈리 2024. 8. 28.

스프링부트 공식 문서를 확인해 보면 상용지원은 25년 2월까지 진행된다고 나와있다. 그렇다면 지금 스프링부트 2.7버전을 사용하고 있는 많은 회사들이 마이그레이션을 진행할텐데 그 과정을 한번 학습해 보고자 프로젝트를 실시 하려 한다.

 

Mybatis Spring boot starter 버전 3 은 스프링부트 2.7 버전과 호환되지 않는다. 따라서 2버전을 사용해야하는데 Maven Repository에서 사람들이 가장 많이 사용한 2.2.2 버전을 선택했다.

 

Mybatis Spring boot starter 2.2.2 버전에는 Mybatis 3.5.9 버전이 포함되어 있었다. 

 

 

1.MyBatis 테이블 생성

JPA를 사용할 때는 @Entity 애너테이션을 통해 엔티티 클래스를 정의하면 Spring Data JPA가 자동으로 데이터베이스 테이블을 생성해 준다. 그러나 MyBatis에서는 이러한 기능이 제공되지 않는다. 그래서 MyBatis는 테이블을 수동으로 생성하거나 schema.sql 파일을 작성하여 애플리케이션이 시작될 때 테이블을 생성하는 작업이 필요하다.

 

resources 디렉토리 위치에 sql파일을 위치 시킨다면 Spring Boot는 애플리케이션이 시작될 때 이 파일을 자동으로 실행하여 생성한다.

 

2. Mapper interface

MyBatis 공식 문서를 살펴보면 @Mapper 인터페이스가 필요하다고 한다. 

 

MyBatis의 mapper 인터페이스를 살펴보면 JPA의 repository 인터페이스랑 비슷하게 생겼다. 실제로 기능적으로도 유사한 점이 많다.

두개의 방식의 차이점은 추후 자세히 다루도록 하겠다.

 

 

2-1. 어노테이션 방식

@Mapper
public interface MemberMapper {
    @Select("SELECT * FROM member")
    List<Member> findALL();

    @Insert("INSERT INTO member(username) values (#{member.username})")
    void save(@Param("member") Member member);
}

먼저 어노테이션을 활용한 방법이다. Member 객체에는 간단하게  id 와 username 만 속성을 만들었다.

 

JPA는 엔티티 객체를 대상으로 하여 JPQL을 작성하면 Hibernate가 특정 데이터베이스에 맞는 SQL로 변환하지만 MyBatis에서는 SQL 쿼리를 직접 작성해야한다.

실제로 테스트를 해보니 잘 동작하는 모습이다.

 

2-2. XML 방식

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.jinmlee.mybatis_study.mapper.MemberMapper">
    <insert id="save">
        INSERT INTO member (username) values (#{member.username})
    </insert>
    
    <select id="findALL" resultType="com.jinmlee.mybatis_study.vo.Member">
        SELECT * FROM MEMBER
    </select>
</mapper>
@Mapper
public interface MemberMapper {
//    @Select("SELECT * FROM member")
    List<Member> findALL();

//    @Insert("INSERT INTO member(username) values (#{member.username})")
    void save(@Param("member") Member member);
}

 

XML 방식은 resources 에 xml 파일을 만들어 주는 것이다.  그리고 Mapper인터페이스에서는 따로 쿼리문을 작성하지 않는다 만약 두군데 다 쿼리문을 작성한다면 충돌이 발생하여 오류가 발생한다.

 

이것도 똑같은 테스트 코드를 실행시켜보면 정상적으로 작동하는 것을 확인할 수 있다.

 

xml 방식을 사용할때 주의할 점은 xml파일 위치를 Mapper인터페이스의 디렉토리 구조와 같게 해야 한다는 것이다.

 

만약 다르게 설정하고 싶다면 application.yml 파일에 설정해 주면 된다.