오봉이와 함께하는 개발 블로그
Spring - IntelliJ MySQL&MyBatis 연동 오류 해결 본문
728x90
오류 내용
nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement
- 데이터베이스 관련된 동작하면 위 오류 발생
- Test 결과 root-context.xml에서 mapperLocations을 찾을 수 없다는 오류가 발생했다.
- ProductMapper.xml을 찾지 못한다고 생각하여 경로를 다시 잡아 줬으나 이 문제는 아니였다.
해결 방법
-
- 해당 블로그를 보고 참고하였다.
프로젝트 디렉토리 구조
root-context.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 추가
- 해당 파일은 mapping에 VO 값을 전달해주는 역활을 한다.
- 출처: https://xzio.tistory.com/1263 [코딩창고]
- 해당 파일은 mapping에 VO 값을 전달해주는 역활을 한다.
<?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을 찾을 수 없다는 오류를 발견하여 문제 해결에 좀 더 도움이 되었다.
- 클래스 이름처럼 MyBatis 관련 테스트를 진행한다.
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과 연결이 안된건가 했던 생각이 초기에 있었으나 이 테스트를 통해 연결은 문제없이 진행 되고 있다는 것을 알게 되었다.
- 클래스 이름과 같이 MySQL을 Test한다.
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