스프링 부트와 MySQL DB를 연동하여 간단한 로그인/회원가입을 처리하는 기능을 구현하려고 하였다.
브라우저에서 입력 받은 아이디와 비밀번호를 전달하면 백엔드 서버 - DB를 거쳐 일치하는 값이 있으면 성공, 없으면 실패를 반환하도록 설정하였다.
에러 발생
그런데 요청을 보내면 계속해서 해당 오류가 발생하여 작업을 수행하지 못했다.
org.apache.ibatis.binding.bindingexception invalid bound statement not found
검색해보니 DAO (데이터베이스 접근) 객체와 DB 데이터를 매핑해주는 Mapper.xml 파일에서 오류가 일어나는 것으로 판단해볼 수 있었고, 꽤나 흔하게 나타나는 오류인 듯 하였다. 관련된 정보를 많이 찾을 수 있었으나 해결하는데 꽤 오랜 시간이 걸렸다.
보통은 Mapper.xml 파일에서 DAO 경로와 연결짓는 'namespace'나 쿼리를 수행하는 'id'값이 알맞게 설정되어 있지 않은 경우 오류가 발생하는데, 나는 아무리 확인해봐도 이상이 없어 꽤나 애를 먹었다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.back.user.repository.LoginDao">
<!-- 로그인 -->
<select id="userLogin" parameterType="UserDto" resultType="int">
select count(*) as count
from user
where userId = #{userId}
and userPw = #{userPw}
</select>
</mapper>
원인 및 해결
원인은 전혀 예상치 못한 곳에서 찾을 수 있었는데, 패키지를 생성할 때 com.back / com.back.user / com.back.user.controller 이런 식으로 하위 패키지를 순차적으로 생성해야하는데 나는 'com.back.user.controller'를 한 번에 생성해서 이름만 같고 실제 경로는 달랐던 것이다. 패키지를 생성할 때 . 구분자를 한 번에 모두 작성해도 되는 줄 알았는데, 하나 하나 작업해야하는 것이었다..
결국 패키지를 com.back / com.back.user / com.back.user.controller 이런 식으로 순차적으로 하나씩 생성하고,
리소스 하위의 매퍼 파일도 동일하게 설정해주었다. 수정 후엔 브라우저의 요청을 오류 없이 정상적으로 받아올 수 있었다.
가장 기초적인 부분에서 일어난 오류라 허탈했지만 작은 부분부터 꼼꼼히 체크해야한다는 교훈을 배운 듯 싶다..
댓글