본문 바로가기
프로그램 개발(분석, 설계, 코딩, 배포)/2. 개발

개발_JSP_JSP, Servlet(서블릿)의 URL 주소 매핑

by 3604 2022. 11. 18.
728x90

출처: https://codevang.tistory.com/194

 

모든 컨텐츠와 코드는 Chrome 브라우저에 최적화되어 있습니다.
코데방  2020. 2. 13.

[ Servlet - URL 매핑 ]

  • 서블릿의 @WebServlet("/URL") 어노테이션을 사용한 매핑
  • web.xml을 통한 매핑

서블릿은 위의 두 가지 방법으로 URL 매핑이 가능합니다. 먼저 첫번 째 방법은 이클립스에서 서블릿 파일을 생성할 때 자동으로 붙어 있는 어노테이션을 사용하는 방식입니다. 서블릿 생성에서 바로 Finish를 누르지말고 Next를 눌러보면 URL을 어떻게 매핑할지 나오는데 여기서 수정해도 되고 코드에서 바로 수정해줘도 무방합니다.

 

Next를 눌러보면
URL mapping에 대한 내용이 나옴

 

 

이렇게 파일을 만들면 위에 붙어 있는 @WebServlet("/URL")의 URL 주소로 접속하면 톰켓 서버의 컨테이너가 매핑된 서블릿을 찾아 실행해 줍니다. 

@WebServlet("/ClassName")
public class ClassName extends HttpServlet {

 

 

서블릿 한 개에 여러개의 url 주소를 매핑하려면 아래 코드와 같이 배열 형태로 사용해주면 됩니다.

@WebServlet(urlPatterns = {"/main", "/test", "/join"})
public class Controller extends HttpServlet {

 

 


 

 

두번 째 방법은 web.xml 환경설정 파일에서 직접 매핑해주는 방식입니다. 위의 방법이 훨씬 쉬워보일 수 있지만 웹 서비스가 복잡해지고 서블릿이 많아지면 web.xml에서 한번에 관리해주는게 편할 수 있습니다. 

 

이클립스에서 web.xml 파일을 텍스트 편집기로 연 뒤 아래의 형식으로 코드를 입력합니다. 주의할 점은 만약 패키지가 있다면 "패키지명.서블릿 클래스 이름"으로 전체 path를 입력해줘야 한다는 것입니다. servlet-name은 임의 지정해줘도 되지만 보기 쉽게 서블릿 파일의 이름과 동일하게 해주면 좋습니다. 당연히 위 아래의 servlet-name이 똑같아야 매핑이 됩니다. 다른 서블릿 네임에서 <servlet-class>의 값을 같게 해주면 하나의 서블릿에 여러 URL을 매핑할 수 있습니다. 

	<servlet>
		<servlet-name>Name</servlet-name>
		<servlet-class>com.java.example.ClassName</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>Name</servlet-name>
		<url-pattern>/class</url-pattern>
	</servlet-mapping>
    
    
	<servlet>
		<servlet-name>Name2</servlet-name>
		<servlet-class>com.java.example.ClassName</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>Name2</servlet-name>
		<url-pattern>/main</url-pattern>
	</servlet-mapping>

 

 

여기서 끝이 아닙니다. 이클립스에서 보이는 톰캣서버의 설정 파일들은 복사본입니다. 따라서 내용을 수정한 뒤에는 "publish"를 해줘야 실제 톰캣의 설정 파일과 동기화가 됩니다. 파일을 수정한 뒤 상태를 보면 "Republish"라고 뜹니다. 이 때 탭의 오른쪽에 있는 "publish to the server" 아이콘을 클릭해주면 상태가 "synchronized"가 됩니다. 동기화가 완료됐다는 의미입니다. 이 과정까지 해줘야 실제 web.xml 파일을 이용한 URL 매핑 작업이 완료됩니다.

 

그리고 web.xml은 컨테이너가 구동되는 시점에 정보를 가져가기 때문에 수정된 사항을 적용하기 위해서는 컨테이너를 다시 재구동해야합니다.

 

 

 


 

* URL 주소에서 프로젝트명 생략하기

 

위와 같이 URL을 매핑하면 "IP(또는 URL):포트/프로젝트 이름/지정한 URL" 형태로 입력할 경우 해당 서블릿 파일(또는 JSP파일)을 실행시켜 주게 됩니다. 중간에 프로젝트 이름이 들어가는 것이 맘에 들지 않는다면 생략할 수 있도록 지정할 수도 있습니다. 

 

먼저 이클립스의 server 탭에서 톰캣 서버를 더블 클릭해 Modules로 들어갑니다. 그리고 오른쪽의 Edit을 클릭해 Path를 / 로 바꿔줍니다.

 

 

 

 

 

저장한 뒤 이번에는 server.xml 파일을 텍스트 편집기로 엽니다. 그리고 가장 아랫쪽에 있는 Context의 Path 정보가 잘 변경되어 있는지 확인하고 만약 변경돼 있지 않다면 위에서 설정한 것과 같이 슬레쉬(/)만 남기고 지워준 뒤 저장합니다.

 

 

 

톰캣서버를 재구동한 뒤 테스트해보면 아래와 같이 프로젝트명을 생략하고 포트 바로 뒤에 URL을 추가해서 접속할 수 있음을 확인할 수 있습니다. 포트번호를 생략하기 위해서는 http 프로토콜인 80포트나 https 프로토콜인 443포트를 사용하면 되는데 이는 웹서버를 따로 분리해서 사용하게 되면 자연스럽게 해결되기 때문에 다루지 않겠습니다. 테스트할 때 포트도 없애고 싶으면 톰캣의 서비스포트를 80포트로 바꿔주면 됩니다. 이 경우 혹시 컴퓨터에서 이미 80포트가 사용되고 있는 상태라면 해당 서비스를 꺼줘야 합니다.

 

 

 


 

 

[ JSP - URL 매핑 ]

