강의에서 로그인 기능 구현 강의 중
뜬금 없이 이런 에러를 만나게 되었다.
이전에도 가끔 보았던 에러인데 이 에러는 고맙게도 직관성이 좋아서 에러 뒤에 설명이 잘 적혀있다.
바로 SQL 구문 마무리가 잘못되었다는 에러인데 주로 mybatis.mapper.*.xml에서 깜빡하고 ;을 붙일 때 자주 일어나는 에러이기에 바로 확인을 해보았지만 전혀 이상한 점이 없었다.
<select id="selectUserByMap" parameterType="map" resultType="UserDTO">
SELECT USER_NO, ID, PW, NAME, GENDER, EMAIL, MOBILE, BIRTHYEAR, BIRTHDAY
FROM USERS
<where>
<if test="id != null"> ID = #{id}</if>
<if test="pw != null"> PW = #{pw}</if>
<if test="email != null"> EMAIL = #{email}</if>
</where>
</select>
(스크롤이 생기는게 싫어서 select 부분의 칼럼 다수를 임의로 삭제했다.)
다시 천천히 console 창에 뜬 log를 보니
where 부분에 ID = ? AND PW = ? 이어야 하는데 ID =? PW = ?으로 읽히게 되어 에러가 일어난 것이였다..
알고보니
<select id="selectUserByMap" parameterType="map" resultType="UserDTO">
SELECT USER_NO, ID, PW, NAME, GENDER, EMAIL, MOBILE, BIRTHYEAR, BIRTHDAY
FROM USERS
<where>
<if test="id != null"> ID = #{id}</if>
<if test="email != null"> EMAIL = #{email}</if>
<if test="id != null and pw != null"> ID = #{id} AND PW = #{pw}</if>
</where>
</select>
로 본래 썼다가 강사님이 쓴 게 성능상 더 좋아 보이는군 싶어서 바꾸다가 AND를 빼먹은..
바꾼 뒤로는 아주 잘 된다.