TinyDAO
  • Document History - 2005-11-30 draft - 2005-12-02 modified : InitServlet 설명 추가
  • Index top  
    1. Introduction
    2. Documentation
    Introduction top  
  • 개발 목적 - Justfun DAO는 DB 연동 어플리케이션 개발 시 일련의 SQL 작업을 간단히 처리할 수 있도록 해주는 라이브러리를 제공한다. - Justfun DAO를 사용함으로써 DB 연동 개발 시 복잡한 JDBC 코딩을 사용하지 않고 간단하게 SELECT/INSERT/UPDATE/DELETE 및 procedure/function 호출을 수행할 수 있다.
  • 주요 기능 - Justfun DAO는 DAO(Data Access Object) 패턴 구현체이다. (OR-Mapping은 지원하지 않는다.) - Justfun Commons Dbutil 라이브러리를 사용하여 내부적으로 Connection Pool을 지원한다. - 복잡한 JDBC 코딩을 사용하지 않고 간단하게 DB 연동 어플리케이션을 개발할 수 있다. - 별도의 쿼리 파일을 통해 쿼리를 효율적으로 관리할 수 있다. (Properties file/XML file) - 내부적으로 쿼리 수행은 Jakarta Commons DbUtil을 사용하며, 실행 결과는 Java Collection Interface인 List와 Map으로 리턴된다.
  • Documentation top  
  • User Guide
  • 1. 주요 Class
    - DAOManager : DAO 객체 및 Queries 객체를 생성하기 위한 Factory
    - DAO : DB 작업을 수행하기 위한 클래스
    - Queries : 설정 파일에 정의된 쿼리 파일의 쿼리들을 담는 클래스
    - Task : DAO에서 처리할 작업을 나타내는 클래스
    - DAOWorker : DAO 객체를 사용한 일련의 프로세스(업무 흐름)을 보장하여 작업을 수행하기 위한 클래스
    
    2. Justfun DAO 설정하기
    1) Justfun DAO 설정 파일
    - Justfun DAO의 설정 파일은 dao-config.properties 이며, DAOManager가 ClassLoader를 사용해 로딩한다.
    - 즉, Application의 클래스 패스의 루트 디렉토리에 dao-config.properties가 존재해야 한다. 
      (일반적으로 Web Application인 경우 /WEB-INF/classes, 일반 Application인 경우 Application이 실행되는 현재 디렉토리)
    
    
    #### dao-config.properties 파일 ####
    
    ###############################
    ### Pool Class
    ###
    ### @ pool.class : Pool 구현 객체를 지정한다.
    ### 	- DbcpConnectionPool : jakarta dbcp를 사용하는 ConnectionPool
    ### 	- DSConnectionPool : DataSource를 사용하는 ConnectionPool
    ### 	- FakeConnectionPool : Pool을 사용 안하고, 매번 Connection을 생성
    ###
    
    pool.class = justfun.common.pool.impl.DbcpConnectionPool
    # pool.class = justfun.common.pool.impl.DSConnectionPool
    # pool.class = justfun.common.pool.impl.FakeConnectionPool
    
    
    
    ###############################
    ### Pool Name
    ###
    ### @ pool.name : pool 이름을 설정. DSConnectionPool을 사용시 DataSource Resource의 JNDI Name을 설정한다.
    ###
    
    pool.name = jdbc/oracle
    
    
    
    ###############################
    ### Pool General Config
    ###
    ### Pool의 일반 설정 정보. (DB 연결 정보 및 Pool 동작 정보)
    ### 이 정보는 pool.class가 DSConnectionPool로 설정되었을 경우 무시된다.
    ###
    ### @ pool.connection.init : 풀의 초기 커넥션 수
    ### @ pool.connection.min : 풀의 최소 커넥션 수
    ### @ pool.connection.max : 풀의 최대 커넥션 수
    ### @ pool.connection.timeout : 커넥션 사용 타임아웃
    ### @ pool.request.timeout : 커넥션 요청 타임아웃
    ### @ jdbc.driver : jdbc 드라이버
    ### @ jdbc.url : DB 연결 정보
    ### @ jdbc.user : 연결 계정
    ### @ jdbc.password : 연결 비밀번호
    ###
    
    pool.connection.init = 5
    pool.connection.min = 5
    pool.connection.max = 10
    pool.connection.timeout = 300
    pool.request.timeout = 100
    
    jdbc.driver = [JDBC driver]
    jdbc.url = [DB Connection url]
    jdbc.user = [user id]
    jdbc.password = [password]
    
    
    
    ###############################
    ### Query File Path
    ###
    ### 쿼리 파일 경로. QueryLoader로 로딩할 쿼리 파일 경로 
    ### 쿼리 파일 경로는 ClassLoader에 의해 로딩되는 리소스 경로이며, 실행되는 Application의 클래스 패스를 기준으로 설정해야 한다. 
    ### (File System Path가 아님. DbUtils 참조).
    ### ex) justfun.common.query 패키지의 Query.properties 파일인 경우 /justfun/common/query/Query.properties 이다.
    ### 
    ### 여러 파일을 사용할 경우 Comma(,) 로 구분하여 설정할 수 있다.
    
    queryfile.path = /sql01.properties, /sql02.properties
    queryfile.path.xml = /sql-example.xml
    
    
    2) 쿼리 파일
    - Justfun DAO의 쿼리 파일은 Properties 파일과 XML 파일을 사용할 수 있다.
    - 별도의 쿼리 파일에 쿼리를 정의함으로써 쿼리를 보다 효율적으로 관리할 수 있다.
    
     properties 파일 
    
    # 일반적인 properties 파일의 사용법과 동일하게 [id] = [value] 형식으로 작성한다.
    # properties의 [id]는 쿼리 아이디로, [value]는 SQL 문으로 정의한다.
    
    queryid = select COL from TABLE
    
    
     XML 파일 - XML 쿼리 파일은 다음과 같이 정의한다. 
    
    
    <?xml version="1.0" encoding="UTF-8"?>
    
    <dao>
    	<sql id="queryid">
    		select COL from TABLE
    	</sql>
    </dao>
    
    
    
    3. Justfun DAO 사용하기
    1) Justfun DAO의 기본적인 사용 예제
    
    /*
     * 1. DAO 객체를 생성하기 위해 DAOManager 객체를 얻는다. 
     */
    DAOManager mgr = DAOManager.getInstance();
    DAO dao;
    
    try{
    	/*
    	 * 2. DAOManager를 초기화한다. 
    	 *    DAOManager를 초기화하면 설정 파일의 설정 정보를 읽어 Connection Pool을 생성하고, Query 파일을 로딩한다.
    	 */
    	mgr.initialize();
    	/*
    	 * 3. DAOManager로부터 DAO 객체를 얻는다.
    	 *    DAO는 객체 생성시 DAOManager에서 관리되는 Connection Pool로부터 Connection을 할당받는다.
    	 */
    	dao = mgr.getDAO();
    	
    	/*
    	 * 4. 쿼리 수행 작업
    	 */
    	List list = dao.select("select COL from TABLE", null);
    }
    catch(Exception ex){
    	// Exception handling code here
    }
    finally{
    	/*
    	 * 5. DAO 리소스를 해제한다.
    	 *    DAO 리소스 해제시 DAO는 사용중이던 Connection을 Connection Pool로 반환한다.
    	 */
    	if( dao != null ) 
    		try{ dao.destroy(); }catch(Exception ex){}
    	
    	/*
    	 * 6. DAOManager 리소스를 해제한다. DAOManager 리소스 해제시 pool이 close 된다.
    	 */
    	mgr.destroy();
    }
    
    
    2) SELECT 쿼리 사용 예제
    
    ...
    /*
     * DAO 객체의 select() 메소드를 호출하여 SELECT 쿼리 작업을 수행할 수 있다.
     */
    List list = dao.select("select COL from TABLE", null);
    
    /*
     * 쿼리에 바인딩 할 파라미터가 존재하는 경우 select() 메소드에 Object[] 로 넘겨주면 된다.
     */
    List list = dao.select("select COL from TABLE where COL1 = ? and COL2 = ?", new Object[]{ "param1", "param2" });
    ...
    
    
    3) INSERT/UPDATE/DELETE 쿼리 사용 예제
    
    ...
    /*
     * DAO 객체의 update() 메소드를 호출하여 SELECT 쿼리 작업을 수행할 수 있다.
     */
    int updateRows = dao.update("update TABLE set COL = ?", new Object[]{ "param" });
    ...
    
    
    4) PROCEDURE 호출 사용 예제
    
    ...
    /*
     * DAO 객체의 procedure() 메소드를 호출하여 SELECT 쿼리 작업을 수행할 수 있다.
     */
    dao.procedure("{call USER_PROCEDURE_NAME(?)}", new Object[]{ "param" });
    ...
    
    
    5) FUNCTION 호출 사용 예제
    
    ...
    /*
     * DAO 객체의 function() 메소드를 호출하여 SELECT 쿼리 작업을 수행할 수 있다.
     */
    String result = dao.function("{ ? = call USER_FUNCTION_NAME(?) }", new Object[]{ "param" });
    ...
    
    
    5) 쿼리 파일에 정의된 쿼리 사용하기
    
    ...
    /*
     * DAOManager의 getQueries() 메소드를 호출하여 Queries 객체를 얻는다.
     */
    DAOManager mgr = DAOManager.getInstance();
    Queries query = mgr.getQueries();
    
    /*
     * Queries 객체로부터 쿼리 파일에 정의된 쿼리 아이디로 쿼리를 얻을 수 있다.
     */
    String sql = query.getQuery("query.id");
    ...
    
    
    4. Web Application에서 Justfun DAO 사용하기
    1) justfun.dao.webapp.InitServlet을 사용한 DAOManager 초기화 및 해제
    - DAOManager는 초기화 시에 pool을 생성하며, destroy시에 pool을 해제한다. 
      이는 곧 Application의 생명 주기 중 Appilcation의 초기화 과정에서 DAOManager가 초기화 되고, 
      Application의 소멸 과정에서 DAOManager를 destroy 되어야 함을 의미한다.
      일반 클라이언트 Application 개발 시에는 Window Event를 이용하여 명확하게 DAOManager의 생성 및 소멸 시점을 알 수 있으며,
      Web Application의 경우엔 Servlet의 init() 메소드와 destroy() 메소드를 이용하여 생성 및 소멸 시점을 알 수 있다.
    
      Justfun DAO에는 Web Application 환경에서 위와 같은 DAOManager의 생성 및 소멸을 자동화 해주는 Servlet을 제공한다.
    
    
    /** DAOManager의 생성 및 소멸을 자동화 해준는 InitServlet 구현 코드 */ 
    
    package justfun.dao.webapp;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    
    import justfun.dao.DAOManager;
    
    public final class InitServlet extends HttpServlet {
    
    	private void debug(String s) {
    		System.out.println(s);
    	}
    
    	/**
    	 * Init Servlet
    	 */
    	public void init(ServletConfig config) throws ServletException {
    		super.init(config);
    
    		try {
    			DAOManager daoManager = DAOManager.getInstance();
    			daoManager.initialize();
    
    			debug("Initialize Complete DB Pool [ DBInitServlet.init() ] : " + daoManager);
    		}
    		catch (Exception ex) {
    			debug(ex.toString());
    		}
    	}
    
    	/**
    	 * Destroy Servlet
    	 */
    	public void destroy() {
    		try {
    			/* Destroy DB Connection Pool */
    			DAOManager daoManager = DAOManager.getInstance();
    			daoManager.destroy();
    
    			debug("Destroy Complete DB Pool [ DBInitServlet.destroy() ]");
    		}
    		catch (Exception ex) {
    			debug(ex.toString());
    		}
    		finally {
    			super.destroy();
    		}
    	}
    
    }
    
    
    - InitServlet을 사용하려면, web.xml에 다음의 내용을 추가하면 된다.
    
    
    /** web.xml 추가 내용 */ 
    
    <!-- Justfun DAO Servlet -->
    <servlet>
    	<servlet-name>Justfun DAO Servlet</servlet-name>
    	<servlet-class>justfun.dao.webapp.InitServlet</servlet-class>
    	<load-on-startup>1</load-on-startup>
    </servlet>