레이블이 스트럿츠 로그온인 게시물을 표시합니다. 모든 게시물 표시
레이블이 스트럿츠 로그온인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 27일 일요일

[자바배열정열]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)

[자바배열정열]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)
 
예제를 보시면 이해가 되리라 생각 합니다.
참고하시구요, 열공 하세요.
 
//
//  @Java Tip
//  @author 오라클자바커뮤니티, 오엔제이프로그래밍
//  @Desc : java.util.Arrays 클래스의 sort메소드를 이용한 정렬
// 
package onj;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

public class ArraySortExam {
 public static void main(String[] args) {
  String[] myArray = { "c", "a", "b" };
  // 일단 그냥 출력 해보자. c, a, b 순으로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // Ascending Sort, 오름차순 정렬
  Arrays.sort(myArray);
  // a, b, c로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // 이번에는 내림차순(Descending) 졍렬
  Arrays.sort(myArray, Collections.reverseOrder());
  // c, b, a로 출력
  for (String s : myArray) {
   System.out.println(s);
  } 
 }
}

2013년 10월 19일 토요일

[Spring Container에서 자바빈 로딩하는 방법2가지]Spring Framework Lazy Loading, Pre Loading, BeanFactory, ApplicationContext

[Spring Container에서 자바빈 로딩하는 방법2가지]Spring Framework Lazy Loading, Pre Loading, BeanFactory, ApplicationContext
 
스프링 프레임워크에서 자바빈을 로딩(인스턴스로 만든 후 바인딩)하는 데 있어 두가지 방법을 제공한다.

두 방법은 lazy biding, pre-loading 이다.
 
1. Lazy Binding
 
자바빈이 다른 메소드 또는 클래스의 요청에 의해 호출되는 시점에 로드되는 방법이다.

org.springframework.beans.factory.BeanFactory와 하위클래스들이 사용하는 방법으로 스프링 컨테이너에서는 관련빈을 호출되는 시점에 로딩한다.
 
아래 예를 보자.
 
BeanFactory factory = new XmlBeanFactory(
                        new InputStreamResource(
                        new FileInputStream("onj.xml")));    
             
OrderManager orderManager = (OrderManager) factory.getBean("orderManager"); 

우선 위 예문의 경우 onj.xml이 메모리에 로딩되더라도 orderManager 빈은 인스턴스화 되지 않는다.  즉 getBaean("orderManager")하는 순간 메모리로 올라오는 것이다.

결국 getBean 메소드가 호출되는 시점에 할 일이 많아 지는 것이다.

2. Pre-Loading
 
컨테이너에서 XML 파일을 로딩하자 마자 정의된 자바빈들을 로딩하는 방법.

org.springframework.context.ApplicationContext가 수행한다.
 
//모든 싱글톤 자바빈들이 메모리로 로딩
ApplicationContext context =
            new ClassPathXmlApplicationContext("onj.xml");
           
//필요한 빈을 리턴           
OrderManager orderManager = (OrderManager) context.getBean("orderManager");

2013년 10월 15일 화요일

테이블이 몇개의 블록을 사용중인지 확인하는 방법 각각의 테이블의 행(로우, ROW)은 의사 컬럼인 rowid를 가지고 있습니다.

테이블이 몇개의 블록을 사용중인지 확인하는 방법

각각의 테이블의 행(로우, ROW)은 의사 컬럼인 rowid를 가지고 있습니다 rowid에는 그 Rows의 물리적인 위치정보를 포함하고 있는데 파일번호블록번호블록내 행 번호와 같은 정보를 포함하고 있습니다.

하나의 데이터파일을 가지는 테이블스페이스에 테이블 데이터가 저장 되면 이 테이블의
ROWID는 유일한 블록번호(즉 하나의 테이블의 행들이 같은 블록 번호를 중복해서 가지지않는다는 의미)를 가지는 반면에 둘 이상의 데이터파일로 구성되는 테이블스페이스인 경우에 테이블에 데이터가 저장 되면 동일한 블록번호(서로 다른 파일에 각각의 블록 번호가 부여 되므로)를 가질 수 있습니다이러한 경우엔 블록번호와 파일번호 두 개의 항목을 조합하여 ROWID로부터 유일한 번호를 얻어 낼 수 있습니다.
 
