다잇소


[IT/트랜드] Apache Tomcat 활용하기 ④ (Web Application 배포하기 – 2편)

2017.07.26
apache-tomcat


 3. Web application 배포하기




3) Filter 배치하기


Filter는 client로 부터 호출이 발생 할 때, 자원이 호출되기 전과 후에 처리 할 수 있습니다. 일종의 전처리기와 후처리기 동작 할 수 있습니다. 아래의 Servlet예제로 한 그림을 보도록 하겠습니다.


1500793722420


<<https://autofei.wordpress.com/category/java/>> 참조


첫 번째 그림은 Filter가 없는 경우이고, 두 번째는 Filter가 있는 경우 입니다. 이렇게 전처리기와 후처리기로 동작을 하게 되면, 인증, 보안, 압축처리 등 공통으로 처리 할 때 유리한 점이 많습니다. Filter의 설정하는 다음과 같이 처리 할 수 있습니다.


Filter source를 작성한 다음, compile하여 Filter class file을 만듭니다.


Java binary file인 Filter class을 WebApp01/WEB-INF/classes에 배치합니다.


web.xml에서 filter원소와 filter-mapping원소를 설정합니다.


Filter를 설정을 하려면 두 element<filter>와 <filter-mapping>을 Servlet처럼 각각 설정하여야 합니다. Servlet 설정 시 자식 element인 <servlet>은 <filter>와 역할이 같습니다. 또한 <servlet-mapping>과 <filter-mapping> 구조는 같으나, 자식 element인 filter-mapping <url-pattern>에 설정되는 URI은 filter가 호출 될 주소가 아니라, filter가 동작 할 URI입니다. 예를 들자면 HelloServletWorld가 호출 될 때 동작하려면, “/HelloServletWorld” 로 설정을 해야 되고, jsp가 호출 될 때 동작을 하려면 “*.jsp” 입력하여야 합니다. 또는 특정 폴더 밑에 있는 모든 application이 동작하려면, “/dir01/*” 로 설정하면 됩니다. “*”은 모든 것의 의미입니다.  Filter는 특정 URI를 제외 할 수 없는 방법이 없어서, 별도의 url mapping util을 만들어서 사용하는 경우가 많습니다.


우리는 HelloServletWorld가 호출 될 때 동작하도록 하겠습니다. 우선 HelloFilter.java로 Filter를 구현하겠습니다.










package person.bk.tomcat.example01;


 


import java.io.IOException;


import java.io.PrintWriter;


import java.util.Calendar;


 


import javax.servlet.Filter;


import javax.servlet.FilterChain;


import javax.servlet.FilterConfig;


import javax.servlet.ServletException;


import javax.servlet.ServletRequest;


import javax.servlet.ServletResponse;


import javax.servlet.http.HttpServletRequest;


 


public class HelloFilter implements Filter {


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {


HttpServletRequest  httpServletRequest = (HttpServletRequest)request;


response.setCharacterEncoding(“utf-8”);


response.setContentType(“text/html”);


PrintWriter out = response.getWriter();


out.printf(“HelloFilter filter before %s at %s<br/>”, httpServletRequest.getRequestURI(),Calendar.getInstance().getTime().toString());


chain.doFilter(request, response);


out.printf(“HelloFilter filter after %s at %s<br/>”, httpServletRequest.getRequestURI(),Calendar.getInstance().getTime().toString());


}


@Override


public void destroy() {}


@Override


public void init(FilterConfig arg0) throws ServletException {}


}



doFilter method을 보면 “chain.doFilter(request, response)부분을 볼 수 있습니다. 이 부분 기준으로 윗부분은 Servlet이 실행이 되기 전에 실행이 되어, 보안, 인증을 미리 처리 할 수 있고, Servlet 실행 되는 이후 부분은 일반 평문의 암호화 또는 전송 data를 압축하여 전송 할 수도 있습니다.


 


compile 후에 HelloFilter.class에 다음과 배치 하겠습니다. 다른 class file과 동일하게 WEB-INF에 배치가 됩니다.










CATALINA_HOME/webapps/WebApp01/WEB-INF/classes/person/bk/tomcat/example01/HelloFilter.class



이제 web.xml에 filter에 관한 환경을 설정하도록 하겠습니다.










<?xml version=“1.0” encoding=“UTF-8”?>


<web-app xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance” xmlns=http://java.sun.com/xml/ns/javaee” xsi:schemaLocation=http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd” version=“3.0”>


 


  <filter>


  <filter-name>HelloFilter</filter-name>


  <filter-class>person.bk.tomcat.example01.HelloFilter</filter-class>


  </filter>


  <filter-mapping>


  <filter-name>HelloFilter</filter-name>


  <url-pattern>/HelloWorldWorld</url-pattern>


  </filter-mapping>


 </web-app>



주의 깊게 볼 부분은<url-pattern>/HelloWorldWorld</url-pattern> 부분 입니다. 이 설정은 /HelloWorldWorld가 호출이 될 때 동작을 한 다는 것 입니다. 이를 annotation으로 설정하려면 다음과 같이 하면 됩니다.  “@WebFilter(filterName=“HelloFilter”,urlPatterns=“/HelloServletWorld”) public class“위 부분에 설정 할 수 있습니다.










package person.bk.tomcat.example01;


 



 


@WebFilter(filterName=“HelloFilter”,urlPatterns=“/HelloServletWorld”)


public class HelloFilter implements Filter {



}



이제 다시 Web Browser의 주소 창에 http://localhost/WebApp01/HelloServletWorld을 입력하겠습니다.


1500793722434


HelloServletWorld은 호출 시에 HelloFilter 동작하여, Servlet 앞 뒤 실행 된 을 확인 할 수 있습니다.


 


4) JSP 배치하기


여기서 첫 번째로 다음과 같은 index.jsp file을 작성하여 실제로 web browser에서 구동하여 보겠습니다. 우선 다음과 같이 index.jsp을 작성합니다.










<%@ page contentType=“text/html;charset=UTF-8” pageEncoding=“UTF-8” %>


<%@ page import=“java.util.Calendar” %>


<html>


<head>


<title>WebApp01 예제</title>


<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>


</head>


<body>


<div class=“content”>


<b>Hello Java Web Application World!!!</b>


<p>현재 시간은 <%=Calendar.getInstance().getTime()%> 입니다.</p>


</div>


</body>


</html>



아래와 그림과 같이 index.jsp file을 /WebApp01에 저장을 합니다.


1500793722441


이제 command창을 열고, startup.bat를 입력하여, Tomcat을 구동을 하고, 나서 여러분의 web browser에 “http://localhost/WebApp01/index.jsp”라고 입력하여 주시기 바랍니다. index.jsp file이 WebApp01 바로 아래에 위치 했기 때문에 “http://localhost/WebApp01″에 “/index.jsp”만 추가적으로 URI 만들면 됩니다.


1500793722445


위 그림과 와 같은 결과를 볼 수 있으면 정상적으로 완료 한 것 입니다.


JSP는 client에서 요청이 있을 경우 다음 단계로 동작을 합니다.


Tomcat의 Servlet Container는 요청 한 URI에 jsp를 호출을 합니다.


Servlet Container는 호출된 JSP를 적재를 시도하지만, 이미 Java binary file로 존재하는지 먼저 찾습니다.


Java binary file이 존재하면 이를 바로 적재하여 실행을 합니다. 이 경우는 빠른 응답 속도를 보입니다.


Java binary file이 존재하지 않으면, JSP를 Java source file로 변경을 하고, 다시 Java binary로 compile을 한 다음, 응답을 합니다. 이 경우는 다소 느리게 응답합니다.


Tomcat은 CATALINA_HOME/work 아래에 실제로 JSP가 호출 될 경우 동작하고 있는 Java class file을 볼 수 있습니다.


1500793722450


지금까지 우리는 directory 구조 그대로 Web application를 배치하였습니다. 처음에 이야기 하였던 구조를 잘 따르면, 모든 application이 잘 동작 할 것 입니다.


 


2. WAR file로 배포하기


이 방법은 기존의 Directory 구조를 이해하고 있다면 단순한 배포방법입니다. Web appilcation의 root directory이동하여 그냥 한 다음 압축된 file를 그냥 application base로 복사 해 넣으면 배치가 완료된 것 입니다.


Web Application directory이동하여 jar를 압축하여, WebApplication명.war로 압축을 합니다.










D:\Server\temp>cd %CATALINA_HOME%\webapps\WebApp01


D:\Server\Tomcat\apache-tomcat-7.0.79\webapps\WebApp01>jar cvf WebApp01.war .



주의 할 것은 제일 끝에 추가 된 “.” 입니다. 현재 directory를 압축하여야 합니다.


기존의 WebApp01 directory 전체를 삭제 한 다음, Tomcat 기동을 합니다.


%CATALINA_HOME%\webapps을 확인 해 보면 다음과 같이 WebApp01 directory가 기존과 같이 생성 된 것을 알 수 있습니다.


1500793722455


제대로 배포되었는지, http://localhost/WebApp01/HelloServletWorld을 Web browser의 주소 창에 입력하겠습니다.


1500793722459


WAR가 정상적으로 deploy가 되려면, <Host> 속성에 설정을 해야 될 부분이 있습니다. Tomcat이 기동이 될 때 배포가 되려면, deployOnStartup값이 true이어야 합니다. 그리고, 운영 중에 배포가 되려면, autoDeploy가 true가 되어야 합니다.


 


기존과 똑같은 결과를 볼 수 있습니다. index.jsp도 같은 방법은 WAR 배치 할 때나, directory 배치 해도 동일하게 동작 하는 것을 알 수 있습니다.




 




설정된 프로필 사진이 없습니다.
| Wise리더
관심분야 IT,여행,맛집

카테고리 레이어 닫기