이 글을 정리했던 핵심적인 이유는 순수 POJO 프로세스로도 Socket을 통해 외부 통신이 가능한데, 사람들은 왜 Tomcat을 개발했을까? 에 대한 궁금증에 있었다.
1. 톰캣을 사용하는 이유: 일반 Java 프로세스와의 차이점
일반적인 Java 애플리케이션으로도 HTTP 서버를 구현할 수 있다.
하지만 Tomcat을 사용하는 주된 이유는 Java Servlet과 JSP 표준을 지원하는 기능에 있다.
주요 차이점과 Tomcat의 장점
- Java Servlet 및 JSP 지원:
- Tomcat은 Java 기반의 웹 애플리케이션을 쉽게 구축하고 관리하기 위한 표준인 Servlet API와 JSP(JavaServer Pages)를 지원한다. 이는 HTTP 요청과 응답을 처리하고, 동적 웹 페이지를 생성하기 위한 기능을 쉽게 구현할 수 있게 한다.
- 웹 애플리케이션 관리:
- 여러 웹 애플리케이션을 하나의 서버에서 관리할 수 있도록 하고, 각 애플리케이션 간의 독립성을 보장하여 충돌을 방지한다.
- 표준화된 환경 제공:
- HTTP 요청/응답 처리, 세션 관리 등의 기능을 표준화된 방식으로 제공하여 직접 개발해야 하는 부담을 덜어준다.
결국, Tomcat은 일반적인 Java 프로세스를 확장하여 웹 애플리케이션 개발에 필요한 필수 기능들을 표준적으로 제공하는 환경을 구축하는 데 목적이 있다.
2. Tomcat의 내부 구조와 기능
Tomcat은 JVM 위에서 구동되며, Java의 확장 형태로 동작한다. 내부적으로 여러 구성 요소가 웹 애플리케이션의 동작을 돕는다.
Tomcat의 주요 구성 요소
- Catalina: 서블릿 컨테이너로서 HTTP 요청을 처리하고 서블릿을 관리한다.
- Coyote: HTTP 커넥터로, 클라이언트로부터 요청을 수신하고 응답을 반환하는 역할을 한다.
- Jasper: JSP 컴파일러로 JSP 파일을 서블릿으로 변환하여 실행한다.
- Cluster: 여러 Tomcat 인스턴스를 관리하고 부하 분산 및 세션 복제를 지원한다.
3. Tomcat의 패키징 방식
Tomcat은 일반적으로 .jar 파일이 아닌 디렉토리 구조로 패키징되어 있다. 이는 catalina.sh와 같은 스크립트를 통해 실행되며 JVM을 사용하여 서버를 구동하는 방식이다. 일반 Java 애플리케이션을 .jar 파일로 패키징하는 것과는 다르다.
Tomcat 디렉토리 구조
- bin/: 실행 스크립트(catalina.sh, startup.sh 등)
- conf/: 설정 파일 (server.xml, web.xml 등)
- lib/: Tomcat 라이브러리 JAR 파일
- webapps/: 배포되는 웹 애플리케이션 디렉토리
- work/: 컴파일된 JSP 파일을 위한 작업 디렉토리
4. Tomcat의 실행 과정 (./startup.sh 실행 시)
- 환경 변수 설정: startup.sh는 catalina.sh를 호출하여 Tomcat의 실행 환경을 설정한다 (JAVA_HOME, CATALINA_HOME 등).
- 명령어 분석 및 서버 시작: catalina.sh는 start 명령을 분석하고, JVM 옵션을 설정한다.
- 클래스 로더 초기화: common, server, shared 클래스 로더들이 초기화되며, lib/ 디렉토리의 JAR 파일을 로드한다.
- 서버 설정 초기화: conf/server.xml 파일을 읽어 서버 설정을 초기화한다.
- 웹 애플리케이션 배포: webapps/ 디렉토리에서 웹 애플리케이션을 검색하여 배포한다.
- 서버 시작 준비 완료: 모든 초기화가 완료되면 HTTP 요청을 수신할 준비를 하며 지정된 포트(기본 8080)에서 대기한다.
결론
Tomcat은 단순한 Java 웹 서버 이상의 기능을 제공하며, 표준화된 API를 통해 웹 애플리케이션을 쉽게 개발하고 관리할 수 있도록 돕는다. Tomcat을 통해 개발자는 직접 HTTP 요청/응답 처리나 세션 관리를 구현할 필요 없이, 이를 위한 표준화된 솔루션을 활용할 수 있다. 이러한 이유로 Tomcat은 Java 기반 웹 애플리케이션 개발의 사실상 표준이 되었다.
'CS study > 기타 토막지식' 카테고리의 다른 글
gradle heap 초과 시 해결 방법 (Expiring Daemon because JVM heap space is exhausted) (24.05.21) (0) | 2024.10.01 |
---|---|
Record Pattern (24.05.03) (0) | 2024.09.26 |
InteliJ lombok 인식 불가(Cannot resolve symbol 'info', Cannot Find log) (0) | 2024.04.06 |
[JIRA] 지라에 대해 (About Jira) (2) | 2023.12.05 |
[GIT] 대용량 파일을 점진적으로 받아올 때. (--depth) (0) | 2023.11.23 |