즉 테이블이 몇 개의 블록으로 구성 되어 있는지는 이러한 점을 이용하여 구하면 되는데DBMS_ROWID라는 패키지를 이용하여 rowid에서 특정 값(파일번호블록번호등)을 얻어 낼 수 있습니다.
 
Rowid를 조회 하면 다음과 같습니다.
 
SQL> select rowid, jumin, name from addrbook;
rowed                            JUMIN      NAME
------------------ -------------- ------------
AAAJMZAABAAAPEKAAA 111111-2222222    
:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />홍길동

AAAJMZAABAAAPEKAAB 333333-4444444    
가길동
AAAJMZAABAAAPEKAAC 111111-2222222    
홍길동
 
다음과 같이 유일한 블록의 개수(테이블이 몇 개의 블록으로 구성되어 있는지)를 카운팅 할 수 있습니다.
 
SQL> SELECT COUNT ( DISTINCT
  2           DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)
  3           ||
  4           DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)
  5         ) "Used"
  6  FROM scott.emp;
 
      Used
----------
         2
 
 
또는 다음과 같은 방법도 가능 합니다.
 
SQL> SELECT COUNT (DISTINCT SUBSTR(rowid,1,15)) "Used"
  2  FROM scott.emp;
 
      Used
----------
         2

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  


2013년 8월 10일 토요일

[오라클자바,오라클자바커뮤니티]Oracle Types of Data Integrity

Oracle Types of Data Integrity

A. Nulls
- 기본적으로 Column은 Null을 허용한다. 
Column에 대해서 null을 포함하는 row들의 insert나 또는 update를 허용하는 또는 허용하지 않는  하나의 column에 대해서 정 의되는 규칙.

B. Unique Column Values
-Column(또는 column들의 집합)에 대해서 unique value를 포함하는 row들의 insert나 또는  update만을 허용하는 column들(또는 column들의 집합)에 대해서 정
의되는 규칙, 즉 지정된 열또는 열들에서중복된 값을 허용안함

- Unique 제약조건을 구성하는 열중 일부분이 Null을 허용한다면 Null을 허용하지 않는 열은  동일한 값을 가질수 없다.

C. Primary Key Values
-Table에 있는 각 row는 column(또는 column들의 집합)에 있는 value들에 의해서 유일하게 식별될 수 있도록 하는 하나의 column(또는 column들의 집합)에 정의된
규칙.

- Primary Key Column은 Null을 허용하지 않는다.

- 만약 dept Table의 dept_no Column이 Primary Key라면 해당열에 대한 고유 인덱스를 암시적으로  생성하며 해당열에대해 not null제약조건을 암시적으로 생성한다.

- Primary Key Column은 16개 까지로 제한됨

D. Referential Integrity(참조 무결성)과 Foreign Key 무결성 제약조건
- 만약 Column 또는 column들의 집합에 대한 값(the dependent value)이 관련된 table의 column에 있는 값(the referenced value)과 match 된다면 하나의 row에
대한 insert 또는 update만을 허용하는 하나의 table에 존재하는 column(또는 column들의 집합)에 대해서 정의된 규칙.

-Referential integrity는 또한 어떤 data 조작의 유형이 참조되는 값들에 허용되는 지와 이러한 action들이 종속된 값들에 어떠한 영향을 주는 지를 지시하는 규칙들을 포함한다. 

Restrict
 참조되는 data의 update 또는 deletion을 허용하지 않는 referential
integrity.

Set to Null
 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 NUll이 설정된다.

Set to Default
 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 default value가 설정된다.

Cascade
 참조되는 data가 update될 때, 관련되는 모든 종속된 data도 update된다; 참조되는 row가 delete될 때, 관련되는 모든 종속된 row들도 delete된다.

F. Check Constrints
- 각 열또는 열집합에 대한 Check Constraints는 지정된 조건이 참인지 거짓인지 알수있게 한다.

- 사용자가 확인 조건을 지정함으로서 특수하거나 복잡한 무결성 조건을 시행한다.

- 문자열 리터럴이나 인수(투캐랙터, 투넘버, 투데이트)로 NLS 매개변수를 가지는 SQL을 포함한는  제약조건을 평가하기 위해 Oracle은 기본적으로 DataBase의 NLS설정값을 사용한다.

2013년 8월 8일 목요일

