대부분의 서버쪽 비지니스 로직은 JDBC 코딩이라 해도 과언이 아니다.
DB 컬럼이 매우 많고 여러 테이블을 조인했을 경우 쿼리 자체도 매우 길어진다. 몇백줄이나 되는 쿼리를 본적도 있다.
테이블의 AMT 라는 컬럼이 number(12) 등으로 정의되었다면(오라클의 경우) 금액 관련해서 JDBC 코딩을 아래와 같이 했다고 가정해 보자.
JDBC 커넥션 맺고 Statement 및 ResultSet 객체 생성부분은 생략한다.
.
.
.
if (rset.next()) {
.
.
.
vo.setAmt(new Double(rset.getString("AMT")));
.
.
.
}
.
.
.
위와 같이 JDBC 코딩을 했을 경우 문법적으로는 전혀 문제가 없을 것이다. 하지만 AMT 라는 컬럼에 값이 없으면 rset.getString("AMT") 코드가 null 을 리턴하기 때문에 0 으로 초기화 해주기 위해서는 해당 쿼리를 NVL(AMT, 0) AMT 으로 수정해 주면 NullPointerException 이 발생하지는 않을 것이고 0 을 반환할 것이다.
NullPointerException 은 RuntimeException 이기 때문에 실행시 발생한다. 에러 스택을 보면 대충 에러가 발생하는 위치를 어렵지 않게 알 수도 있지만 경우에 따라서는 Exception 을 어떻게 처리해 주느냐에 따라서 에러나는 부분까지 추적해가지 않으면 발견하기 힘든 경우도 있다.
또한 쿼리가 매우 길고 일일히 NVL 메소드를 넣어주는 것도 추가적인 일이 될 것이므로 개발자에겐 성가신 작업이 될 것이다.
따라서 JDBC 코딩을, 어떻게 보면 위 처럼 코딩하는 것은 실수라고 할 수 있는데, rset.getString("AMT") => rset.getDouble("AMT") 처럼 사용한다면 쿼리에 NVL("AMT", 0) 와 같은 추가적인 일은 필요없을 것이다.
ResultSet 의 API 를 보면 getString(String columnName) 메소드는 컬럼에 값이 없을 경우에는 null 을 리턴하지만 getDouble(String columnName) 메소드의 경우에는 0 을 리턴한다. getDouble 뿐만이 아니라 getFloat(String columnName), getInt(String columnName), getLong(String columnName) 도 마찬가지이다.
사소하지만 이건 어디까지나 개발자의 코딩습관과 관련이 있기때문에 조금만 주의하면 프로젝트를 함에 있어 불필요한 작업에 얽매이지 않아도 될 것이다.
'DataBase > Sql' 카테고리의 다른 글
[Sql] Oracle - REGEXP(정규식) 사용법 (0) | 2011.07.28 |
---|---|
[Sql] Oracle - Self Training 오라클 정리 (0) | 2011.07.12 |
[Sql] Oracle - CASE WHEN THEN ELSE END (0) | 2011.02.23 |
[Sql] Oracle - REPLACE, TRANSLATE 함수 (1) | 2011.02.23 |
[Sql] Oracle - 주민번호로 현재 나이 구하기 (1) | 2011.02.23 |