열심히 끝까지

[코딩 문제] - 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: expected 1, actual 0

비밀번호가 비슷한 탓에 잘 기억이 나지 않아 기억나는대로 로그인을 시도하니

위와 같은 에러가 발생했다.

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년) 방식이라 고민해보는 것도 좋을 거 같음