1. 웹 아키텍처
우리가 사용하는 웹사이트는 크게 아래와 같은 구조에 의해서 작동한다.
간단히 설명하자면 클라이언트가 웹페이지에 요청을 보내면 정적인 페이지는 Web Server에서 처리되고 동적인 페이지는 Web Container에서 처리된다.
동적인 페이지란 페이지 내부에서 DB에 접근을 필요로 하거나 어플리케이션로 실행되어 데이터가 변하는 페이지를 말한다.
WAS를 자바 계열에서는 Web Application Container라고도 한다. 즉, 웹 어플리케이션이 실행할 수 있는 환경을 뜻한다.
WAS와 Web Server에 대한 자세한 비교 및 설명은 아래에 참고한 블로그의 출처를 남겨두겠다.
2. 클래스 로더
클래스 로더란 자바 코드를 작성한 후 컴파일하면 해당 코드는 JVM(Java Virtual Machine)에서 실행 가능한 상태가 된다. 이 때 JVM이 클래스를 실행하기 위해서는 클래스를 로딩하는 과정이 필요하다. 이 역할을 해주는 것이 클래스 로더이다.
여기서는 웹 개발을 Java의 프레임워크인 스프링부트를 이용할 것이기 때문에 WAS가 어떻게 웹 어플리케이션을 인식하고 동작시키는지 알기 위해서는 자바의 클래스 로더의 개념을 알아야 한다.
2.1. 클래스 로더의 특징
클래스 로더의 특징은 다음 네가지 이다.
1. 구조가 계층적이다.
2. 클래스 로딩을 위임할 수 있다.
3. 클래스 로더는 가시적인 규약이 있다.
-> 가시적인 규약이란 클래스를 로딩할 때 가능한 범위를 말한다. 자식 클래스는 클래스 로딩 요청 위임을 통해 부모 클래스 로더가 로딩한 클래스를 알 수 있지만, 부모 클래스 로더는 자식 클래스 로더가 로딩한 클래스를 알 수 없다.
4. 클래스 언로딩이 불가능하다.
-> 클래스 로더로 로딩한 클래스들을 언로딩 할 수 없다. 가비지 콜렉터가 동작하거나 WAS가 재시작할 때 초기화 된다.
2.2. 클래스 로더의 유형
1. Bootstrap Class Loader: JVM 런타임 실행을 위해 기반이 되는 파일들을 로드한다. (rt.jar 파일과 연관이 있다.)
2. Extension Class Loader: 부트스트랩 클래스 로더의 로딩이 끝나면 Extension Class Loader가 자바의 최상위 객체인 Object를 포함한 자바 API를 로드한다. (자바 홈 폴더 하위의 ext 폴더 하위에 있는 JAR파일들과 연관이 있다.)
3. System Class Loader: Extension Class Loader의 로딩이 끝나면 클래스 패스에 포함된 클래스를 시스템 클래스 로더가 로드한다. 사용자는 시스탬 클래스 로더가 로드하는 클래스 패스 영역에만 접근 할 수 있다. 그래서 로컬에서 외부 라이브러리를 실행할 때 클래스 패스를 지정해서 실행하기도 한다.
4. User-Defiend Class Loader: 보통 독립적인 영역이 필요한 WAS의 경우 시스템 클래스 로더 하위에 사용자 정의 로더를 만들어서 사용한다.
3. WAR 파일의 특성
자바를 배포할 때 로컬 실행 프로그램은 JAR로 패키징하고 웹은 WAR로 패키징 한다. WAR는 압축 파일에 자바 관련 규약이 포함된 것이다. WAR패키지는 아래와 같은 구조를 가진다.
Assembly Root는 보통 프로젝트에 따라서 webapp 또는 web과 같은 이름을 가지고 있고 Web Pages에 해당하는 것이 HTML, CSS, Java Script등 정적 자원들을 뜻한다.
lib 하위에 있는 파일들은 JAR형식의 외부 라이브러리가 있고 이 폴더에 있는 JAR 라이브러리들은 User-Defined Class Loader를 통해 클래스 패스에 추가된다.
웹 어플리케이션 클래스 로더는 User-Defined Class Loader에 해당한다. 웹 어플리케이션 컨테이너는 웹 어플리케이션 자체 API를 제공하기 위해 컨테이너를 로드하는 클래스 로더와 사용자가 추가한 JSP나 WAR파일들을 다루기 위한 ServletContext Loader를 사용한다. 컨테이너가 시작되고 콘텍스트가 초기화 되면 서블릿 스펙 권장 사항에 따라 WEB-INF/classes파일을 먼저 검색해서 로딩하고, 그 후에 WEB-INF/libs에 있는 JAR파일들을 로드한다.
WAS를 실행하기 위한 간단한 자바의 구조에 대해서 살펴봤고 다음엔 자바 웹 개발의 근간이 되는 Servlet과 HTML 폼에서 데이터를 주고 받는 법에 대해서 말할 것이다.
Reference:
https://docs.oracle.com/javaee/6/tutorial/doc/bnadx.html
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
댓글