레이블이 구로디지털JAVA인 게시물을 표시합니다. 모든 게시물 표시
레이블이 구로디지털JAVA인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 6일 화요일

[오라클자바닷넷교육강좌, ORACLEJAVA]이벤트 리스너를 이용한 로깅, Event Listener Logging

이벤트 리스너를 이용한 로깅 


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

웹애플리케이션의 이벤트 리스너는 서블릿의 이벤트 리스너 인터페이스를 구현한 자바 클래스이며 ServletContext, HttpSession 객체에 상태 변화가 생길 때 이를 알려 줍니다. 그래서 이것을 이용하면 현재 사이트에 로그인 한 사용자들의 이름을 Display하는 것들이 가능 한겁니다.

이벤트의 유형에 따라 리스너는 여러 개가 지정 가능 하며 개발자는 원하는 이벤트의 유형에 따라 리스너를 구현하면 됩니다.


[ServletContext 관련]
ServletContextListener : ServletContext가 처음 요청에 대해 서비스 할 때 또는 서블릿 컨테이너에 의해 종료 될 때 실행

ServletContextAttributeListener : ServletContext에 속성이 추가 , 제거되는 경우에 실행


[HttpSession 관련]
HttpSessionListener : HttpSession 객체가 생성/소멸 되는 경우에 실행

HttpSessionAttributeListener : 세션에 속성이 추가, 제거되는 경우에 실행



-------------------------
이벤트 리스너 생성
-------------------------

1.        원하는 이벤트 유형과 이벤트 리스너 인터페이스를 구현한 자바 클래스를 생성 (반드시 인자 없는 생성자를 포함해야 합니다.)
2.        listener 요소를 이용하여 web.xml에 선언
3.        웹 애플리케이션 리소스와 함께 필터 클래스를 패키징



----------------------------------
이벤트 리스너 클래스 만들기
----------------------------------

javax.servlet.ServletContextListener 인터페이스를 구현 한 클래스

[LoggingListener.java]

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class LoggingListener implements ServletContextListener{
private ServletContext context = null;

        /**
        * Called by the container before the first request is
        * processed. This is a good time to initialize
        * the logging service.
        */
        public void contextInitialized( ServletContextEvent event ){
                this.context = event.getServletContext( );
                // Initialize the logging service here
                // Log a message that the listener has started
                log( "LoggingListener initialized" );
        }

        /**
        * Called by the container when the ServletContext is about
        * ready to be removed. This is a good time to clean up
        * any open resources.
        */
        public void contextDestroyed( ServletContextEvent event ){
                // Clean up the logging service here
                // Log a message that the LoggingListener has been stopped
                log( "LoggingListener destroyed" );
        }

        /**
        * Log a message to the servlet context application log or
        * system out if the ServletContext is unavailable.
        */
        protected void log( String message ) {
                if (context != null){
                        context.log("LoggingListener: " + message );
                }else{
                        System.out.println("LoggingListener: " + message);
                }
        }
}



동일한 이벤트에 대해 이벤트 리스너를 구현한 클래스가 여러 개 있을 수 있습니다. 또 다른 ServletContext 이벤트 리스너 클래스를 만들어 보도록 합니다.

아래의 예문을 컴파일 하기 위해서는 클래스 패스네 bitmechanic Connection Pool의 jar 파일을 클래스 패스에 위치시켜야 합니다. “DB를 이용하여 로그인 하기” 강좌를 참고하세요~

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

[DBConnectionPoolListener.java]

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContext;

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

public class DBConnectionPoolListener implements ServletContextListener{

        private ServletContext context = null;

        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
   
    /* reapConnInterval은 다른 커넥션 풀들과는 틀린 부분이며 중요한
    * 옵션입니다.
    * reapConnInterval은 두가지 경우에 커넥션 풀의 connVector에서 커넥션을 제거하게 됩니다.
    * 1. 풀에서 conn이 나갔는데(checkout) checkoutTimeout 시간안에 돌아오지 않을 경우
    * 2. 풀의 connVector에서 전혀사용되지 않는 상태(idle)로 idleTimeout 시간을 초과할 경우
    * bitmechanic의  커넥션 풀은 최대 Connection 수를 설정해도  30이면 30개 커넥션이 담겨져
    * 있는 것이 아니라 상황에 따라 적절히 조정 하며 전혀 사용이 되지 않으면(Idle)수를 줄입니다.
    * 즉, maxConn이 30이어도 사용특성에 따라 몇 개만이 풀에서 운용될 수도 있다는 이야기 입니다. 
    */
    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 contextInitialized( ServletContextEvent event ){
                // Initialize the connection pooling here

                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);                               