[오라클자바커뮤니티, JAVAORACLE교육]자바 JVM의 메모리 구죠, 자바교육

JAVA JVM의 메모리 구조


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




JVM 의 실행 메모리 영역

메쏘드(method) 영역 : 클래스의 메소드에 대한 바이트코드, 전역변수(클래스 변수)
힙(heap) 영역 : 객체를 저장할때 사용하는 메모리
스택(stack) 영역 : 지역변수,함수의 인자,함수의 리턴값,리턴 번지
레지스터(registers) : 가상 머신의 현재 상태를 보여줌, 현재 실행되고 있는 메소드의 실행 포인터를 저장
실행 풀(Runtime Constant Pool) : 숫자 리터럴과 상수 필드 포함, 메소드 영역으로 부터 할당 받는다.


JVM 의 실행 메모리 영역 ]


메소드 내에서 객체 참조형으로 선언된 변수인 경우(String s = new String("abc") 일때의 s) 지역변수로서 스택에 위치하며 힙에 저장되어 있는 객체에 대한 참조값을 가지게 됩니다.
객체 참조형 변수의 값이 null 이라는 의미는 아무것도 참조하고 있지 않다는 의미 입니다.
New 연산자는 힙(heap) 메모리에 객체를 만들고 그 객체의 참조값을 반환 합니다.(Hello h = new Hello()) ---> Memory Heap에 Hello 클래스의 인스턴스(객체)를 만들고 그것을 스택에 있는 h라는 변수가 참조하도록 합니다. C에서의 포인터 변수와 유사 합니다.)
객체 참조 변수의 경우 대입, 메소드 호출시의 인자, 반환형 등으로 사용 될 때 참조 값만 전달 될 뿐, 객체 자체가 복제되어 전달되는 것은 아닙니다.
아래의 예제를 참고하세요

class C
{
public static void
main(String[] args)
{
int i = 3;
f(i);
}
static void f(int arg)
{
int i = 10;
double f = 3.14
}
}


이상 JVN의 메모리 영역에 대해 살펴 보았습니다.







[ORACLEJAVA STRUTS, oraclejavanew.kr]예외처리 및 스트럿츠 커스텀 태그 예제

예외처리 및 스트럿츠 커스텀 태그 예제 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



아래 예제는 모든 예외의 루트인 BaseException두어 예외에 대해 프로그램 내부에서 처리하는 예제 입니다.

JDBC오류에 대해서는 로깅을 이용하여 실제 오류를 확인하며 사용자에게는 아래와 같이 변환 된 오류정보를 반환 합니다.

 

우선 실행 흐름을 살펴보면 emp.jsp를 실행하면 부서코드를 입력 할 수 있는 창이 나타나는데 여기에서 EMP테이블의 DEPTNO에 해당하는 부서코드(예를 들면 10)를 입력한 후 “EMP LIST”를 클릭하게 되면 EMP TABLE에서 원하는 부서에 해당 하는 사원의 ename, job이 출력되는 예제 입니다.

 


 


유심히 볼 부분은 예외를 처리하는 방법과 emplist.jsp에서 EMP 테이블의 데이터를 출력 할 때 <logic:iterate>를 사용하여 반복적으로 자바 빈의 내용을 출력 하는 부분 입니다.

데이터베이스 커넥션 풀은 bitmechanic의 JDBC POOL을 사용 했으며 이 부분에 대한 자세한 사항은 오라클자바의 스트럿츠 강좌 “DB를 사용하여 로그인 하기” 강좌를 참고 하시기 바랍니다.

===============================================================

------------------
1. emp.jsp
------------------

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<html>
<body>
<html:errors/>
<html:form action="/EmpSubmit">     
  <bean:message key="user.depttitle"/>:<html:text property="deptno" value=""/>
  <html:submit value="EMP LIST">       
  </html:submit>                 
</html:form>
</body>
</html>


------------------
2. emplist.jsp
------------------

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<html>
        <head>
                <title>Emp User List</title>
        </head>
<body>
<h1>Emp User List</h1>
<!-- ================================================ -->
<logic:present name="users">
        <table border="1">
                <tr>
                        <th>
                                <bean:message key="user.ename"/>
                        </th>
                        <th>
                                <bean:message key="user.job" />
                        </th>
                </tr>
               
                <!---------------------------------------------->
                <logic:iterate id="user" name="users">
                <tr>
                        <td>
                                <bean:write name="user" property="ename"/>
                        </td>
                        <td>
                                <bean:write name="user" property="job"/>
                        </td>
                </tr>
                </logic:iterate>
                <!---------------------------------------------->
