■ 인터셉터란?
※ 많은 애플리케이션은 액션의 종류와 무관하게 공통적으로 적용될 수 있는 기능이 있다. 예를 들면 유효선 검사 기능(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/> 요소를 사용한다.
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> |
'Struts > Struts Programming' 카테고리의 다른 글
[Struts] 커스텀 인터셉터 (0) | 2012.09.11 |
---|---|
[Struts] 인터셉터란? (0) | 2012.09.11 |
[Struts] 스트럿츠 2 아키텍처 (0) | 2012.09.06 |
[Struts] ModelDriven와 Preparable 인터페이스 활용하기 (0) | 2012.09.03 |
[Struts] 도메인 오브젝트 (0) | 2012.09.03 |