박매일 님의 스프1탄 강의를 들으며 게시판을 만들고 있다. JSP 페이지에서 다음과 같이 ContextPath
변수에 컨텍스트패스 경로를 동적으로 할당하는 방법을 배웠다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
이렇게 <c:set>
을 이용하면 추후에 경로가 변경되어도 코드를 수정하지 않아도 된다는 장점이 있다.
웹 애플리케이션은 $CATALINA_HOME\webapps
아래에 배치되며, 여기서 $CATALINA_HOME
은 톰캣의 설치 디렉터리이다.
컨텍스트 패스는 서버의 주소를 기준으로 하며 애플리케이션의 이름이기도 하다. 톰캣은 애플리케이션 이름(컨텍스트 패스)으로 자신이 실행할 애플리케이션을 구분한다.
톰캣은 기본적으로 WAR 파일의 이름을 컨텍스트 패스로 사용한다. 만약 파일의 이름이 ExampleApp.war
라면 http://localhost:8080/ExampleApp
로 접근할 수 있고 여기서 컨텍스트 패스는 /ExampleApp
이다.
컨텍스트 패스는 변경 가능하며, 보통 server.xml
에서 변경한다. 이 XML 파일은 $CATALINA_HOME\conf
에 위치한다.
인텔리제이 IDE를 이용하면 서버 설정(Run - Edit Configurations...
)에서 쉽게 변경할 수 있다.
컨텍스트 패스 이름을 변경하더라도 WAR 파일의 이름은 변경되지 않는다.
자세한 사항은 톰캣 공식 문서 참조(링크).
위와 같이 Application Context
를 설정한 경우 ContextPath
는 /controller
가 된다.
<li><a href="${contextPath}/">Home</a></li>
<li><a href="${contextPath}/memLoginForm.do">로그인</a></li>
위 코드는 네비게이션 바의 일부이다.
버튼을 클릭했을 때 실행되는 요청 URL은 다음과 같다 :
Home
버튼 => http://localhost:8088/controller/
로그인
버튼 => http://localhost:8088/controller/memLoginForm.do
<img src="${contextPath}/resources/">
위와 같이 파일의 경로에서도 컨텍스트 패스를 사용할 수 있다.
배포시 WAR 파일의 위치는 톰캣 인스턴스의 $CATALINA_HOME\webapps
이다. 따라서 애플리케이션 이름이 controller
라면 ${contextPath}
는 $CATALINA_HOME\webapps\controller
가 된다.
아파치 톰캣은 자바에서 가장 인기있는 서버 중 하나이다. WAR 방식을 통해 웹 애플리케이션을 제공하는 서블릿 컨테이너로서 사용된다.
WAR이란 Web Archive의 줄임말이다. 계층형 디렉토리 구조로 된 웹 애플리케이션을 ZIP 포맷으로 패키징하는 파일의 확장자이다. 자바 웹 애플리케이션은 배포를 위해 일반적으로 WAR 파일로 패키징된다.
WAR 파일을 배포하면 톰캣은 파일의 압축을 풀고 webapp
디렉토리에 프로젝트 이름(컨텍스트 패스)을 딴 디렉토리를 만들고 거기에 모든 프로젝트 파일을 저장한다.
.
├── ROOT
├── controller
│ ├── META-INF
│ ├── WEB-INF
│ │ ├── classes
│ │ │ └── kr
│ │ │ └── board
│ │ │ ├── controller
│ │ │ ├── entity
│ │ │ └── mapper
│ │ ├── lib
│ │ ├── spring
│ │ │ └── appServlet
│ │ └── views
│ │ ├── board
│ │ ├── common
│ │ └── member
│ └── resources
│ └── images
애플리케이션 이름(컨텍스트 패스)을 /controller
로 지정했다면 webapp
디렉토리 내에 controller
디렉토리가 생성된다.
만약 컨텍스트 패스가 /
라면 ROOT
디렉토리 내에 프로젝트 파일이 위치한다.