</table>
</logic:present>
<!-- =================================================== -->
</body>
</html>


------------------
3. EmpForm.java
------------------

package logic;

import org.apache.struts.action.ActionForm;
public class EmpForm extends ActionForm {
        private String deptno=null;
                             
        public String getDeptno() {
                return deptno;
        }
               
        public void setDeptno(String deptno) {
                this.deptno = deptno;
        }                     
}

------------------------------
4. DisplayAllUserAction.java
------------------------------

본 예제의 경우 Action을 하나만 간단 하게 관리 하지만 실제 액션이 많이지는 경우 메인 액션을 하나 두고 나머지 액션들이 메인 액션을 상속 받게 하는 구조로 구성 할 수 있습니다. 그러한 경우 아래에서의 예외 처리 부분은 execute 메소드에 두고 execute의 마지막 부분에서 각 하위 액션들이 구현 할 메소드를 호출 하는 형태로 구성을 합니다. 이에 관한 사항은 스트럿츠 강좌 “Struts에서의 예외처리(2)”를 참고 하시기 바랍니다.

package logic;

import org.apache.struts.action.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import logic.BaseException;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;

import java.util.List;
import java.util.Iterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author 이종철
*/
public class DisplayAllUserAction extends Action {
        ActionForward forwardPage = null;
       
    public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
           
            Log log = LogFactory.getLog(DisplayAllUserAction.class);
           
            try {
                       
                GetUserDAO user = new GetUserDAO();
                     
                List list = user.getUserList(((EmpForm)form).getDeptno());
   
                    if (list.size() > 0){
                            request.setAttribute("users", list);
                    }
   
                forwardPage = mapping.findForward("usersuccess"); 
            }
            catch (BaseException ex){           
                    log.info("BaseException : "  +ex);                   
            forwardPage = processExceptions( request, mapping, ex);
            }       
            return forwardPage;
    }
       
    protected ActionForward processExceptions( HttpServletRequest request,
                                                                                    ActionMapping mapping,
                                                                                                BaseException ex )
        {
            ActionErrors errors = new ActionErrors( );
            ActionForward forward = null;
       
                           
            //processBaseException(errors, (FieldException) ex);
            processBaseException(errors, ex);
       
            // 입력된 리소스와 failure 포워드를 반환 합니다.
            String inputStr = mapping.getInput( );
           
            if ( inputStr != null) {
                    forward = new ActionForward( inputStr );
            }
           
       
            // 예외가 하위 예외를 포함하고 있는지 확인
            List exceptions = ex.getExceptions( );
       
            if (exceptions != null && !exceptions.isEmpty() ){
                    int size = exceptions.size( );
                    Iterator iter = exceptions.iterator( );
       
                    while( iter.hasNext( ) ){
                            // 모든 하위예외들은 BaseException이어야 합니다.
                            BaseException subException =(BaseException)iter.next( );
                            processBaseException(errors, subException);
                    }
            }
       
            // Tell the Struts framework to save the errors into the request
            saveErrors( request, errors );
                                   
            // Return the ActionForward
            return forward;
        }
       
    protected void processBaseException( ActionErrors errors, BaseException ex)
        {               
                // 추가될 ActionError의 레퍼런스 저장
                ActionError newActionError = null;
               
                // 에러 코드는 리소스 번들의 키값
                String errorCode = ex.getMessageKey();
               
                /*
                * MessageFormat 객체가 사용하는 추가적인 인자가 있다면
                * args에 예외를 추가
                */
                Object[] args = ex.getMessageArgs( );
               
               
                // ACtionError 클래스의 인스턴스 생성자
                if ( args != null && args.length > 0 ){
                        // Use the arguments that were provided in the exception
                        newActionError = new ActionError( errorCode, args );
                }
                else{
                        newActionError = new ActionError(errorCode);
                }
               
                errors.add(ActionErrors.GLOBAL_ERROR, newActionError );
        }     
}


------------------------------
5. GetUserDAO.java
------------------------------

package logic;

import java.sql.*;

