[Spring] 다시 보는 초난감 DAO

Zoe·2022년 1월 18일
0

Spring

목록 보기
5/9
post-thumbnail

다시 보는 초난감 DAO


✅ 예외처리 기능을 갖춘 DAO

1️⃣ JDBC 수정 기능의 예외처리 코드

//JDBC API를 이용한 DAO 코드인 deleteAll()
public void deleteAll() throws SQLException {
	Connection c = dataSource.getConnection();
    
    	PreparedStatement ps = c.prepareStatement("delete from users");
    	ps.executeUpdate();
        //위에서 예외 발생하면 바로 메소드 실행이 중단됨
        
        ps.close();
        c.close();
}
  • ConnectionPreparedStatement라는 두 개의 공유 리소스를 가져와서 사용
  • 정상적으로 처리되면 메소드를 마치기 전에 각각 close()를 호출해 리소스를 반환
  • 그런데 PreparedStatement를 처리하는 와중에 예외가 발생하면 메소드 실행을 끝마치지 못하고 바로 메소드를 빠져나가게 됨
  • 리소스가 제대로 반환되지 않음
  • 커넥션 풀에 여유가 없어지고 리소스가 모자르게 됨
//예외 발생 시에도 리소스를 반환하도록 수정한 deleteAll()
public void deleteAll() throws SQLException {
	Connection c = null;
    	PreparedStatement ps = null;
        
        try {
        	c = dataSource.getConnection();
            	ps = c.prepareStatement("delete from users");
                ps.executeUpdate();
        } catch (SQLException e) {
        	throw e;
        } finally {
        	if (ps != null) {
            		try  {
                    		ps.close();
                        } catch (SQLException e) {
                        }
                }
                if (c != null) {
                	try {
                    		c.close();
                        } catch (SQLException e) {
                        }
                }
        }
}
  • try/catch/finally : finally이므로 try블록에서 예외가 발생했을 때나 안 했을 때나 리소스를 반환하도록 함

2️⃣ JDBC 조회 기능의 예외처리

//JDBC 예외처리를 적용한 getCount() 메소드

public int getCount() throws SQLException {
	Connection c = null;
    	PreparedStatement ps = null;
        ResultSet rs = null;
        
        try {
        	c = dataSource.getConnection();
            	
                ps = c.prepareStatement("select count(*) from users");
                
                rs = ps.executeQuery();
                rs.next();
                return rs.getInt(1)
        } catch (SQLException e) {
        	throw e;
        } finally {
        	if (rs != null) {
            		try {
                    		rs.close();
                        } catch (SQLException e) {
                        }
                }
                if (ps != null) {
                	try {
                    		ps.close();
                        } catch (SQLException e) {
                        }
                }
                if (c != null) {
                	try {
                    		c.close();
                        } catch (SQLException e) {
                        }
                }
	}
}
  • getCount() : 등록된 User의 수를 가져옴
  • ResultSet이 추가됨
  • 만들어진 ResultSet을 닫아주는 기능을 추가함
profile
iOS 개발자😺

0개의 댓글