[JSP] 4.3 어플리케이션의 폴더 구조

2022. 4. 7. 21:30JAVA/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 &quot;%r&quot; %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 &quot;%r&quot; %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