import com.bitmechanic.sql.*;
import java.util.*;
import logic.BaseException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class GetUserDAO  {
        private static String LIST_QUERY = "SELECT ename, job from emp where deptno=?";
       
        public List getUserList(String deptno) throws BaseException
    {
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            List list = null;
           
            Log log = LogFactory.getLog(GetUserDAO.class);
                           
            try
            {                             
                con = DriverManager.getConnection(ConnectionPoolManager.URL_PREFIX+"wink");
                pstmt = con.prepareStatement(LIST_QUERY);
       
                pstmt.setInt(1,java.lang.Integer.parseInt(deptno)); 
                                                         
                rs = pstmt.executeQuery();
               
                list = new ArrayList(50);
           
                while ( rs.next() )
                {                   
                        String ename = rs.getString(1);
                        String job = rs.getString(2);
                       
                        User user = new User();
                        user.setEname(ename);
                        user.setJob(job);
                       
                        list.add(user);
                }
               
                return list;
                                                 
            }
            catch (SQLException e1)
            {                               
                log.info("SQLException : " + e1);
                BaseException b = new BaseException(e1);
                                b.setMessageKey("jdbc.error");
                                throw b;
            }
            finally
            {                   
                try
                {
                        if ( rs != null )  rs.close();
                        if ( pstmt != null ) pstmt.close();
                        if ( con != null ) con.close();                       
                }
                catch ( Exception ignore )
                {
                }               
            }
    }
}

------------------------------
6. User.java
------------------------------
package logic;

import java.io.Serializable;

public class User implements Serializable {
        private String ename=null;
        private String job=null;
                       
        public String getEname() {
                return ename;
        }
       
        public String getJob() {
                return job;
        }
       
        public void setEname(String ename) {
                this.ename = ename;
        }
       
        public void setJob(String job) {
                this.job = job;
        }
                       
}


------------------------------
7. BaseException.java
------------------------------

package logic;

import java.util.List;
import java.util.ArrayList;
import java.io.PrintStream;
import java.io.PrintWriter;
/**
* 이 클래스는 애플리케이션 예외의 공통 슈퍼 클래스 입니다.
* 이 클래스와 이 클래스의 서브 클래스는 chained exception 기능을 제공
* chained exception 기능은 원래 문제를 이 클래스나 이 클래스의 서브 클래스로
* 감싸서 다시 실행 할 수 있습니다.
* 이 클래스는 exception을 List로 관리 함으로서 다중 예외 처리가 가능 합니다.
*/
public class BaseException extends Exception{
        protected Throwable rootCause = null;
       
        //예외를 여러 개 관리하고 나중에 ActionError를 만들 때도 반영
        private List exceptions = new ArrayList( );

        private String messageKey = null;
        private Object[] messageArgs = null;

        public BaseException( ){
                super();
        }
       
        //생성자
        public BaseException( Throwable rootCause ) {
                this.rootCause = rootCause;
        }

        public List getExceptions( ) {
                return exceptions;
        }

        public void addException( BaseException ex ){
                exceptions.add( ex );
        }

        public void setMessageKey( String key ){
                this.messageKey = key;
        }

        public String getMessageKey( ){
                return messageKey;
        }
       
        //어떤 메시지는 아규먼트가 여러 개 일 수 있습니다.
        // 예를들면 나이는 0 ~ 99 사이의 수가 들어와야 합니다.
        public void setMessageArgs( Object[] args ){
                this.messageArgs = args;
        }

        public Object[] getMessageArgs( ){
                return messageArgs;
        }

        public void setRootCause(Throwable anException) {
                rootCause = anException;
        }

        public Throwable getRootCause( ) {
                return rootCause;
        }

        public void printStackTrace( ) {
                printStackTrace(System.err);
        }

        public void printStackTrace(PrintStream outStream) {
                printStackTrace(new PrintWriter(outStream));
        }

        public void printStackTrace(PrintWriter writer) {
                super.printStackTrace(writer);
                if ( getRootCause( ) != null ) {
                        getRootCause( ).printStackTrace(writer);
                }
                writer.flush( );
        }
}


------------------------------
8. struts-config.xml
------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
     
<!-- ============ Form Bean Definitions ======================== -->
    <form-beans>
