apache commons DbUtils 활용하기 by 정상혁

  개발을 하다보면 간단한 화면 1~2개만 독립적으로 돌아가는 웹어플리케이션을 만들 때도 있습니다. 예를 들면 로그조회 프로그램 같은 것들이죠.

그런 곳에는 Hibernate나 iBatis를 쓰기에는 너무 거창하다는 느낌이 들기도 합니다. 그렇다고 JDBC로 날코딩하기는 성가실때, 이럴 때는 apache commons DbUtils를 써볼만 합니다.

 

JDBC에서 Connection, Statement,ResultSet의 close 글에 나온 것처럼 Connection을 닫는 번거로운 처리가 DbUtils.closeQuietly(con);로 끝나는 것만 해도 상당히 편합니다.

 

아래 예제는  DBUtils + JSTL로 간단한 조회화면을 만들어 본 것입니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "java.util.Properties" %>
<%@ page import = "org.apache.commons.dbutils.DbUtils" %>
<%@ page import = "org.apache.commons.dbutils.QueryRunner" %>
<%@ page import = " org.apache.commons.dbutils.handlers.MapListHandler" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%!
  private static final String SELECT_STMT =
                  "SELECT id, name, email, cell_phone_number FROM quiz_user";
%>
<%
 String url = "jdbc:hsqldb:hsql://localhost/sampledb";
 Properties prop = new Properties();
 prop.put("user","sa");  
 prop.put("password","");
 Connection con =  null; 
 try{
  Class.forName ("org.hsqldb.jdbcDriver");
  con = DriverManager.getConnection(url,prop);
        QueryRunner runner = new QueryRunner();
        Object resultList = runner.query(con,SELECT_STMT, new MapListHandler());
        request.setAttribute("list",resultList);          
   } catch (SQLException ex) {

      throw new RuntimeException(ex);
   } finally {
     DbUtils.closeQuietly(con);
   }
 %>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>사용자</title>
</head>
<body>
  <h1>사용자  조회</h1>
  <h2>사용자  목록</h2>
  <table class="list">
   <tr>
    <th>id</th><th>이름</th><th>전화번호</th> <th>이메일</th>    
 </tr>
    <c:forEach var="item" items="${list}" varStatus="status"> 
 <tr>
  <td>${item.id}</td>
  <td align="center">${item.name}</td>
  <td>${item.cell_phone_number}</td>  
  <td align="center">${item.email}</td>
 </tr>
 </c:forEach>
  </table>
</body>
</html>

 

  몇 년전에 DbUtils와 비슷한 클래스를 만든 적이 있었는데, 그때도 좀 찾아볼 걸 그랬나봅니다. 그러고 보면 저도 apache commons에 이미 있는 것을 많이도 만들어본 삽질의 시간들을 겪었었습니다.  신입 때 commons beanutils하고 commons io에 포함된 것 비슷한 유틸리티 만들어 놓고 혼자서 뿌듯해 했었죠 -_-;

 

참고자료

Commons-DbUtils

dbutils 활용방법

 


덧글

  • 토비 2008/07/15 20:52 # 삭제 답글

    저정도라면 SpringJdbc를 써도 될 듯 한데요. SimpleJdbcTemplate 정도면 충분히 단순하고 완벽한 DB 코드를 작성할 수 있고 Spring Container 따위는 안띄우고 그냥 사용할 수 있으니까요.
  • 정상혁 2008/07/15 22:07 #

    네, JdbcTemplet나 SimpleJdbcTemplate도 간단하게 쓸 수 있으면서도 DbUtils보다 더 다양한 메서드를 제공하고 있으니 더 좋을 것 같네요. KSUG 2회 세미나 때 토비님이 직접 JDBC API과 JdbcTemplet를 비교 코딩해 주시던 모습이 기억나는군요 ^^

  • 박성철 2008/08/09 10:10 # 답글

    SpringJdbc를 쓰기 전에는 DbUtils를 썼었습니다. SpringJdbc는 row 단위로 rowmapper를 호출하지만 dbutils는 반복해서 데이터를 얻는 작업을 handler에서 해줘야 하죠. 그래서 spring jdbc는 구조가 약간 더 복잡하고 dbutils는 단순한 대신 다양한 handler가 존재하고... 둘 다 좋은 툴 같습니다.
댓글 입력 영역