에러 모음

IncorrectResultSetColumnCountException

junani0v0 2024. 4. 25. 22:20

< 에러 메시지 >

4월 25, 2024 9:58:39 오후 org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: 경로 [/04]의 컨텍스트 내의 서블릿 [pf]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 7]을(를) 발생시켰습니다.

org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 7

 

IncorrectResultSetColumnCountException 

 : 작업 중에 ReultSet(쿼리 결과 집합)의 열 수가 예상과 다른 경우 발생

  • 쿼리 실행 시 반환되는 열 수와 기대하는 열 수가 다름
  • ResultSet의 get메서드 사용시 열 수 오류

 

< 원인 >

프로그램은 1개를 예상하였지만 실제로는 7개의 열을 반환하여 에러 발생

public MemberAuthDto getMemberAuthDto(String uri) {
    String sql ="SELECT auth_seq, member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn "
            + "FROM forum.member_auth "
            + "WHERE auth_uri ='"+uri+"' AND auth_yn='N'";
    return queryForObject(sql, MemberAuthDto.class);
}

queryForObject는 기본형의 싱글컬럼에 사용

MemberAuthDto에서 나오는 컬럼이 1개인건 맞지만 위에 컬럼 7개중 어느컬럼인지 모르기에 에러 발생

어느 컬럼인지 알려주는 Mapper 필요

 

< 해결 >

public class MemberAuthRowMapper implements ResultSetExtractor<MemberAuthDto>{
	
	@Override
	public MemberAuthDto extractData(ResultSet rs) throws SQLException{
		MemberAuthDto memberAuthDto = null;	
		//실행하지 않으면 주소값이 없는 상태(선언만하면 객체인지 주소가 없는지 모름)
		//그렇기에 확실하게 객체를 생성 또는 주소값이 없다고 null값을 넣어준다
		
		while(rs.next()) {	//다음 로우가 있을때까지(다음로우가 없을때까지 돔)
			memberAuthDto = new MemberAuthDto();
			memberAuthDto.setAuthSeq(rs.getInt("auth_seq"));
			memberAuthDto.setMemberSeq(rs.getInt("member_seq"));
			memberAuthDto.setAuthNum(rs.getString("auth_num"));
			memberAuthDto.setAuthUri(rs.getString("auth_uri"));
			memberAuthDto.setRegDtm(rs.getString("reg_dtm"));
			memberAuthDto.setExpireDtm(rs.getString("expire_dtm"));
			memberAuthDto.setAuthYn(rs.getString("auth_yn"));
		}
		return memberAuthDto;
		//만약 이 코드에서 select된게 하나도 없으면 사용자는 null을 받는데 
		//이 코드는 null을 돌려주지 않는다
	}
}

MemberAuthRowMapper만들어주고

	public MemberAuthDto getMemberAuthDto(String uri) {
	    String sql ="SELECT auth_seq, member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn "
	            + "FROM forum.member_auth "
	            + "WHERE auth_uri ='"+uri+"' AND auth_yn='N' ";
	    return query(sql, new MemberAuthRowMapper());
	}

queryForObject 대신 query 사용