<form-bean name="EmpForm" type="logic.EmpForm">                 
            <form-property name="deptno" type="java.lang.String" />                   
        </form-bean>
    </form-beans>
   
 
    <!-- ========== Global Forward Definitions ================ -->
    <global-forwards>
<forward name="usersuccess" path="/logic/emplist.jsp" />     
    </global-forwards>
   
    <!-- ========== Action Mapping Definitions ================ -->
<action-mappings>
<action         
                path="/EmpSubmit"
                type="logic.DisplayAllUserAction"
                          name="EmpForm"                       
                    validate="false"
                    input="/logic/emp.jsp"
        />                             
    </action-mappings> 
           

<!-- 아래는 스트러츠 Application에서 사용할 Message Resource들을 설정  -->
<message-resources parameter="resources.application"/>
</struts-config>



------------------------------
9. application.properties
-----------------------------

user.depttitle=DEPTNO
jdbc.error=SAVE FAIL!!!


###############################################3
errors.header=<h3><font color="red">ERROR!</font></h3>
                  You must correct the following error(s) before proceeding:<UL>
errors.footer=</ul><hr>



------------------------------
10. NewActionServlet.java
------------------------------

package logic;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import org.apache.struts.action.ActionServlet;

//Connection Pool
import com.bitmechanic.sql.*;


public class NewActionServlet extends ActionServlet {
        private ConnectionPoolManager cpm;
       
        /*
        * poolAias는 커넥션 풀을 별칭(Alias)를 줘서 여러 개의 풀을 이용할 수 있게 해줍니다.
        * 이 값을 잘 기억하였다가 LoginDAO.java에서 실제 커넥션을 수립할때 인자로 줘야 합니다.
        */               
        private String POOL_ALIAS = "wink";
       
    private String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";  // driver
    private String DB_URL = "jdbc:oracle:thin:@localhost:1521:WINK"; // url
    private String DB_USER = "SCOTT"; // id
    private String DB_PASSWORD = "TIGER"; // pw
 
    private int REAP_CONN_INTERVAL = 300; // 여기서부터는 bitmechanic 을 위한 환경 설정 값
   
    /* 커넥션 풀에 담을 수 있는 커넥션의 최대 수 */
    private int MAX_CONNECTION = 20;
   
    /* idleTimeout은  ConnectionPoolManager가 그 간격으로 수행을
    * 하게 되므로 적당한 시간을 설정하면 됩니다.
    * (데이터베이스의 불필요한 Open Session 수를 줄일 수 있슴)
    */
    private int IDLE_TIMEOUT = 60;
   
    /* checkoutTimeout은 너무 짧게 설정해도 안되는게 정상적인 query 수행시간이 길다면
    * 정상적으로 작동하는 query 수행 중에 Connection을 Reaping(제거)해 버리므로
    * 최대의 쿼리 수행 시간보다 크게 설정해야 합니다.
    * 즉 풀에서 나갔다가 돌아오는 시간의 Timeout 설정
    */
    private int CHECKOUT_TIMEOUT = 60;
   
    //Checkout의 최대 수를 지정 합니다         
    private int MAX_CHECKOUT = 15;
   
   
    public void init(ServletConfig config) throws ServletException
    {
            try
            {
                    Class.forName(JDBC_DRIVER);
                   
                    cpm = new ConnectionPoolManager(REAP_CONN_INTERVAL);
                   
                    cpm.addAlias(POOL_ALIAS,JDBC_DRIVER,DB_URL,DB_USER,DB_PASSWORD,MAX_CONNECTION,IDLE_TIMEOUT,CHECKOUT_TIMEOUT, MAX_CHECKOUT);
                   
                    // connection pool 생성 후에 부모 class의 init method 연속 수행
                    super.init(config);
            }
            catch ( Exception e1 )
            {
                    e1.printStackTrace();
            }
    }

   
   
   

}




----------------------
12. web.xml
----------------------

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>Welcome to Tomcat</display-name>
  <description>
    Welcome to Tomcat
  </description>
        <!-- Struts Tag Library Descriptors -->
        <taglib>
            <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
        </taglib>   
       
        <servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>logic.NewActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>
       
       
        <!-- ActionServlet Mapping ====================================-->
        <servlet-mapping>
                <servlet-name>action</servlet-name>
                <url-pattern>*.do</url-pattern>
        </servlet-mapping>
           
</web-app>