sun cloud

목차



Annotation

일반적으로 어노테이션은 컴파일 및 런타임 시점에 시스템에 영향을 주는 의미 있는 주석을 말합니다.

그런데 저희가 이번에 배울 서블릿에서의 어노테이션은 기존 web.xmlurl-pattern의 설정과 같은 효과를 가지는 서블릿 3.0 이상에서 지원하는 기술입니다.


그래서 서블릿 3.0 이상부터는 어노테이션의 표기 방법인 @를 서블릿 상단부에 명시하게되면 소스코드에서 설정 정보를 기술할 수 있게 되었으며, 서블릿 매핑 또한 자동적으로 지원해줍니다.

url 매핑 기법을 굳이 web.xml과 어노테이션 두 가지로 나눠서 사용하는 이유는 편리함 때문입니다.
자바 파일이 많지 않다면 web.xml에서 직접 작성하는 방식이 크게 불편하지 않을 수 있습니다만, 파일이 많아진다면 하나씩 매핑해주는 일이 결코 반갑지 않게 되겠죠.


그래서 이를 자동적으로 처리해줄 수 있도록 하는 기능이 어노테이션입니다.


간단히 역할을 보면,

XML: 소스 코드와 설정의 분리

Annotation: 소스코드 상에 설정 정보를 기술

정도로 짧게 소개할 수 있을 것 같습니다. 실제 업무에서는 일반적으로 전역적인 설정은 xml에 기술하고, 설계 시 확정되는 부분은 Annotation으로 선택적으로 설정하여 사용한다고 합니다.


정리하자면 기존에 DD에서 해주던 서블릿 매핑 작업을 어노테이션 기술을 적용하면 클래스 위에 어노테이션을 명시하는 것 만으로도 손쉽게 서블릿 매핑이 가능하게 되었고, 필요에 따라 xml과 어노테이션을 함께 사용합니다.


그러면 직접 어노테이션 설정 방법을 확인해보도록 하겠습니다.




예제

다음과 같이 어노테이션을 적용해서 코드를 작성했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/as")
public class AnnotationServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;     
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		out.println("Annotation 설정 기반 서블릿 테스트");
		out.close();
	}
}

10번 라인을 보시면 어노테이션으로 url 주소를 명시했습니다.


실행해 보면 다음과 같이 url 주소에 어노테이션에 작성한 url이 참조된 것을 확인하실 수 있습니다.

image




loadOnStartup

이번에는 웹어플리케이션 실행 시점에 미리 해당 서블릿을 초기화 하도록 하는 web.xmlload-on-startup 설정을 어노테이션 방식으로 설정해서 적용이 되는지 확인하겠습니다.
(원래 서블릿은 브라우저의 최초 요청 시 init()을 호출하며 메모리에 적재되고 기능이 수행됩니다. 그래서 최초 요청에 한해 실행 시간이 보다 길어질 수 있는데 이런 단점을 보완하기 위한 기능이 load-on-startup기능입니다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/LifeCycleServlet",loadOnStartup = 1)
public class LifeCycleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public LifeCycleServlet() {
        super();
        System.out.println("LifeCycleServlet 객체 생성");
    }
    
    @Override
    public void init() throws ServletException {
    	System.out.println("init() 실행");
    }
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		out.println("Annotation 설정 기반 서블릿 테스트 "+getServletConfig().getServletName());
		System.out.println("service() -> doGet() 실행");
		out.close();
	}
    
	@Override
	public void destroy() {
		System.out.println("destroy() 실행");
	}
}

10번 라인을 보시면 다음과 같이 loadOnStartup 속성을 어노테이션에 작성했습니다. @WebServlet(urlPatterns = "/LifeCycleServlet",loadOnStartup = 1)

결과를 확인해보시면 아래와 같이 컨테이너가 실행되자마자 함께 서블릿을 미리 생성한 것을 확인하실 수 있습니다.

image


만약 위의 코드에서 일반적인 어노테이션을 적용했다면 아래와 같이 컨테이너가 먼저 실행되고 난 뒤 브라우저 요청 시 서블릿이 생성되고 init() 메서드가 호출됩니다.

image




WebListener

마지막으로 어노테이션으로 ServletContextListner 설정을 확인해보겠습니다.


ServletContextListener는 웹 어플리케이션의 시작 또는 종료 시점에 호출되는 메서드를 정의한 인터페이스입니다.

보통 web.xml에서 <listener> 태그를 사용해 설정을 하는데, 이번에는 어노테이션으로 해당 기능을 적용해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class TestListener implements ServletContextListener {

    public TestListener() {}

    public void contextDestroyed(ServletContextEvent sce)  { 
         System.out.println("contextDestroyed");
    }

    public void contextInitialized(ServletContextEvent sce)  { 
         System.out.println("contextInitialized");
    }
	
}

5번 라인과 같이 @WebListener 라는 어노테이션을 작성했습니다. 해당 파일은 브라우저에서 실행되지 않고 콘솔창에서 기능의 수행만 확인해보려 합니다.


10번 라인의 contextDestroyed() 메서드는 웹어플리케이션이 종료되기 직전 또는 ServletContext가 해제되기 직전에 호출됩니다.


14번 라인의 contextInitialized() 메서드는 웹어플리케이션 시작 시점 또는 ServletContext가 생성되고 난 직후에 호출됩니다.


프로그램을 실행시킨 후 콘솔창을 확인해보면 다음과 같이 listener 기능이 정상적으로 적용된 것을 확인할 수 있습니다.

image

image




지금까지 수업에서는 web.xml을 공부하기 위해 낮은 버전의 서블릿을 사용했는데, 앞으로는 3.0 이상의 버전을 사용해서 직접 xml 파일을 수정하지 않고, 기술의 편리함을 느끼며 수업을 진행할 예정입니다.

맨 위로 이동하기

Java Web Programming 카테고리 내 다른 글 보러가기

댓글남기기