열심히 끝까지
[코딩 문제] - 9/27 발견한 jdbcTemplate.queryForObject() 관련 문제 : Incorrect result size: expected 1, actual 0 본문
디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)
[코딩 문제] - 9/27 발견한 jdbcTemplate.queryForObject() 관련 문제 : Incorrect result size: expected 1, actual 0
노유림 2022. 9. 28. 10:47// 로그인
public MemberVO selectOneMember(MemberVO vo) {
Object[] args= {vo.getMid(),vo.getMpw()};
System.out.println("MemberDAO2 작동★");
System.out.println("로그인 시작");
return jdbcTemplate.queryForObject(sql_selectOne, args,new MemberRowMapper());
}
MemberDAO2는 jdbcTemplate을 이용해서 작성한 코드로
일반적으로 작성한 MemberDAO에 비해 훨씬 더 간편하게 작성이 가능하도록 되어있다.
하지만 로그인을 위해 사용한 위의 코드를 진행 중, 생각치도 못한 에러를 마주했다.
비밀번호가 비슷한 탓에 잘 기억이 나지 않아 기억나는대로 로그인을 시도하니
위와 같은 에러가 발생했다.
Incorrect result size
> 결과값이 1개가 아닐 때 나타나는 jdbcTemplate 쪽의 에러로 보인다.
값이 0개거나 1개 초과로 값이 나오게 되면 이 에러가 나타난다고 한다.
결국, 그 값을 잡아주기 위해서 try/catch 구문을 써서 잡았다.
[변경된 코드]
// 로그인
public MemberVO selectOneMember(MemberVO vo) {
Object[] args= {vo.getMid(),vo.getMpw()};
System.out.println("MemberDAO2 작동★");
System.out.println("로그인 시작");
try {
return jdbcTemplate.queryForObject(sql_selectOne, args,new MemberRowMapper());
} catch (IncorrectResultSizeDataAccessException e) {
return null;
}
// queryForObject() 메서드는 무조건 1개의 output을 필요로합니다!
// 0,N개의 output이 발생하면 에러!!!
// 해결방안 1) try-catch
// 해결방안 2) query() 메서드를 대신 활용
}
다음과 같이 try/catch를 써주면 잡힌다.
이외에 query()로 바꾸어서 하는 방법도 있지만
위의 return값을 DataAccessUtils.requiredSingleResult()로 돌려서 값을 주는 방법도 있다고 한다.
[찾은 방법]
1. try/catch 작성 [성공]
- 예외처리하는데 비용이 듦
- 예외처리 코드블럭을 최적화 하지 않음
2. query() 메서드를 대신 활용
3. return값을 DataAccessUtil.requiredSingleResult()로 돌려주기
- 생각보다 옛날(2012년) 방식이라 고민해보는 것도 좋을 거 같음
'디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)' 카테고리의 다른 글
[예외발생노트] - 예외 발생 시 매번 생성 (1) | 2022.09.29 |
---|---|
[코딩 과제] - 9/27 강사님 문제 - 사진 업로드 + 미리보기(추가사항) (0) | 2022.09.28 |
[코딩 과제] - 9/26 강사님 문제 : 검색 기능 + DAO2 적용 (0) | 2022.09.27 |
[코딩 과제] - 9/14 강사님 문제 (0) | 2022.09.14 |
[코딩 과제] - 9/13 강사님 문제 (1) | 2022.09.14 |