오봉이와 함께하는 개발 블로그

Spring - IntelliJ MySQL&MyBatis 연동 오류 해결 본문

BE/Spring

Spring - IntelliJ MySQL&MyBatis 연동 오류 해결

오봉봉이 2022. 1. 10. 01:28
728x90

오류 내용

nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement
  • 데이터베이스 관련된 동작하면 위 오류 발생
  • Test 결과 root-context.xml에서 mapperLocations을 찾을 수 없다는 오류가 발생했다.
    • ProductMapper.xml을 찾지 못한다고 생각하여 경로를 다시 잡아 줬으나 이 문제는 아니였다.

해결 방법

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:sql-map-config.xml" />
        <property name="mapperLocations" value="classpath:ProductMapper.xml" />
    </bean>
  • sql-map-config.xml 추가
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <typeAliases>
        <typeAlias type="com.spring_mvc.mybatis.model.ProductVo" alias="prdResult"/>
    </typeAliases>
</configuration>

테스트 코드

  • MyBatisTest.java
    • 클래스 이름처럼 MyBatis 관련 테스트를 진행한다.
      • 해당 테스트를 통해 기능 동작 여부를 점검할 수 있었는데, 본인은 자꾸 root-context.xml에서 mapperLocations을 찾을 수 없다는 오류를 발견하여 문제 해결에 좀 더 도움이 되었다.
package dbtest;

import com.spring_mvc.mybatis.model.ProductVo;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.inject.Inject;
import java.util.ArrayList;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class MyBatisTest {
    @Inject
    private SqlSessionFactory sqlFactory;

    @Test
    public void testFactory(){
        System.out.println("\n >>>>>>>>>> sqlFactory 출력 : " + sqlFactory);
    }

    @Test
    public void testSession() throws Exception{
        try(SqlSession session = sqlFactory.openSession()){
            System.out.println(" >>>>>>>>>> session 출력 : " + session + "\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • MySQLTest.java
    • 클래스 이름과 같이 MySQL을 Test한다.
      • MySQL과 연결이 안된건가 했던 생각이 초기에 있었으나 이 테스트를 통해 연결은 문제없이 진행 되고 있다는 것을 알게 되었다.
package dbtest;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.inject.Inject;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DriverManager;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/root-context.xml" })
public class MySQLTest {
    @Inject
    private DataSource ds;
    @Test
    public void testConnection() throws Exception {
        try (Connection con = ds.getConnection()) {
            System.out.println("\n >>>>>>>>>> Connection 출력 : " + con + "\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

느낀 점

  • test 코드의 중요성을 알게 되었다.
    nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement 
    • 해당 오류만으로는 어떤 것이 문제인지 몰랐으니 테스트 코드 작성 후 오류 메세지를 보고나서 어떤 것이 문제인지 좀 더 구체적으로 알 수 있게 되었다.
728x90

'BE > Spring' 카테고리의 다른 글

Spring - REST & Ajax  (0) 2022.01.11
Spring - 간단한 예제  (0) 2022.01.11
Spring - IntelliJ MyBatis 연동  (0) 2022.01.07
IntelliJ에서 SpringMVC 프로젝트 생성  (0) 2022.01.07
Spring - Controller와 요청 처리  (0) 2022.01.07
Comments