클래스패스란(Class Path)란??
클래스패스란 말 그대로 클래스를 찾기위한 경로이다. 자바에서 클래스패스의 의미도 똑같다. 즉, JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파일 경로를 말하는 것이다.
소스 코드(.java로 끝나는 파일)를 컴파일하면 소스 코드가 “바이트 코드”(바이너리 형태의 .class 파일)로 변환된다. java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 먼저 이 파일을 찾을 수 있어야 한다. 이때 .class 파일을 찾을 때 classpath에 지정된 경로를 사용한다.
java -cp .:lib/library.jar com.example.Main
- -cp(또는 -classpath) 옵션으로 클래스패스를 지정합니다.
- .: 현재 디렉토리를 클래스패스에 포함.
- lib/library.jar: 추가 라이브러리 JAR 파일을 클래스패스에 포함.
java -cp "lib/*" com.example.MainApplication
java -Dconfig.file=config.yaml com.example.Main
- -Dproperty=value: 시스템 속성을 설정하여 애플리케이션에 전달.
java -jar myapplication.jar
톰캣 5 클래스 로드 순서
- Bootstrap classes of your JVM : Java Runtime Environment (JRE)에 내장된 클래스를 로드 자바 자체의 클래스로더와 최소한의 자바 클래스(java.lang.Object, Class, Classloader)만을 로드한다. + 확장 클래스로더(Extension classloader) - 부트스트랩 클래스로더를 부모로 갖는 클래스로더로써, 확장 자바 클래스들을 로드한다. java.ext.dirs 환경 변수에 설정된 디렉토리의 클래스 파일을 로드하고, 이 값이 설정되어 있지 않은 경우 ${JAVA_HOME}/jre/lib/ext에 있는 클래스 파일을 로드한다.
- System class loader classses (described above) > 클래스패스에 지정된 lib 즉, WEB-INF경로보다 먼저 로드, CLASSPATH 환경변수로 $CATALINA_HOME/bin/catalina.sh or %CATALINA_HOME%\bin\catalina.bat 에서 설정
- /WEB-INF/classes of your web application
- /WEB-INF/lib/*.jar of your web application
- $CATALINA_HOME/common/classes
- $CATALINA_HOME/common/endorsed/*.jar
- $CATALINA_HOME/common/lib/*.jar
- $CATALINA_BASE/shared/classes
- $CATALINA_BASE/shared/lib/*.jar
자바 컴파일 순서
- 개발자가 자바 소스코드(.java)를 작성합니다.
- 자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다.
- 컴파일된 바이트 코드를 JVM의 클래스로더(Class Loader)에게 전달합니다.
- 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올립니다.
- 클래스 로더 세부 동작
- 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.
- 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사합니다.
- 준비 : 클래스가 필요로 하는 메모리를 할당합니다. (필드, 메서드, 인터페이스 등등)
- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다.
- 초기화 : 클래스 변수들을 적절한 값으로 초기화합니다. (static 필드)
- 클래스 로더 세부 동작
- 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 이때, 실행 엔진은 두가지 방식으로 변경합니다.
- 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가집니다.
- JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식입니다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.
1. Tomcat 시작 명령
Tomcat을 실행하기 위해 startup.sh(Linux/Mac) 또는 startup.bat(Windows)을 실행합니다. 이 스크립트 파일은 Tomcat의 bin 디렉토리에 위치하고 있습니다.
C:\path\to\tomcat\bin\startup.bat
./startup.sh
이 명령어는 Java Virtual Machine(JVM)을 시작하고, Tomcat 서버를 초기화합니다.
2. JVM 초기화
Tomcat이 실행되면, **JVM(Java Virtual Machine)**이 초기화됩니다. 이 과정에서는 다음을 수행합니다:
- 클래스패스 설정: CATALINA_HOME, CATALINA_BASE, CLASSPATH 등의 환경 변수에 설정된 경로를 기반으로 필요한 라이브러리와 클래스를 로드합니다.
- JVM 옵션 설정: JAVA_OPTS와 같은 환경 변수로 메모리 크기, GC(Garbage Collection) 설정 등을 조정할 수 있습니다.
3. Catalina 인스턴스 생성
Tomcat은 Catalina라는 핵심 클래스를 통해 서버 초기화를 수행합니다. Catalina는 Tomcat의 엔진 역할을 하는 Servlet 컨테이너입니다. 초기화가 시작되면, Catalina 클래스를 통해 서버가 시작됩니다.
- Catalina 클래스를 통해 Server, Service, Engine, Host, Context 등 Tomcat의 주요 구성 요소들이 초기화됩니다.
4. server.xml 파일 읽기
Tomcat은 conf/server.xml 파일을 읽어 서버의 주요 설정을 로드합니다. server.xml 파일에는 다음과 같은 설정이 포함되어 있습니다:
- <Server>: 전체 서버의 설정을 포함.
- <Service>: 하나 이상의 Connector와 Engine을 포함하여 실제 요청을 처리합니다.
- <Connector>: HTTP, AJP 등 네트워크 연결 설정을 포함합니다.
- <Engine>: 하나 이상의 Host를 관리하고, 애플리케이션을 처리합니다.
- <Host>: 가상 호스트 설정을 관리합니다.
- <Context>: 각 애플리케이션을 관리하는 설정입니다.
Tomcat은 이 설정을 통해 웹 애플리케이션을 어떻게 처리할지 결정합니다.
5. WebAppContext 초기화
Tomcat은 WebAppContext 객체를 통해 배포된 웹 애플리케이션들을 관리합니다. 각 애플리케이션의 web.xml 설정 파일을 읽고, 해당 애플리케이션의 서블릿, 필터, 리스너 등을 초기화합니다.
- web.xml 파일에서 서블릿과 필터를 정의하고, 서블릿 매핑을 설정하여 요청을 어떻게 처리할지 정의합니다.
- Tomcat은 애플리케이션의 web.xml에 정의된 서블릿과 필터를 로드하고, 이들을 ServletContext 객체에 등록합니다.
6. Connector 초기화
Tomcat은 클라이언트의 요청을 처리하기 위해 Connector를 초기화합니다. server.xml에서 정의된 HTTP Connector 또는 AJP Connector를 통해 외부와 연결됩니다.
- HTTP Connector: 클라이언트에서 오는 HTTP 요청을 처리합니다. 기본적으로 8080 포트에서 요청을 받습니다.
- AJP Connector: Apache 웹 서버와 연결할 때 사용됩니다.
Connector는 요청을 받아 Engine에 전달하고, 적절한 Context로 라우팅합니다.
7. ServletContextListener 실행
Tomcat이 웹 애플리케이션을 초기화한 후, ServletContextListener 인터페이스를 구현한 리스너들이 호출됩니다. 이 리스너들은 애플리케이션의 시작과 종료 시 필요한 설정을 처리합니다.
- 애플리케이션의 contextInitialized() 메서드가 호출되어 초기화 작업을 수행합니다.
8. 서블릿 초기화
각 서블릿은 init() 메서드를 호출하여 초기화 작업을 수행합니다. 서블릿은 애플리케이션에서 정의된 요청을 처리할 준비가 되면 service() 메서드를 통해 요청을 처리합니다.
- 서블릿이 초기화되고, 요청을 처리할 준비가 되면, DispatcherServlet (Spring 애플리케이션의 경우) 또는 기본 서블릿이 클라이언트의 요청을 처리하기 위해 대기합니다.
9. 클라이언트 요청 처리 준비 완료
Tomcat은 요청을 처리할 준비가 되었을 때, 클라이언트로부터 들어오는 요청을 기다립니다. 요청은 Connector에 의해 처리되고, 적절한 Host 및 Context로 라우팅됩니다.
- Request Dispatcher는 클라이언트의 요청을 적절한 서블릿으로 전달합니다.
- 서블릿은 요청을 처리하고 응답을 생성하여 클라이언트에게 반환합니다.
https://effectivesquid.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4classpath%EB%9E%80
https://linuxism.ustd.ip.or.kr/611
https://gyoogle.dev/blog/computer-language/Java/%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.html
'WEB개발 > WEB, WAS' 카테고리의 다른 글
Class Loader & Hot Deploy (0) | 2021.09.23 |
---|---|
Jenkins & SVN or Git & Docker (0) | 2021.07.29 |
TheadLocal & MDC & Log4j2 (0) | 2021.07.26 |
WEB.XML Config (context-param, init-param, web-app ... ) (0) | 2021.07.23 |