클래스 로더와 WAR
- Category :
- spring
웹 애플리케이션 컨테이너
웹 애플리케이션이 배포되는 공간을 뜻한다. 웹 서버 : HTML 과 같은 정적 파일들을 전달 웹 애플리케이션 서버(WAS) : JSP 같은 언어들을 사용해서 동적인 페이지들을 생성
클래스 로더
WAS가 어떻게 웹 애플리케이션을 인식하고 동작시키는지 알기 위해서는 클래스 로더를 알아야 한다. 클래스 로더란 자바 클래스를 자바 가상 머신으로 동적 로드하는 자바 런타임 환경의 일부이다. JVM이 클래스를 실행하기 위해서는 클래스를 로딩하는 과정이 필요하며 그 과정을 수행해 주는 것이다.
JVM (자바 가상 머신) : 자바 바이트 코드와 컴퓨터의 운영 시스템 간의 번역기 역할을 하는 것으로 기존의 운영체제에 상관없이 자바를 실행시킬 수 있도록 도와주는 프로그램
클래스 로더의 특징
- 구조가 계층적이다. 상위 클래스 로더에서 하위 클래스 로더를 갖는 방식(최상위 클래스 로더는 부트스트랩 클래스 로더)
- 클래스 로딩을 위임할 수 있다.
- 클래스 로더는 가시적인 규약(클래스를 로딩할 때 가능한 범위)이 있다. 자식 클래스 로더는 클래스 로딩 요청 위임을 통해 부모 클래스 로더가 로딩한 클래스를 찾을 수 있지만, 부모 클래스는 자식 클래스 로더가 로딩한 클래스를 알 수 없다.
- 클래스 언로딩 불가능하다. 클래스 로더가 로딩한 클래스를 언로딩할 수 없으므로 가비지 컬렉터가 동작하거나 WAS가 재시작할 때 초기화 된다.
가비지 컬렉터 : 더 이상 사용하지 않는 메모리를 찾아서 해제하는 것(가비지 컬렉션), 메모리가 부족할 때 쓰레기를 정리해주는 프로그램
클래스 로더의 유형
- 부트 스트랩 클래스 로더 : JVM 런타임 실행을 위해 기반이 되는 파일들을 로드
- 확장 클래스 로더 : 자바의 최상위 객체인 Object를 포함한 자바 API 로드
- 시스템 클래스 로더 : 클래스 패스에 포함된 클래스들을 로드
- 사용자 정의 클래스 로더
웹 애플리케이션 클래스 로더는 클래스 로더의 유형 중 시스템 클래스 로더 하위에 사용자가 정의한 클래스 로더에 해당한다.
웹 애플리케이션 컨테이너는 웹 애플리케이션 자체 API 를 제공하기 위해 컨테이너를 로드하는 클래스 로더와 사용자가 추가한 JSP나 WAR 파일들을 다루기 위한 ServletContext Loader를 사용한다.
WAR 파일의 특성
배포할 때 로컬 실행 프로그램은 JAR로 패키징하고 웹은 WAR로 패키징 한다. WAR는 압축파일에 자바 관련 규약이 포함된 것이다(WEB-INF폴더). WAS는 WAR파일의 WEB-INF 폴더를 기준으로 클래스 파일들을 로드한다.
WAR : 웹 개발 시에 결과물이 되는 형식 파일