[Error] Login 기능 구현 중 Parameter 송신 오류 및 결과값 타입 변환 오류
// DAO Interface
Boolean loginConfirm(String id, String pwd);
// Service Class
public boolean loginConfirm(String id, String pwd) {
return memberDao.loginConfirm(id, pwd);
}
// Mapper
<select id="loginConfirm" resultType="Boolean">
select
decode(count(*),1,'true','false') as loginResult from universe_mem
where id=#{id} and pwd=#{pwd}
</select>
해당 코드로 Junit Test를 돌렸는데 계속해서 해결되지 않는 오류가 발생😂
오류의 내용은 다음과 같았다.
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException:
Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
id 파라미터 값은 잘 불러오는 것을 확인하였고, 어떤 부분이 잘못되었는지 못 찾다가
DAO Interface에서 2개 이상의 객체는 구분하지 못한다는 것을 알게되었다.
그렇기 때문에 @Param 어노테이션으로 id값과 pwd값을 구분해주어야 올바르게 찾을 수 있었다.
그런데 해당 오류를 해결하고나니 다시 마주하게 된 또 다른 오류...😥
org.springframework.jdbc.UncategorizedSQLException:
Error attempting to get column 'LOGINRESULT' from result set. Cause:
java.sql.SQLException: 내부 표기로 변환할 수 없습니다
결론부터 이야기하자면 Boolean 타입이 아닌 String 타입으로 결과를 받아와서
Service, 또는 Controller에서 Boolean 타입으로 변환을 해주어야 해결되는 오류였다.
// DAO Interface
String loginConfirm(@Param("id") String id, @Param("pwd") String pwd);
// Service Class
public boolean loginConfirm(String id, String pwd) {
String loginConfirm = memberDAO.loginConfirm(id, pwd);
Boolean loginResult = Boolean.parseBoolean(loginConfirm);
return loginResult;
}
// Mapper
<select id="loginConfirm" resultType="String">
select
decode(count(*),1,'true','false') as loginResult from universe_mem
where id=#{id} and pwd=#{pwd}
</select>
2개 이상의 객체를 파라미터로 받는 경우 @Param 어노테이션으로 구분해주고,
Database에서의 SQL문 결과값을 String으로 받아 Boolean으로 타입을 변환해주면
오류없이 원하는 결과를 얻을 수 있는 것을 확인하였다☺
기본적으로 알고 있어야 할 부분에서 놓쳤던 내용으로 인해 오류가 발생했던 부분이라
다시 한 번 기억하기 위해서 기록하는 오늘의 오류 해결 과정이었습니다~~~!