Spring Boot에서 Mybatis 사용하기

yshjft·2023년 11월 26일
0

MyBatis

목록 보기
3/3

잘못된 내용이 있을 수도 있습니다.

DB 세팅

DB는 Postgresql을 사용하였습니다. 컴퓨터에 직접 Postgresql을 사용하는 것은 너무나 귀찮으니 도커를 사용하였습니다.

(1) 컨테이너 실행

docker run -p 5432:5432 -e POSTGRES_PASSWORD=hys0605 -d --name=PG_TEST postgres

참고한 자료

postgresql 도커 관련 좀 더 자세한 내용은 도커허브 참고

(2) CREATE DATABASE

위의 도커 명령어가 정상적으로 실행되었다면 이제는 사용 데이터베이스를 만들어야 합니다.

  • postgresql 컨테이너 접속 : docker exec -it PG_TEST bash
  • postgresql client 접속 : psql -U postgres
  • 데이터베이스 목록 확인 : \l
  • 데이터베이스 생성 : CREATE DATABASE test;
  • 데이터베이스 생성 확인 : \l

※ 앞에서 postgresql 컨테이너를 실행시킬 때 따로 username을 지정하지 않았기 때문에 기본 이름인 ‘postges’가 사용자 이름입니다.

참고한 자료

CREATE USER & CREATE DATABASE 1
CREATE USER & CREATE DATABASE 2

(3) DB 연결 확인 및 테이블 생성

각자 사용하는 DB 툴을 앞에서 생성한 DB에 연결하고 사용할 테이블을 만들고 데이터를 추가합니다.

Spring Boot

gradle 의존성 설정

  • Spring Boot에서 MyBatis를 사용하기 위해서는 org.mybatis.spring.boot:mybatis-spring-boot-starter가 필요합니다.

application.yml에서 DB 및 MyBatis 설정

spring:
  application:
    name: Spring-Boot-MyBatis
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/test
    username: postgres
    password: hys0605
mybatis:
  mapper-locations: classpath:mapper/*.xml
server:
  port: 8081
  • mybatis.mapper-locations : xml이 있는 위치 지정

xml 파일 추가 및 mapper 인터페이스 생성

인터페이스를 만들고 @Mapper를 추가합니다. 해당 인터페이스의 메서드는 xml 파일에 작성되는 쿼리와 매핑됩니다.

package com.hys.sample.employee.mapper;


import com.hys.sample.employee.model.Department;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface EmployeeMapper {
    List<Department> selectDepartmentList();
}

yml에 명시한 위치에 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.hys.sample.employee.mapper.EmployeeMapper">
    <select id="selectDepartmentList" resultType="com.hys.sample.employee.model.Department">
        select *
        from departments
    </select>
</mapper>

앞에서 만들어진 mapper 인터페이스의 메서드를 이용하여 쿼리를 호출합니다.

package com.hys.sample.employee.service;

import com.hys.sample.employee.model.Department;
import com.hys.sample.employee.mapper.EmployeeMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class EmployeeService {
    private final EmployeeMapper employeeMapper;

    public List<Department> getDepartmentList() {
        return employeeMapper.selectDepartmentList();
    }
}

참고한 자료

Spring Boot에서 MyBatis 사용

정리

MyBatis 관련 설정

mybatis-spring-boot-starter

@Mapper를 까보면 알겠진만 @Controller, @Service 와 달리 Bean 등록을 위한 어노테이션이 아닙니다. 그렇다면 매퍼 인터페이스는 어떻게 다른 빈에서 주입되어 사용될 수 있을까요? 위의 이미지는 MyBatis 공식 문서에 있는 내용을 캡처한 것이고 이를 해석한 내용은 아래와 같습니다.

아시다시피 MyBatis를 Spring과 함께 사용하려면 적어도 SqlSessionFactory와 적어도 하나의 매퍼 인터페이스가 필요합니다.

mybatis-spring-boot-starter는
* 기존 DataSource 자동 탐지합니다.
* SqlSessionFactoryBean을 사용하여 해당 DataSource를 입력으로 전달하는 SqlSessionFactory의 인스턴스를 생성하고 등록합니다.
* SqlSessionFactory에서 가져온 SqlSessionTemplate의 인스턴스를 생성하고 등록합니다.
* Mapper를 자동 스캔하여 SqlSessionTemplate에 연결하고 Spring Context에 등록하여 빈에 주입합니다.

아주 쉽게 말하면 mybatis-spring-boot-starter가 알아서 매퍼 인터페이스를 빈으로 등록해주는 것입니다.

곁들여 볼 내용

❗️mybatis-spring-boot-starter 사용시 반드시 버전 확인❗️

  • mybatis-spring-boot-starter를 추가할 때는 반드시 Spring Boot의 버전도 함께 고려하세요.
  • 버전이 안맞으면 제대로 동작하지 않습니다. 매퍼 인터페이스가 제대로 빈 등록이 안됩니다.(아래는 제가 마주한 오류들.... )
    • Parameter 0 of constructor in required a bean of type ~
    • Invalid value type for attribute 'factoryBeanObjectType': java.lang.String ~
  • mybatis-spring-boot-starter 버전 관련
profile
꾸준히 나아가자 🐢

1개의 댓글

comment-user-thumbnail
2024년 4월 20일

좋은 내용 정말 잘 보고 갑니다!

감사합니다.

답글 달기