스프링부트 마이바티스 설정 Field mapper 오류가 난다면 확인해 보세요
개인 취미 생활로 스프링부트 환경에서 사이트를 만들고 있습니다. mybatis를 연동해 데이터베이스에 있는 데이터를 가져오려고 했는데 아래 이미지와 같이 Field mapper in required a bean of type that could not be found. Consider defining a bean of type in your configuration. 라는 오류가 나며 구동이 제대로 안 되더군요. 이 오류 때문에 꽤 긴 시간을 허비했습니다. 문제는 새로운 스프링부트 버전 build.gradle 설정 MyBatis 버전을 3.0 이하 버전을 사용해 겪었던 문제였습니다.
스프링 버전에 맞추어 Mybatis 버전도 그에 맞게끔 버전을 맞춰서 세팅해야 하는데 인터넷 자료를 하나하나 참고해 진행하다 보니 이미 시간이 오래 지난 코드를 복사해서 붙여 넣다 보니 항상 초기 세팅 시 문제가 생깁니다.
마이바티스 설정 오류로 인해 마이바티스 관련 파일을 찾지 못해 설정을 확인해 보라는 메시지가 표시되었던 것입니다. 오류 문구를 확인하고 곰곰이 생각해 보아야 했는데 버전이 낮아서 문제가 있을 거라고 예상도 못했습니다. 결국엔 아래 이미지와 같이 Mybatis 버전을 올리니 정상적으로 구동하더군요.
// MyBatis
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1'
자바는 할 때마다 느끼는 것이지만 세팅에 너무 긴 시간을 허비하며 버전에 너무 민감합니다. 스프링 환경에서 이러한 버전 문제가 있다면 자동으로 수정되게끔 하거나 이전 버전을 포함해 오류가 나지 않게 환경이 변화되면 좋을 텐데 세팅할 때마다 고생하는 것 같습니다.
아래 이미지와 같이 로컬 호스트에서 db에 있는 데이터를 select 해 시스템 아웃을 찍어보니 데이터베이스에 있는 값을 잘 가져옵니다. 오른쪽 빈 웹페이지 화면은 잘되는지 테스트해 보기 위해 아무것도 없는 페이지에 컨트롤러에서 프린트로 값을 찍어본 결과입니다.
혹시 모르니 폴더 구조와 테스트했던 소스 파일을 첨부해 테스트에 참고 하시기를 바랍니다. 아래 이미지는 스프링부트 폴더 구조이니 참고 하세요.
application.properties
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/zzarungna
spring.datasource.username=root
spring.datasource.password=비밀번호
#프로젝트 실행시 자동으로 DDL 생성
spring.jpa.hibernate.ddl-auto=update
#JPA 구현체인 Hibernate가 동작하면서 발생하는 SQL을 formating해서 출력
spring.jpa.properties.hibernate.format_sql=true
#JPA 처리시에 발생하는 SQL을 보여줄것인지 결정
spring.jpa.show-sql=true
#Mapper.java 파일이 위치한 경로
mybatis.type-aliases-package=com.zzarungna.site.mapper
#Mapper.xml 파일이 위치한 경로
mybatis.mapper-locations=mybatis/**/*.xml
build.gradle
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.1.1'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.zzarungna'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//thymeleaf - html 페이지에 데이터 주고 받으려면 이거 있어야 함.
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
//maria db 연결에 필요함.
implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '3.0.5'
//getter setter 자동 생성 롬복
implementation 'org.projectlombok:lombok'
// MyBatis
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1'
// log4jdbc
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
}
tasks.named('test') {
useJUnitPlatform()
}
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zzarungna.site.mapper.TestMapper">
<select id="select" resultType="string">
SELECT name FROM user
</select>
</mapper>
TestMapper.java
package com.zzarungna.site.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Repository
@Mapper
public interface TestMapper {
String select();
}
TestService.java
package com.zzarungna.site.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.zzarungna.site.mapper.TestMapper;
@Service
@Transactional
public class TestService {
@Autowired
private TestMapper mapper;
public String select() {
return mapper.select();
}
}
TestController.java
package com.zzarungna.site.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.zzarungna.site.service.TestService;
@Controller
public class TestController {
@Autowired
private TestService service;
@RequestMapping(value="/db")
public String db() {
System.out.println("DB 데이터 가져오기");
String dbdata = service.select();
System.out.println(dbdata);
return "/db";
}
}
혹시나 저와 같은 문제로 인해 고생하고 계시는 분들이 있다면 위 내용도 해결 방법의 하나이니 참고 하셔서 문제 해결에 도움이 되었기를 바랍니다.