jdbcTemplate으로 로그인을 구현 도중 아래와 EmptyResultDataAsccessException 에러(Error)가 발생하였는데 이는 QueryForObject 일 경우 값이 없을 때 발생하는 에러이다.
에러발생
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
at org.springframework.dao.support.DataAccessUtils.nullableSingleResult(DataAccessUtils.java:97) ~[spring-tx-5.3.18.jar:5.3.18]
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:887) ~[spring-jdbc-5.3.18.jar:5.3.18]
at com.example.webstart.dao.MemberJdbcDAO.loginChk(MemberJdbcDAO.java:31) ~[classes/:na]
at com.example.webstart.dao.MemberJdbcDAO$$FastClassBySpringCGLIB$$ed8de352.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.18.jar:5.3.18]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.18.jar:5.3.18]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.18.jar:5.3.18]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.18.jar:5.3.18]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.18.jar:5.3.18]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.18.jar:5.3.18]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.18.jar:5.3.18]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-5.3.18.jar:5.3.18]
at com.example.webstart.dao.MemberJdbcDAO$$EnhancerBySpringCGLIB$$c8c5073e.loginChk(<generated>) ~[classes/:na]
이 문제를 해결하기 위해서는 Try ~ Catch로 QueryForObject를 예외처리 해야 한다.
As-Is 코드
public MemberVO loginChk(Map<String, String> paramMap) {
MemberVO member = jdbcTemplate.queryForObject(
"select member_id, email, name from member where email = ? AND password = ?",
(resultSet, rowNum) -> {
MemberVO newMember = new MemberVO();
newMember.setEmail(resultSet.getString("email"));
newMember.setMember_id(resultSet.getString("member_id"));
newMember.setName(resultSet.getString("name"));
return newMember;
}, paramMap.get("email"), paramMap.get("password"));
return member;
}
위 코드 내용에서 EmptyResultDataAccessException를 Try ~ Catch 문으로 만들어서 예외처리를 한다.
To-Be 코드
public MemberVO loginChk(Map<String, String> paramMap) {
try {
MemberVO member = jdbcTemplate.queryForObject(
"select member_id, email, name from member where email = ? AND password = ?",
(resultSet, rowNum) -> {
MemberVO newMember = new MemberVO();
newMember.setEmail(resultSet.getString("email"));
newMember.setMember_id(resultSet.getString("member_id"));
newMember.setName(resultSet.getString("name"));
return newMember;
}, paramMap.get("email"), paramMap.get("password"));
return member;
} catch (EmptyResultDataAccessException e) {
return null;
}
}
EmptyResultDataAccessException일 경우 그냥 null값을 리턴하게 처리하였다.
참고자료의 내용
References
[1] https://javabydeveloper.com/fix-emptyresultdataaccessexception-incorrect-result-size-expected-1-actual-0/
반응형
'Stackoverflow > Java' 카테고리의 다른 글
[Spring boot] JPA에서 대문자 테이블 인식 실패 문제 (0) | 2023.07.05 |
---|---|
[Springboot] java.lang.UnsupportedClassVersionError (0) | 2023.01.03 |
[Spring boot] com.mysql.jdbc.Connection.isValid(I)Z at (0) | 2022.04.28 |
org.springframework.web.multipart.support.MissingServletRequestPartException (0) | 2022.04.22 |
[Java] Unable to access jarfile (0) | 2022.04.19 |