[JDBC]EmptyResultDataAccessException

HW·2024년 4월 27일
0

JDBC

목록 보기
1/1

2024.05.20 추가내용
그저 예외처리를 줄이는게 최고인줄 알았어요...
성능테스트를 하기 전까진...

수정 전 코드

String sql = "SELECT id,name,login,player FROM member WHERE name = ?";

        return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> {

            String a = rs.getString("name");
            return new Member(rs.getLong("id"),
                    rs.getString("name"),
                    rs.getBoolean("login"),
                    rs.getBoolean("player"));}, name);

수정 후 코드

String sql = "SELECT id,name,login,player FROM member WHERE name = ?";
        try {
        return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> new Member(rs.getLong("id"),
                            rs.getString("name"),
                            rs.getBoolean("login"),
                            rs.getBoolean("player"))
                            , name);
        }
        catch (EmptyResultDataAccessException e) {
            return null;
        }
  • 예외처리 추가

그런데 예상치 못한 실패에 대해서만 예외를 사용해야 될텐데
이건 예상할 수 있는 실패다.

예외가 발생하면, Exception 객체가 생성되는데
이로 인해 오버헤드가 발생할 수 있다.

굳이 Exception을 던지지 않아도
처리할 수 있는 로직이다.

예외처리를 하지 않고
사용자 존재 여부 확인 로직이 진행되도록 바꿔보자.

개선 코드

String sql = "SELECT id,name,login,player FROM member WHERE name = ? LIMIT 1";

        List <Member> retMember = jdbcTemplate.query(sql, (rs, rowNum) -> new Member(rs.getLong("id"),
                            rs.getString("name"),
                            rs.getBoolean("login"),
                            rs.getBoolean("player"))
                            , name);
        if (retMember.isEmpty()){
            return null;        
        }
        else {
            retMember.get(0);
        }
  • 쿼리에 LIMIT 1 추가.
  • queryForObject에서 query로 변경.
  • List 객체의 사이즈에 따라 존재 유무 판별.

결론

Exception 사용은 최대한 줄여보자.
Exception이 유용한 사례는 값을 리턴할 수 없는 생성자이다.

profile
예술융합형 개발자🎥

0개의 댓글