JavaEE Web Application(웹어플리케이션)
JavaEE 스펙을 구현한 WAS에서 웹 어플리케이션이란 무엇일까요?
JavaEE 스펙중 Servlet/JSP 스펙만 구현한 서블릿 컨테이너인 톰캣 기준으로 웹 어플리케이션이란 [톰캣설치경로]\webapps 하위에 위치한 디렉터리 단위를 웹 어플리케이션이라고 합니다.
webapps는 (WebApplications)를 말하며 여러 웹 어플리케이션들을 배포할 수 있는 디렉터리입니다.
하나의 톰캣 서버는 여러 개의 웹 어플리케이션을 배포하여 운영할 수 있습니다.

WAS는 웹 어플리케이션 별로 다른 ServletContext 를 갖게 되고, 각각의 웹 어플리케이션을 설정할 수 있는 설정파일인 web.xml(배포서술자) 를 갖게 됩니다. 당연한 이야기지만 당연히 사용자가 접근했을 때 서로 다른 세션 라이프 사이클을 가지게 됩니다.
웹 어플리케이션을 여러개 배포하는 경우 각각 따로 로그인 기능을 구현해 주어야 한다는 뜻이기도 합니다.



웹어플리케이션 경로 맵핑
이러한 웹 어플리케이션들은 각각의 서블릿 라이프 사이클을 갖게 되고 클라이언트가 접근할 수 있는 독립적인 경로를 갖게 됩니다.
예를 들어 다음과 같이 webapps 하위에 웹어플리케이션이 구성되어 있는 경우 각각 접근 경로는 다음과 같습니다.

C:\tomcat8\webapps\jspTest -> http://localhost:8080/jspTest/
C:\tomcat8\webapps\ROOT -> http://localhost:8080/


이 경우 루트(ROOT) 웹어플리케이션과 jspTest 웹 어플리케이션이 존재한다고 할 수 있습니다.
각각의 웹어플리케이션 하위에 test.jsp 를 작성한 후  접근 하는 경우 경로는 다음과 같습니다.
C:\tomcat8\webapps\jspTest -> http://localhost:8080/jspTest/test.jsp
C:\tomcat8\webapps\ROOT -> http://localhost:8080/test.jsp

재밌는 점은 ROOT 웹어플리케이션은 /ROOT/test.jsp 로 접근하지 않는다는 것입니다.
이유는 ROOT 디렉터리는 특수 디렉터리로서 톰캣이 /ROOT로 URL을 인식하는 것이 아닌 서버주소:8080/ 로 인식하게 됩니다.

이렇게 / 또는 jspTest 등의 웹 어플리케이션 경로를 컨텍스트 경로(Context path) 라고 합니다.
컨텍스트 경로를 구하는 방법은 서블릿 또는 JSP에서 request.getContextPath() 메서드를 이용하여 얻을 수 있습니다.


웹 어플리케이션 구조
servlet 스펙에서 웹 어플리케이션 구조는 대략적으로 다음과 같습니다.
만약 webapps 하위에 jspTest 앱이 있는 경우 jspTest 웹 어플리케이션의 하위 구조는 다음과 같이 구성될 수 있습니다.


JSP, HTML, CSS, 이미지 파일 등..
Servlet 스펙을 구현한 WAS는 다음과 같은 구조를 인식하게 되는데, 먼저 jsp 페이지나 html, javascript, 및 이미지는 컨텍스트 경로 하위에 그대로 두어 직접적인 경로로 접근하게 됩니다.
예를들어 jspTest/xx.html 파일이 있는 경우 서버주소:8080/jspTest/xx.html 로 접근 가능합니다.
그러나 실제로 개발시에는 컨텍스트 경로 바로 하위에 두지 않고 resources 디렉토리 등을 만든 후 정적 자원들을 저장하고, user, board 등의 서비스별 디렉터리를 만들어 각각의 적당한 자원들을 배포합니다.
그렇게 되면 서버주소:8080/jspTest/board/list.jsp 등과 같이 접근할 수 있을것입니다.

web.xml
WEB-INF 디렉터리의 경우에는 외부에서 클라이언트가 접근할 수 없도록 WAS에서 보호하는 디렉터리입니다.
WEB-INF 하위의 web.xml 은 배포서술자라고 하는데 이는 WAS가 인식하는 각각의 웹어플리케이션 설정 파일입니다.

lib
또한 lib 디렉터리의 경우 어플리케이션이 운영되는데 필요한 라이브러리들이 배포되는 디렉터리 경로입니다.

Servlet, JavaBean, 일반 클래스 파일
그리고 jsp와 정적 자원을 제외한 자바 클래스 파일들(.class)이 저장되는 경로는 WEB-INF/classes 하위 입니다.
쉽게 설명하자면 classes 하위부터는 우리가 개발하는 프로젝트 패키지 경로와 동일합니다.
만약 이클립스로 개발한 src/main/java/com.test.board/ListController.java 서블릿 파일이 있다면, 배포시에 컴파일된 서블릿 파일은 웹어플리케이션\WEB-INF\classes\com\test\board\ListController.class 로 배포될 것입니다.

앞에서 말했든 WEB-INF 하위는 외부에서 접근 불가능한 자원이기 때문에 서블릿또한 web.xml을 통해 경로를 직접 맵핑시켜 주어야 합니다.

여러개의 웹 어플리케이션 배포
웹 어플리케이션이 여러개인 경우 다음과 같이 구성될 것입니다.




경로가 겹치는 경우
만약 서로 웹어플리케이션이 경로가 겹치는 경우에는 어떻게 될까요?
appTest.jsp 페이지가 다음과 같이 배포된 경우 접근 경로가 겹치게 됩니다.

C:\tomcat8\webapps\jspTest\appTest.jsp -> http://localhost:8080/jspTest/appTest.jsp
C:\tomcat8\webapps\ROOT\jspTest\appTest.jsp -> http://localhost:8080/jspTest/appTest.jsp

이런 경우에는 첫번째인 jspTest 웹어플리케이션의 appTest.jsp 에 접근됩니다.

톰캣이 경로를 맵핑하는 기준은 다음과 같습니다.
1. 서버 주소 / 이후에 오는 경로와 일치하는 웹 어플리케이션이 존재하는 경우 해당 어플리케이션의 경로로 맵핑합니다.
2. 만약 컨텍스트 경로에 일치하는 웹 어플리케이션이 존재하지 않는 경우 ROOT 웹 어플리케이션 경로로 맵핑합니다.


웹어플리케이션을 분리하는 경우
웹 어플리케이션을 분리하여 여러개 배포하는 경우는 서버는 같으면서 독립된 환경을 구성하는 경우입니다.
가장 단순하게 사용자가 접근하는 환경 localhost:8080/user/~~~ 와 관리자 환경 localhost:8080/admin 으로 분리할 수 있습니다.
물론 하나의 웹 어플리케이션 하위에 user와 admin 으로 디렉터리를 구분하여 개발할 수도 있지만 분리하는 경우 웹 모듈들이 서로 독립된 환경에서 다른 라이프사이클을 가진다는 장점이 있습니다.

더욱 환경을 독립시키고 싶은 경우 한 서버 장비(pc)에 두 개의 톰캣 서버를 두 개 띄우는 방법도 가능하며 이경우 톰캣들의 포트가 서로 달라야 한다는 점이 있고, 관리자 서버와 유저서버 별로 아예 각각 다른 pc에 구성할 수도 있습니다.더 자세한 것은 이글의 취지에 어긋나므로 논외로 하겠습니다.
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!