준준의 기록일지

[펌] 서블릿 매핑, 배포 서술자(DD, Deployment Descriptor) 본문

Sevlets&JSP

[펌] 서블릿 매핑, 배포 서술자(DD, Deployment Descriptor)

junjunwon 2020. 8. 4. 18:09

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."




출처 : https://finerss.tistory.com/entry/%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A7%A4%ED%95%91-%EB%B0%B0%ED%8F%AC-%EC%84%9C%EC%88%A0%EC%9E%90DD-Deployment-Descriptor

 

서블릿 매핑, 배포 서술자(DD, Deployment Descriptor)

컨테이너는 클라이언트가 날린 요청에 들어 있는 URL을 가지고 어떤 서블릿인지 찾아낸다. URL과 서블릿을 매핑하는 방법은 개발자가 이를 어떻게 설정하는가에 따라 달라진다. 서블릿은 세가지

finerss.tistory.com

따라 작성하면서 이해도를 높이기.

 

컨테이너는 클라이언트가 날린 요청에 들어 있는 URL을 가지고 어떤 서블릿인지 찾아낸다.

URL과 서블릿을 매핑하는 방법은 개발자가 이를 어떻게 설장하는가에 따라 달라진다.

 

서블릿은 세가지 이름을 가질 수 있다.

1.  classes/registration/SignUpServlet.class 처럼 파일 위치를 알려주는 이름인 파일 위치명(file path name)

2. 서블릿 배포명 - 이 이름은 내부적으로만 사용되는 이름이며, 클래스 이름이나 파일 이름과 같을 필요는 없다.

3. URL 이름 - 공공의(public) 이름으로 누구나 다 알아도 되는 이름이다. 이 이름은 HTML 코드 안에 코딩하는 이름이며, 사용자가 클릭해서 서블릿을 호출할 때 사용하는 이름이다. 이 URL 이름이 HTTP 요청 안에 포험되어 서버로 전송된다.

 

본래에 파일 위치명을 놔두고 다른 이름을 만들어서 헷갈리게 하는 이유는

서블릿 이름을 다른 이름으로 매핑하면, 애플리케이션의 유연성, 보안성이 좋아지기 때문이다.

 

가령 JSP나 HTML 안에 서블릿의 실제 경로와 파일 이름을 하드 코딩한다고 해보자.

만약 그 서블릿을 담고 있는 디렉토리 구조를 바꿔야하는 상황이 벌어졌다면, 개발자는 파일이란 파일은 다 검색해서 하드코딩된 부분을 찾아 수정해야 하는 번거로움이 있다.

 

하지만 DD에 매핑을 하게 되면 실제 파일 명을 하드코딩하는 것이 아니라 DD에 매핑된 URL 이름만 명시해놓기 때문에 디렉토리 구조가 변경되었더라도 파일은 수정할 필요 없이, DD만 수정하면 된다.

 

보안문제를 보자면, 클라이언트가 파일 위치명을 알게된다면, 실제 경로를 알 수 있다는 말인데 이는 직접 브라우저 주소란에 이 정보를 입력하여 접근할 수 있다는 것이다. 클라이언트가 여러분의 서버 디렉토리 구조랑 파일 이름들을 모두 알 수 있다는 뜻이며 여러분이 설정한 방식으로 폼이나 페이지에 접근하지 않고, 클라이언트가 직접 접근하게 되기 때문에 보안상 문제가 발생할 수 있는 것이다.

배포 서술자(DD, Deployment Descriptor)에서 URL을 서블릿에 매핑하기.

웹 컨테이너도 서블릿을 배포하려면 배포서술자(이하 DD)라는 XML 파일을 먼저 만들어야 한다.(있다면 수정!)

DD 파일에는 서블릿과 JSP를 어떻게 실행하느냐에 관한 많은 정보들이 들어 있는데 우선 URL과 서블릿 매핑에 대해 알아보자.

매핑을 하려면 두 가지 작업을 해야 하는데, 먼저 URL 이름을 내부에서만 사용하는 이름으로 매핑하고, 그 다음 내부 이름을 실제 클래스 이름으로 매핑하면 작업은 끝난다.

 

URL 매핑을 위한 두 가지 항목.

1. <servlet>

- 내부에서만 사용하는 이름과 완전한(패키지 이름까지 포함하여) 클래스명과 서로 매핑한다.

2. <servlet-mapping>

- 내부에서 사용하는 이름과 URL 이름을 서로 매핑한다.

 

DD 형식을 보면

<web-app ...>

    <servlet>

        <servlet-name>Internal name 1 </servlet-name> <- DD 안에서 사용하는 내부 이름 정의

       <servlet-class>foo.Servlet1</servlet-class> <- 완전한 서블릿명(패키지명 포함) 해서 기입 (.class는 제외)

    </servlet>

 

    <servlet>

       <servlet-name>Internal name 2</servlet-name> ③

      <servlet-class>foo.Servlet2</servlet-class> ④

    </servlet>

    ................

    ................

    <servlet-mapping> <- 클라이언트로부터 요청이 들어오면 컨테이너는 <servlet-mapping> 항목을 검색

       <servlet-name>Internal name 1</servlet-name>

        <url-pattern>/public1</url-pattern> <- 이 이름은 바로 클라이언트가 사용하는 서블릿의 가공된 이름 (실제 서블릿 클래스 명은 아님.

    </servlet-mapping>

 

    <servlet-mapping>

      <servlet-name>Internal name 2</servlet-name> ②

       <url-pattern>/public2</url-pattern> ①

    </servlet-mapping>

</web-app...>

 

클라이언트로부터 요청이 들어오면 컨테이너는 DD에서 위의 순서대로 (1->2->3->4) 로 서블릿을 검색한다.

계속