본문 바로가기

Struts/Struts Programming

[Struts] 인터셉터란?

반응형

■ 인터셉터란?

 ※ 많은 애플리케이션은 액션의 종류와 무관하게 공통적으로 적용될 수 있는 기능이 있다. 예를 들면 유효선 검사 기능(validation),

    폼에서 서브밋이 두 번 일어나는 것을 막는 기능, 액션이 처리되기 전에 파일 업로드하는 기능, 페이지를 출력하기 전에 서버로부터

    미리 데이터를 가져오는 기능(spooling), 각 액션에 대한 상세한 내역 기록(logging), 시간별 동작 및 성능 병목지점 검사(profiling)

    등이 있다. 인터셉터는 스트럿츠 프레임워크 내부의 소스 코드를 수정하지 않으면서도, 이러한 공통 관심 기능이 수행되어

    프레임워크에 적용되도록 한다.


 ① 스트럿츠 2에서는 인터셉터를 독립적으로 구현하여 어떠한 액션에도 적용될 수 있도록 한다.

 ② 인터셉터는 액션과 서로 느슨하게 연결(loose coupling)하기 때문에 인터셉터와 액션의 기능이 서로 간편하게 통합될 수 있도록 한다.

    이로인해 사용자들은 필요로 하는 프레임워크에 새로운 기능이 추가될 때까지 기다릴 필요 없이 간단히 인터셉터 형태로 작성해서

    추가하면 된다.

 ③ 인터셉터는 특정 액션이 수행되는 것을 가로채서 액션이 수행되기 이전이나 이후에 특정 행동들을 수행하도록 한다.



01) <interceptors/>

※ package를 시작할 때는 그 pack-age에 소속된 action들이 사용할 interceptor를 먼저 정의하는데, 이를 <interceptors> 안에 기술해야 한다.


 -. <interceptors/> 요소는 인터셉터르 설정하기 위한 용도로 사용되는데, <package>의 하위 요소이다.

 -. <interceptors/> 요소는 <interceptor/>dhk <<interceptor-stack/>를 하위 요소로 갖는다.

요  소

설                                      명

<interceptors>

 -. <interceptors/>안에는 <<interceptor/>dhk <<interceptor-stack/>를 하위 요소로 포함한다.

<interceptor>

 -. 인터셉터 스택에서 참조할 인터셉터를 등록할 요소이다.

<interceptor-stack>

 -. <interceptor-ref>요쇼롤 이용하여 이미 정의된 인터셉터들을 여러 개씩 묶어서
    하나의 이름으로 참조할 수 있도록 하는 인터셉터 스택을 정의하는 요소이다.

<interceptor-ref>

 -. 액션의 실행 전 후로 실행될 인터셉터를 지정할 때 사용된다.



02) <interceptor/>

 -. <interceptor/>는 인터셉터를 등록하는 요소이다.

속성

필수

설                               명

name

필수

 -. 인터셉터를 식별하기 위한 고유한 이름을 설정한다.

class

필수

 -. 인터셉터를 지정한 클래스를 패키지 명과 함께 지정한다.


 -. 스트럿츠2는 기본적으로 제공한느 디폴트 설정 파일인 struts-default.xml 파일의 struts-default 패키지에 기본적인 인터셉터를 제공한다.



03) <interceptor-ref/>와 <interceptor-stack/>

※ <interceptor-ref/>요소는 액션의 실행 전 후로 실행될 인터셉털르 지정할 때 사용된다. <interceptor-stack/>요소는 <interceptor-ref/>요소를 이용하여

   이미 정의된 인터셉터들을 여러 개씩 묵어서 하나의 이름으로 참조할 수 있도록 하는 인터셉터 스택을 정의하는 요소이다.


 -. struts-default.xml의 struts-default 패키지의 <interceptors> 요소는 다양한 인터셉터 스택들이 정의되어 있다.


 ① basicStack 인터셉터 스택은 exception, servletConfig, prepare, checkbox, parames, conversionError 인터셉터를 묶어놓은 것이다.

 ② exception, servletConfig, prepare, checkbox, parames, conversionError 인터셉터들은 이미 <interceptor/> 요소로 정의되어 있기에

    <interceptor-ref/>요소로 참조하여 사용할 수 있다.


