커뮤니티나 미니 홈피와 같은 서비스를 하는 곳을 보면, 해당 커뮤니티 또는 홈페이지로 바로 갈 수 있는 URL을 제공해 줍니다. 보통 http://URL/XXX 형식으로 접근할 수 있는데 이러한 기능은 매우 간단해 보이지만 실제로 그렇지도 않습니다. 그렇다면 이를 어떻게 구현할 수 있을까요?
위의 기능을 구현하기 위해서 먼저 웹서버가 요청을 처리하는 구조를 살펴보도록 하겠습니다.
다음은 웹서버의 JSP/Servlet 요청 처리 과정을 간략하게 정리한 것입니다.
1. 웹서버로 요청(Request)이 들어온다.
2. 웹서버는 JSP/Servlet 요청을 처리할 수 없으므로, WAS (혹은 Servlet Engine)으로 요청을 전달한다.
3. WAS는 웹서버로부터 전달된 요청에 대한 처리(JSP/Servlet 처리) 후 결과를 웹서버로 전달한다.
4. 웹서버는 WAS로부터 받은 처리 결과를 가지고 응답(Response)한다.
뭐 대강 이정도가 되겠네요...
웹서버는 JSP/Servlet 요청이 들어왔을 경우 이를 처리해 줄 WAS를 알아야 합니다. 이는 설정 파일에 등록함으로써 가능하죠.
그럼 본론으로 들어가서.... 만약, http://URL/XXX 로 접근하게 되면 어떻게 처리될까요??
위의 요청은 JSP/Servlet 요청이 아니기 때문에 웹서버는 위와 같은 URL로 접근하게 되면, 먼저 웹 루트 밑에 XXX라는 디렉토리(또는 파일)를 찾게 됩니다.
하지만 이것은 우리가 원하는 동작이 아니죠. 따라서 URL Pattern Mapping이 필요합니다. 즉, 특정 패턴의 URL로 접근할 때의 처리를 특정 Servlet에게 맡기는 것입니다.
실제로 resin의 설정파일 정보를 예로 들어보면, 다음과 같은 내용이 있는 것을 볼 수 있습니다.
<servlet-mapping url-pattern='*.jsp' servlet-name='jsp' />
위 내용은 .jsp로 끝나는 파일에 대한 요청 처리를 jsp라는 이름으로 정의된 서블릿이 하도록 하는 것입니다.
아쉽게도 설정 파일을 통해 특정 패턴의 URL을 다른 URL로 Redirect할 수 있는 방법은 없습니다.
(제가 알기로는 말이죠...) 따라서 중간에서 Redirect를 수행하는 Servlet이 필요한 것입니다.
중간에 Redirect를 수행하는 Servlet을 두어, 특정 패턴의 URL로 접근할 때 그 Servlet이 처리를 하도록 하면 우리가 원하는 동작을 구현할 수 있습니다.
여기서 핵심은 서버의 설정 파일을 통해, 특정 패턴의 URL로 접근 시 특정 서블릿이 처리하도록 할 수 있다는 것입니다.
====== 설정 예제 (resin) ======
resin의 경우 특정 패턴을 표현하기 위해 정규표현식을 사용합니다. 정규표현식을 사용한 URL Pattern 설정은 다음과 같이 가능합니다.
<servlet-mapping url-regexp='정규표현식' servlet-name='서블릿이름' />
* 이러한 URL Pattern Mapping에 대한 설정 정보는 각각 엔진의 설정 문서를 참조하시기 바랍니다.
만약 커뮤니티이름 조건이 '영문자 또는 숫자의 조합'이라고 가정하면, 정규표현식으로 다음과 같이 표현 가능합니다.
/[a-zA-Z0-9]+$ : /로 시작하고, a-z, A-Z, 0-9의 조합으로 라인이 끝나는 문자
해당 요청을 redirector 라는 이름의 서블릿에서 처리한다고 하면, 다음과 같이 설정됩니다.
<servlet-mapping url-regexp='/[a-zA-Z0-9]+$' servlet-name='redirector' />
물론 redirector라는 이름으로 서블릿이 매핑되어 있어야 합니다.
======= RedirectServlet ========
그럼 이제 RedirectServlet으로 요청이 오도록 설정했으니, RedirectServlet을 구현해봅시다.
RedirectServlet의 역할은 매우 단순합니다. 만약 커뮤니티 메인 페이지의 url이
/cafe?cmd=main&cid=커뮤니티이름
라고 한다면, http://URL/XXX 로 접근했을 경우, URL을
/cafe?cmd=main&cid=XXX
로 재지향 하면 되는 것이죠.
요청 URL은 HttpServletRequest 객체의 getRequestURI() 메소드를 통해 얻을 수 있습니다.
이렇게 얻은 요청 URL 정보를 파싱하여, 커뮤니티 이름을 추출한 후, HttpServletResponse의 sendRedirect() 메소드를 통해 Redirect 하면 되는 것입니다.
RedirectServlet은 Justfun Common Library에 있으니, 참조하시기 바랍니다.
=======================================================================================
2004-06-08 조재호(tinywolf@korea.com)
No comments:
Post a Comment