잘못된 내용이 있을 수도 있습니다.
DB는 Postgresql을 사용하였습니다. 컴퓨터에 직접 Postgresql을 사용하는 것은 너무나 귀찮으니 도커를 사용하였습니다.
docker run -p 5432:5432 -e POSTGRES_PASSWORD=hys0605 -d --name=PG_TEST postgres
postgresql 도커 관련 좀 더 자세한 내용은 도커허브 참고
위의 도커 명령어가 정상적으로 실행되었다면 이제는 사용 데이터베이스를 만들어야 합니다.
docker exec -it PG_TEST bash
psql -U postgres
\l
CREATE DATABASE test;
\l
※ 앞에서 postgresql 컨테이너를 실행시킬 때 따로 username을 지정하지 않았기 때문에 기본 이름인 ‘postges’가 사용자 이름입니다.
CREATE USER & CREATE DATABASE 1
CREATE USER & CREATE DATABASE 2
각자 사용하는 DB 툴을 앞에서 생성한 DB에 연결하고 사용할 테이블을 만들고 데이터를 추가합니다.
org.mybatis.spring.boot:mybatis-spring-boot-starter
가 필요합니다.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이 있는 위치 지정인터페이스를 만들고 @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();
}
}
@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
를 추가할 때는 반드시 Spring Boot의 버전도 함께 고려하세요.Parameter 0 of constructor in required a bean of type ~
Invalid value type for attribute 'factoryBeanObjectType': java.lang.String ~
좋은 내용 정말 잘 보고 갑니다!
감사합니다.