  • 파일 이름을 그대로 URL로 사용하는 방법
  • 서블릿 매핑과 같이 URL 주소로 매핑하는 방법

JSP는 서블릿과 같이  어노테이션을 사용하는 기능이 없어서 web.xml 파일을 통해 매핑해줘야 합니다. 첫번째로는 디폴트 설정대로 파일 이름을 그대로 주소로 사용하는 것입니다. root 폴더는 이클립스 상의 "WebContent" 폴더이기 때문에 폴더 생성 없이 그 아래 바로 JSP 파일을 생성했다면 아래와 같이 바로 파일이름을 URL에 추가해 접속할 수 있습니다. web.xml의 초기 상태에 보면 아래와 같은 코드가 있는데 jsp, jspx 확장자를 가진 URL은 해당 파일을 찾도록 해줍니다.

     <!--The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping> 

 

 

 

만약 폴더를 생성해서 모아뒀다면 아래와 같이 "/폴더명/xx.jsp"으로 입력하면 됩니다.

 

 

 


 

 

두 번째 방법은 서블릿과 같이 URL주소로 매핑해주는 방법입니다. 코드가 약간 다르니 주의해야 합니다. <servlet-class> 대신 <jsp-file> 태그를 사용합니다. 서블릿은 자바 파일이므로 폴더 구조가 아닌 패키지(Package) 구조를 가지고 있습니다. 하지만 JSP는 외부 파일이므로 일반 폴더의 구조를 가지고 있고 패키지 구분의 마침표(.) 대신에 슬레시(/)를 써서 폴더를 구분해주면 됩니다. 기본적인 원리는 같습니다. 

 

	<servlet>
		<servlet-name>home-jsp</servlet-name>
		<jsp-file>/home.jsp</jsp-file>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>home-jsp</servlet-name>
		<url-pattern>/home</url-pattern>
	</servlet-mapping>
	
	<servlet>
		<servlet-name>home2-jsp</servlet-name>
		<jsp-file>/newfolder/home2.jsp</jsp-file>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>home2-jsp</servlet-name>
		<url-pattern>/home2</url-pattern>
	</servlet-mapping>

 

 

 

 


 

 

위의 과정으로 JSP와 서블릿의 URL 1:1 매핑이 완료됐습니다. 하지만 만약 1:1 매핑이 아니라 조금 더 유연하게 사용하고 싶다면 아래와 같은 방식이 추가로 있습니다.

 

 

[  확장자 패턴 ]

 

URL 부분을 "*.확장자" 방식으로 기입하면 해당 확장자를 가진 URL 패턴은 모두 지정된 서블릿 또는 JSP 파일로 이동됩니다. 주로 서블릿을 컨트롤러로 사용할 때 모든 요청을 컨트롤러로 모으기 위해 사용됩니다. 

 

예를 들어 컨트롤러 서블릿에 "@WebServlet("*.do") 형식으로 지정했다면, 해당 확장자를 가진 URL 패턴으로 요청이 들어올 경우 무조건 컨트롤러 서블릿으로 보내주게 됩니다. MVC 패턴에서 주로 이용되는 패턴입니다. M(모델)이나 V(뷰)에서 컨트롤러에게 필요한 작업 요청을 할 때, "작업이름.do" 형태로 호출하면 컨트롤러에게 넘어가는 방식입니다. 이 부분은 해당 내용 때 자세하게 다루도록 하겠습니다. 아래와 같이 지정합니다. web.xml 파일을 이용해도 됩니다.

 

@WebServlet("*.do")
public class FrontController extends HttpServlet

 

 


 

그밖에 MVC 패턴에서 요즘 자주 사용하는 / 로 매핑하는 방법이 있습니다. / 와 /* 의 차이점과 설명은 아래 링크글을 참조 부탁드립니다.

 

728x90
반응형