                                log( "Connection Pool initialized" );
                }
                catch ( Exception e1 )
                {
                        log( "Connection Pool initialize fail..." );
                        e1.printStackTrace();
                }
        }
        /**
        * Called by the container when the ServletContext is about
        * ready to be removed. This is a good time to clean up
        * any open resources.
        */
        public void contextDestroyed( ServletContextEvent event ){
                // Shut down the connection pooling and open database connections
        }

        /**
        * Log a message to the servlet context application log or
        * system out if the ServletContext is unavailable.
        */
        protected void log( String message ) {
                if (context != null){
                        context.log("LoggingListener: " + message );
                }else{
                        System.out.println("LoggingListener: " + message);
                }
        }
}

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

이제 남은 일은 web.xml의 listener 요소에 선언을 하는 일입니다.
Web.xml의 <web-app> 요소 안에 다음을 추가 하세요~

[web.xml]
<listener>
<listener-class>LoggingListener</listener-class>
</listener>

<listener>
<listener-class>DBConnectionPoolListener</listener-class>
</listener>



이제 Tomcat을 재시작 하면 다음과 같은 로그를 콘솔화면에서 볼 수 가 있습니다.

2011. 1. 29 오전 9:58:28 org.apache.catalina.core.ApplicationContext log
정보: LoggingListener: LoggingListener initialized
LoggingListener: Connection Pool initialized

2013년 8월 2일 금요일

자바 위임을 이용한 Adapter 패턴 예제 (java adapter pattern, java design pattern

안녕하세요~ oraclejavacommunity 입니다. 위임을 이용한 Adapter 패턴 예제 입니다.
 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



위임이란 어떤 메소드의 처리를 다른 인스턴스의 메소드에 맡긴다는 의미 


Banner.java및 Main.java는 앞 예제와 동일함

//Print.java
public abstract class  Print {
public abstract String printString();
}


//PrintBanner.java
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner (String str) {
this.banner = new Banner(str);
}
public String  printString() {
return "(" + banner.showString() + ")";
}
}
 
  

java inheritence and composition(자바 상속 컴포지션)

상속과 컴포지션은 동전의 양면과 같이 유사하게 서로에게 관련이 있다. 
 - 상속은 마치 양파가 여러 껍질로 이루어진 것과 같이 계층화된 객체
 - 컴포지션은 여러 재료(객체)가 한데 뭉쳐서 만들어진 죽
 - 컴포지션은 개체들간의 'has a' 관계, 상속은 ‘is a’관계
 - 상속과 컴포지션은 상호 배타적이지 않으며 개발자는 이 둘을 같이 사용한다.

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



Composition Exam

class Soap {
  private String s;
  Soap() {
    System.out.println("Soap()");
    s = new String("Constructed");
  }
  public String toString() { return s; }
}

public class Bath {
  private String 
    // Initializing at point of definition:
    s1 = new String("Happy"), 
    s2 = "Happy", 
    s3, s4;
  Soap castille;
  int i;
  float toy;
  Bath() {
    System.out.println("Inside Bath()");
    s3 = new String("Joy");
    i = 47;
    toy = 3.14f;
    castille = new Soap();
  }
  void print() {
    // Delayed initialization:
    if(s4 == null)
      s4 = new String("Joy");
    System.out.println("s1 = " + s1);
    System.out.println("s2 = " + s2);
    System.out.println("s3 = " + s3);
    System.out.println("s4 = " + s4);
    System.out.println("i = " + i);
    System.out.println("toy = " + toy);
    System.out.println("castille = " + castille);
  }

  public static void main(String[] args) {
    Bath b = new Bath();
    b.print();
  }
}

2013년 7월 28일 일요일

[오라클,SQL실무,SQL튜닝,PL/SQLSQL초보에서실전전문가까지]오라클인스턴스(Oracle Instance란? )

오라클인스턴스(Oracle Instance)란?

DataBase가 시작될때 Oracle은 시스템글로벌영역(SGA)
이라는 메모리 영역을 할당하여 하나 이상의 Oracle Process를 시작합니다.
SGA와 Process를 합쳐 DataBase Instance라고 합니다. 

Instance의 memory와 process들은 database의 data를 효율적으로 관리하기 위해서 사용되며 관련 database에 대하여 하나의 user 또는 여러 user들에 의해서 이용된다.

