2022. 4. 7. 21:30ㆍJAVA/Servlet&JSP
Servlet/JSP로 구성된 웹 어플리케이션의 폴더 구조
위의 그림에서 '웹 어플리케이션' 폴더는 웹 어플리케이션이 위치하는 폴더입니다. 톰캣의 webapps 폴더 안에 있는 Chapter04, ROOT 등의 폴더가 웹 어플리케이션 폴더에 해당됩니다. 웹 어플리케이션 폴더는 다음과 같은 하위 폴더들을 포함합니다.
- WEB-INF/ - 웹 어플리케이션을 실행하는데 필요한 클래스 파일 및 설정 파일 등이 저장되는 폴더
- WEB-INF/web.xml 파일 - 웹 어플리케이션에 대한 전반적인 설정 정보를 저장하고 있는 파일
- WEB-INF/classes - 웹 어플리케이션에서 사용하는 클래스 파일 위치
- WEB-INF/lib - 웹 어플리케이션에서 사용하는 Jar 파일 위치
- WEB-INF/tId - 태그 라이브러리 관련 설정 파일은 보통 tid 폴더에 저장
WEB-INF 폴더와 그 하위 폴더를 제외한 나머지 폴더에는 웹 어플리케이션에서 사용할 JSP, HTML 등의 파일이 저장됩니다.
1. 웹 어플리케이션 폴더와 URL과의 관계
JSP나 서블릿에서 하나의 웹 어플리케이션은 하나의 폴더에 매핑됩니다. 예를 들어 webapps 폴더 아래에 Chapter01, Chapter02와 같은 폴더를 생성하였다. 이때, 이 각각의 하위 폴더의 구조는 위에서 본 폴더 구조를 갖고 있다는 것을 알 수 있다.
톰캣에서 웹 어플리케이션이 위치하는 폴더는 [톰캣]/webapps이다. [톰캣]/webapps 폴더에 있는 하위 폴더들(Chapter01, Chapter02, ...)은 앞에서 설명한 폴더 구조를 갖고 있을 경우 자동으로 웹 어플리케이션에 포함된다. 각 폴더의 이름은 웹 어플리케이션을 실행할 때 사용되는 URL과 관려이 있다. 예를 들어 4장의 예제들은 webapps/Chapter04 폴더에 위치하는데, 이때 이 Chapter04 폴더의 이름과 웹 어플리케이션을 사용할때 호출하는 URL 관계는 다음과 같다.
http://localhost:8080/Chapter04/02_autoFlushTrue.jsp
위의 주소를 보면 URL 경로가 /Chapter04로 경로가 시작하는데, 이 이름은 웹 어플리케이션 폴더의 이름과 같은 것을 알 수 있습니다. 여기서 웹 어플리케이션의 이름은 "/Chapter04"가 됩니다.
웹 어플리케이션 폴더에 해당하지 않는 URL을 요청하게 되면 기본적으로 ROOT 웹 어플리케이션 폴더를 사용하게 됩니다. 예를 들어, http://localhost:8080/view/loginForm.jsp라는 URL을 입력했다고 가정해보자. 이때 /view라는 이름의 웹 어플리케이션이 존재하지 않으면(weapps/view 폴더가 존재하지 않으면), ROOT 웹 어플리케이션의 view/loginForm.jsp, 즉 webapps/ROOT/view/loginForm.jsp을 실행하게 됩니다.
request 기본 객체는 웹 어플리케이션의 경로를 알려주는 메서드를 제공합니다.
request.getContextPath()
위 메서드를 사용하면 현재 JSP 페이지와 서블릿이 포함되어 있는 웹 어플리케이션의 경로를 읽어올 수 있습니다.
03_contextPath.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
웹 어플리케이션 콘텍스트 경로:"<%= request.getContextPath() %>"
</body>
</html>
저 같은 경우 이클립스 프로젝트에서가 아닌 아파치 톰캣 폴더/webapps/Chapter04/ 폴더 하위에 03_contextPath.jsp를 복사 붙여넣고 실행을 하였습니다. 결과는 다음과 같습니다.
위의 실행결과처럼 03_contextPath.jsp의 위치가 /Chapter04 웹 어플리케이션 폴더에 위치했기 때문에 ContextPath가 /Chapter04로 나오게 됩니다.
반면에 webapps/ROOT 폴더에 03_contextPath.jsp를 복사한후 http://localhost:8080/03_contextPath.jsp를 실행한 결과는 다음과 같습니다.
위 수행결과처럼 03_contextPath.jsp의 위치가 ROOT 웹 어플리케이션 폴더에 있기 때문에 빈 문자열("")이 출력되는 것을 확인할 수 있습니다.
정리하며
웹 어플리케이션이란 /webapps/ 폴더에 있는 하위 폴더들을 의미하며 이 웹 어플리케이션 폴더의 이름은 URL 경로에 들어가 클라이언트로부터 웹 서버가 경로를 입력받으면 웹 어플리케이션의 URL 경로를 활용하여 원하는 Servlet이나 jsp 파일을 탐색하는데 사용됩니다.
2. server.xml 파일과 웹 어플리케이션 폴더의 설정
톰캣에서 웹 어플리케이션의 폴더를 추가하는 방법
- webapps/ 폴더의 하위 폴더로 웹 어플리케이션 추가하기
- server.xml 파일에 직접 설정 정보 추가하기
[톰캣]/config/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
위 파일은 아파치 톰캣 폴더/conf/server.xml 파일 내용 중 일부입니다. 이중에서 주목할 부분은 다음과 같습니다.
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
위 코드에서 <Host> 태그는 웹 어플리케이션이 포함되는 서버에 관한 정보를 지정합니다. <Host> 태그의 appBase 속성은 웹 어플리케이션 폴더가 위치할 기본 폴더를 지정하는데 그값이 "webapps"인 것을 알 수 있습니다. ("webapps"는 apache-tomcat-9.0.56 폴더의 상대 경로입니다.) 이 <Host> 태그에 웹 어플리케이션과 관련된 설정 정보를 추가하면 새로운 웹 어플리케이션을 추가할 수 있습니다.
예를 들어 이클립스에서 프로젝트를 생성하고 아파치 톰캣 서버와 연결하게 되면 Context 태그가 생성된 것을 알 수 있습니다. 다음 코드는 이클립스 프로젝트에서 아파치 톰캣 서버를 연결한 server.xml 파일의 내용 중 일부입니다.
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<Context docBase="jsp2" path="/jsp2" reloadable="true" source="org.eclipse.jst.jee.server:jsp2"/></Host>
</Engine>
</Service>
</Server>
위 코드 내용은 주목할 부분은 아래와 같습니다.
<Context docBase="jsp2" path="/jsp2" reloadable="true" source="org.eclipse.jst.jee.server:jsp2"/></Host>
위 코드처럼 <Context> 태그를 추가하여 웹 어플리케이션 이름과 위치 경로를 webapps 폴더에 국한되지 않고 다른 곳에 설정할 수 있습니다.
<Context> 태그의 두 속성은 다음과 같은 의미를 갖습니다.
- path - 웹 애플리케이션의 경로명, request.getContextPath() 메소드의 결과값이 이 속성의 값과 동일합니다.
- docBase - 웹 어플리케이션이 위치한 폴더의 경로명. 위의 코드에서는 jsp2가 프로젝트 명인데 상대적인 경로에 있기 때문에 jsp2로 되어 있는 것입니다.
이클립스로 생성한 프로젝트를 수행하면 다음과 같은 결과를 볼 수 있습니다.
위의 결과처럼 웹 어플리케이션 이름이 jsp2(프로젝트 이름이기도 함)인 것을 확인할 수 있습니다.
3. 웹 어플리케이션 폴더 내에서의 하위 폴더 사용
웹 어플리케이션 폴더 아래에 하위 폴더를 생성하여 JSP페이지의 기능별로 분류할 수 있습니다. 예를 들어 웹 어플리케이션이 게시판과 회원 관련 기능으로 구성된다고 가정합니다.
jsp2 => 어플리케이션 폴더
- webapps
- Chapter04
- board
- member
- WEB-INF
References
source code : https://github.com/yonghwankim-dev/JSP2.0/tree/master/jsp2/src/main/webapp/Chapter04
JSP 2.0 프로그래밍 기초부터 중급까지
'JAVA > Servlet&JSP' 카테고리의 다른 글
[JSP] 5.2 기본 객체: out (0) | 2022.04.07 |
---|---|
[JSP] 5.1 기본 객체 (0) | 2022.04.07 |
[JSP] 4.2 출력 버퍼 (0) | 2022.04.07 |
[JSP] 4.1 JSP(Java Server Pages)의 처리 과정 (0) | 2022.04.07 |
[JSP] 2.6 JSP 기본 객체 : response (0) | 2022.04.07 |