와이드용 애드센스


[JSP] 서블릿(Servlet)의 매핑 방법 - Annotation과 web.xml Web Programming


MVC Pattern으로 개발된 웹 페이지에서 Controller를 담당하는 서블릿에 접근하기 위해서는 주소를 매핑해주어야 한다.

가장 대표적인 매핑 방법으로는 JAVA 코드에 Annotation을 작성해 주는 것이다.

1
@WebServlet("/AjaxController")
cs

이 코드를 서블릿에 작성해주는 것만으로도 매핑이 가능하다.

이클립스를 사용할 경우,서블릿을 생성할 경우 어노테이션(Annotation) 형식으로 자동으로 매핑이 되어 있다.

[사진1] Eclipse에서 서블릿을 생성 시 URL 매핑 옵션. 임의로 수정이 가능하다.


[사진2] JAVA Annotation으로 추가된 코드.

매핑된 URL 주소는 어노테이션 형식으로 JAVA 코드에 자동으로 삽입된다. 이렇게 매핑된 서블릿의 서버 상 주소는
http://[서버의 ip주소]:[포트번호]/[프로젝트명]/[매핑 이름]의 형태로 접근이 가능하다.


 


그렇다면 어노테이션을 사용하지 않고 직접 URL Pattern을 매핑해주는 방법은 없을까?
바로 프로젝트에 있는 web.xml을 이용하면 가능하다.

[사진3] web.xml의 초기상태

이클립스를 통해 자동으로 생성된 web.xml을 열어보면 다음과 같은 내용이 작성되어있다.

1
2
3
4
5
6
7
8
<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.study.controller.MainController</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/op/*</url-pattern>
</servlet-mapping>
cs


<web-app> 태그 사이에 위의 내용을 작성함으로 web.xml을 통해서도 URL 매핑이 가능하다.

<servlet-name>에는 위 아래 동일하게 서블렛 네임을 작성해준다. 임의의 이름으로도 가능하다.

<servlet-class>에서는 자신이 매핑할 servlet의 패키지 경로를 작성해준다. 예시에서는
com.example.study.controller 라는 패키지 하위에 있는 MainController라는 Servlet을 지정한 것이다.

<url-pattern>은 해당 servlet을 접근하기 위한 매핑 주소를 작성해주면 된다.




그렇다면 이 web.xml의 사용 목적은 무엇일까?

예시의 url-pattern을 살펴보면 /op/* 라는 와일드카드 문자를 사용하고 있는것을 볼 수 있다.
이 와일드카드의 의미는 /op 아래에 하위경로가 있을 시 어떠한 url pattern을 작성하더라도 해당 서블릿으로 이동하도록 하는 것이다.


이것은 의외로 우리 주변의 웹 사이트에서 쉽게 찾아볼 수 있는 패턴이다. 어렵게 생각할 필요가 없다.
가장 간단하게 접할 수 있는 네이버에서의 사례를 알아보자.
 
(이 글에서는 Servlet을 사용한다고 가정을 했을 뿐이고, 실제로 네이버가 Java를 이용하여 서버를 개발한 것은 아니다.)




[사진4] 네이버 지식IN Q&A 메인 페이지의 URL

우리가 자주 사용하는 네이버 지식in의 Q&A 메인 페이지다.

url pattern을 살펴보면 kin.naver.com/qna/questionList.nhn이라고 되어있다.
여기서 아무 Q&A 글을 클릭해보면


[사진5] 네이버 지식IN Q&A 게시글의 URL



위와 같이 kin.naver.com/qna/questionList.nhn 이라는 URL로 이동하였다.

Q&A의 모든 기능이 기능별로 다른 URL 패턴을 가지고 있는데, 하나의 서블릿에 하나의 URL만이 매핑된다면 관리해야하는 서블릿의 갯수가 기하급수적으로 늘어나게 될 것이고, 이는 분명히 좋은 코딩방법이 아닐 것이다.

Q&A의 모든 기능알 하나의 Servlet 을 사용한다고 가정하면, 현재 이 페이지의 url-pattern은 kin.naver.com/qna/*의 형태로 매핑을 하여 /qna/ 하위의 모든 url은 다 해당 Servlet으로 전송되는 것이라고 생각할 수 있을 것이다.



이렇게 와일드카드를 이용하여 전달받은 URL은 해당 Servlet에서 JAVA 코드를 통해 구분할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //response.getWriter().append("Served at: ").append(request.getContextPath());
        
        String subPath = request.getPathInfo();
        
        if (subPath.equals("/하위 경로 명")) 
        {
        
        }
        else if (subPath.equals("/하위 경로 명"))
        {
        
        }
cs


해당 접속의 request 요청에는 url-pattern이 포함되어 있으며, 
이 url pattern 중 와일드카드로 지정해둔 경로를 getPathInfo()함수를 통해서 서버에서 쉽게 받을 수 있다.
이것을 String에 저장한 후에 문자열을 비교하는 형식으로 간단하게 하위 경로별 기능을 구분해서 작성이 가능하다.

 

덧글

댓글 입력 영역



애드센스