오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)
이번에는 Action의 전체 수행시간을 확인할 수 있는 인터셉터를 만들어서 두수의 합을 구하는 Action에 붙여보자. Web Application 개발중 성능에 의심이 가는 로직이 있다면 인터셉터를 이용하여 점검해 볼 수 있을 것이다.
[개요]
- add.jsp에서 두수를 입력하고 서브밋 한다.
- SumAction이 이를 받아 두수의 합을 리턴하면 result.jsp에서 두 수 및 그 합을 출력한다.
SumAction이 실행되기전에 Action의 수행시간을 계산하기 위한 mytimer, prepare(Model빈을 초기화, 인스턴스 생성), modelDriven(초기화된 모델빈을 ValueStack의 상단에 로딩), params(ValueStack의 상단에 있는 빈에 사용자의 요청 파라미터를 세팅)와 같은 인터셉터를 붙였다.
Struts2 개발환경 관련 사항은 “struts2로 HelloWorld 작성하기” 강좌를 보면 나와 있으니 생략한다.
1. 이클립스에서 interceptor라는 Tomcat Project를 생성한다.
2. Action의 수행시간 계산을 위한 Timer.java 작성
package interceptor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class Timer extends AbstractInterceptor {
private static Log log = LogFactory.getLog(Timer.class);
public String intercept(ActionInvocation invocation) throws Exception {
//Action 전 처리
long start = System.currentTimeMillis();
//Interceptor Stack의 다음 인터셉트, 인터셉트가 없다면 Action 실행
String result = invocation.invoke();
//Action 후 처리
long execTime = System.currentTimeMillis() - start;
log.info("Action 수행 시간 >>>>> " + execTime + " ms");
return result;
}
}
3. 액션 클래스 작성(SumAction.java)
package interceptor1.action;
import interceptor1.dao.SumDAO;
import interceptor1.model.NumberForAdd;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
public class SumAction implements Action, Preparable, ModelDriven {
//도메인 오브젝트
NumberForAdd num;
private int sum = 0;
public String execute() throws Exception {
SumDAO dao = new SumDAO();
sum = dao.add(num);
return SUCCESS;
}
//Preparable인터페이스의 prepare 구현
public void prepare() throws Exception {
num = new NumberForAdd();
}
//ModelDriven 인터페이스의 getModel 구현
public Object getModel() {
return num;
}
//result.jsp 에서 sum 값을 참조시키기 위해
public int getSum() {
return sum;
}
}
4. 실제 비즈니스 로직처리를 위한 SumDAO.java
package interceptor1.dao;
import interceptor1.model.NumberForAdd;
public class SumDAO {
public int add(NumberForAdd num) {
return num.getNum1() + num.getNum2();
}
}
5. model 역할을 하는 NumberForAdd.java
package interceptor1.model;
public class NumberForAdd {
private int num1;
private int num2;
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
}
6. JSP 파일을 interceptor 프로젝트 디렉토리 아래에 작성하자.
[add.jsp]
<%@ page pageEncoding="euc-kr" %>
<form action="add.action">
<input type=text name="num1"><br>
<input type=text name="num2"><br>
<input type=submit>
</form>
[result.jsp]
${num1} + ${num2} = ${sum}
7.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
8. struts.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="struts2" extends="struts-default">
<interceptors>
<interceptor name="mytimer" class="interceptor.Timer"/>
</interceptors>
<action name="add" class="interceptor1.action.SumAction">
<interceptor-ref name="mytimer"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params"/>
<result>/result.jsp</result>
</action>
</package>
</struts>
9. http://localhost:8080/interceptor/add.jsp 를 실행하자.
브라우저에는 두수와 그 결과가 출력되지만 이클립스의 콘솔 창에서는 다음과 같이 Action이 수행된 시간이 출력된다.
2008. 10. 25 오후 12:38:25 interceptor.Timer intercept
정보: Action 수행 시간 >>>>> 156 ms
댓글 없음:
댓글 쓰기