04) <default-interceptor-ref>


 -. struts-default.xml의 struts-default 패키지에 정의된 <default-interceptor-ref/>이다.


 -. 디폴트 네임스페이스처럼 인터셉터 역시 디폴트 인터셉터라는 것이 존재한다. 바로 위 그림의 <default-interceptor-ref> 요소에

    지정한 "defaultStack" 인터셉터 스택이 바로 디폴트 인터셉터이다.

 -. 다음 그림은 struts-default.xml에 설정되어 있는 "defaultStack" 인터셉터 스택이다.


 -. <interceptor-ref/>요소가 설정되어 있지 않은 struts.xml에서는 struts-dafault.xml에 설정된 <default-interceptor-ref/>

    요소에 의해서 defaultStack가 디폴트로 설정된다. 때문에 defaultStack에 설정된 다양한 인터셉터를 아무 조건 없이

    사용할 수 있게 된다.

 -. struts.xml 파일에서 어떠한 인터셉터도 정의하지 않으면 스트럿츠 2가 제공하는 디폴트 설정 파일인 struts-default.xml 파일의

    <default-interceptor-ref/>요소에 지정된 defaultStack이 적용되기 때문이다.



05) 인터셉터 설정

※ 스트럿츠 2는 이미 struts_default.xml에서 다양한 인터셉터를 미리 만들어 두었지만,

   개발자 자신이 원하는 형식으로 직접 설정하야 사용할 수도 있다.


인터셉터

설                  명

timer

 -. 타이머는 인터셉터는 얼마나 오랫동안 액션을 실행할 것인지와 같은 간략한 프로파일링 정보를 제공한다.

logger

 -. 로깅 인터셉터는 액션이 실행되는 동안에 발생하는 이벤트 정보를 로깅하는 기능을 한다.

 -. 기존에는 스트럿츠 2와 별도로 제공되는 아파치 로깅(Apache Log4J) 라이브러리를 많이 사용하였으나

     스트럿츠 2에선느 로깅 인터셉터를 제공하므로 개발자의 기호에 따라 선택하여 사용한다.

 -. 아파치 로깅 라이브러리는 http://logging.apache.org/에서 메뉴얼이나 라이브러리를

     무료로 다운로드 할 수 있다.


 -. 다음은 <interceptors/> 요소를 정의하고 자식 요소로 <interceptor/>를 정의한 예이다.

 struts.xml

<interceptors>
            <interceptor-ref name = "timer" class = "com.opensymphony.xwork2.interceptor.TimerInterceptor/>
            <interceptor name = "logger" class = "com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
</interceptors>


 -. 설정한 인터셉터를 액션에서 사용할 수 있도록 하기 위해서 <interceptor-ref/> 요소를 사용한다.

 struts.xml

<action name = "HelloWorld" class = "tutorial.HelloWorld">

      <interceptor-ref name = "timer"/>

      <interceptor-ref name = "logger"/>

      <result name = "success">/helloWorld.jsp</result>

</action>


① 인터셉터 설정하기

  Chapter05/WebContet/WEB-INF/src/struts-01.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation/DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name = "tutoria01" namespace = "tutoria01" extends = "struts-default">
   
        <!-- 인터셉터를 설정하기 위해 <package>의 하위 요소로 <interceptors/> 요소를 설정하였다. -->
        <interceptors>
            <!-- 인터셉터를 등록하기 위해서 <interceptors/>의 하위 요소로 <interceptor/>요소를 설정하였다. -->
            <!-- class 속성에 인터셉터로 지정할 클래스를 패키지 명과 함께 지정하였고, -->
            <!-- name 속성에 인터셉터를 식별하기 위한 고유한 이름을 설정하였다. -->
            <interceptor name = "timer" class = "com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
            <interceptor name = "logger" class = "com.opensymphony.xwork2.interceptor.LogginInterceptor"/>
        </interceptors>
       
        <action name = "HelloWorld" class = "tutorial.HelloWorld">
            <interceptor-ref name = "timer"/>
            <interceptor-ref name = "logger"/>
            <result name = "success">/helloWorld.jsp</result>
        </action>
    </package>
</struts>

 인터셉터 수행 순서



② 인터셉터 스택 설정하기

  Chapter05/WebContet/WEB-INF/src/struts-02.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation/DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <package name = "tutorial02" namespace = "tutorial02" extends = "struts-default">
        <interceptors>
            <interceptor name = "timer" class = "com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
            <interceptor name = "logger" class = "com.opensymphony.xwork2.interceptor.LogginInterceptor"/>
           
            <!-- <interceptor-stack/> 요소로 이미 정의된 timmer, logger 인터셉터를 -->
            <!-- myStack란 이름의 인터셉터 스택으로 정의하였다. -->
            <interceptor-stack name = "myStack">
                <interceptor-ref name = "timer"/>
                <interceptor-ref name = "logger"/>
            </interceptor-stack>
        </interceptors>
       
        <action name = "HelloWorld" class = "tutorial.HelloWorld">
            <!-- timmer, logger 인터셉터를 하나의 이름(myStack)으로 참조할 수 있게 되었다. -->
            <interceptor-ref name = "myStack"/>
            <result name = "success">/helloWorld.jsp</result>
        </action>
    </package>
</struts>



반응형