[SGA ---> DataBase Buffer Cache, Redo Log Buffer, Share Pool등으로 구성]
자세한 부분별 설명은 다은 강좌에 이어 집니다.

Instance를 시작한다음 인스턴스에 DataBase를 Mount합니다.
다중 인스턴스가 동시에 자신의 물리적 DataBase를 Access하면서
동일한 Computer에서 실행될수 있습니다. 

Oracle병렬서버를 사용하면 다중인스턴스에 단일 데이터베이스를
마운트할수있습니다.

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)JAVA Jar 사용법

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




Jar c|t|u|x[f][m][M][0][v] [jar파일의이름] [menifest] [-C directory] [files]
  Jar –I[jar]
  - 처음 Option의 첫번째 문자(기본적인 연산을 지정)
  c : 새로운 Jar Archive를 생성, 마지막인자로 입력파일등을 표시, 새롭게 생성된 JAR File 
      은 첫번째 엔트리로 META-INF/MENIFEST.MF 파일을 가지며 이파일은 JAR File의 
      내용을 나열하며 각각의 파일에 대한 메시지 요약을 포함한다.
  t : Jar Archive의 내용을 나열한다. 
  u : Jar Archive 파일의 내용을 갱신, 커맨드라인에 나열된 파일은 이 아카이브에 추가된다. 
      m 옵션과 같이 사용된 경우에는 지정된 메니페스트 정보를 Jar File 에 추가한다.
 x : JAR Archive의 내용을 추출한다.
 - 한정자 옵션(4개의 명령지정문 뒤에서 연산에 관한 자세한 정보를 제공)
 f: jar가  Command Line의 지정된 이름의 JAR File에 대해 수행되는 것임을 나타낸다. 
    지정되지 않으면 표준입력으로 JAR File을 읽고 표준출력으로 JAR File을 쓴다.
m : 메니페스트 템플릿이 코맨드라인에 지정되었음을 JAR 명령에게 알린다.,(c,u Option과
    함께사용)


M : jar가 기본 메니페스트 파일을 생성하지 않도록 함(c, u와 함께 사용)
v : 여러 가지 출력을 내보내도록 함
0 : jar가 압축 없이 파일을 JAR 아카이브에 저장 하도록 함 

첫번째 옵션이 f를 포함한다면 jar파일의 이름을 기술하며, m을 포함한다면 menifest파일이름을 기술한다. 만약 첫번째 Option이 f,m을 모두 포함한다면 이와 동일한 순서로 나열해야 한다. Files에는 JAR Archive에 포함시킬 파일을 나열한다.

** 추가옵션
-C Directory : Jar가 다음파일및 디렉토리를 처리하는중에 지정된 dir을 바꾸도록 한다. –C Option은 몇개라도 사용이 가능하며, 다음 –C Option이 올때까지 유효하다.
-I jarfile : c,t,u,x 대신 사용, Jar File의 파일구조등의 인덱스를 산출하도록, META-INF/INDEX.LIST 파일에 저장
 추후 자바인터프리터나 애플릿뷰어등이 알고리즘의 최적화하고 불필요한 Jar File을 다운로드 하지 않기 위해서 이 인덱스 정보를 이용활수 있다.



jar cvf hello.jar HelloWorld*.class
jar cf hello.jar HelloWorld*.class -> 위의 것과 동일하나 화면에 출력이 나타나지 않는다.
jar cmf myMenifest test.jar HelloWorld.class -> test.jar File을 만들면서 myMenifest 라는 파일의 내용을 MENIFEST.MF File에 첨가한다.
Jar ufm test.jar myMenifest -> 이미 만들어져 있는 test.jar File의 MENIFEST.MF File을 myMenifest 를 참조하여 갱신한다.
Jar umf myMenifest test.jar

D:\자바프로그래밍\예제>jar tvf hello.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
D:\자바프로그래밍\예제>jar tf test.jar
META-INF/
META-INF/MANIFEST.MF
HelloWorld.class


D:\자바프로그래밍\예제>jar uf test.jar HelloWorld1.class

D:\자바프로그래밍\예제>jar uf test.jar HelloWorld2.class

D:\자바프로그래밍>jar cvf sample.jar -C 예제/  .  sample.jar file은 예제 dir에 생김

D:\자바프로그래밍\예제>jar tvf test.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
  391 Fri Jun 28 17:35:00 KST 2002 HelloWorld1.class
  354 Fri Jun 28 17:35:00 KST 2002 HelloWorld2.class