톰캣은 어떻게 WAS로서 동작하는가?
Tomcat 이란?
- 아파치 소프트웨어 재단에서 개발하는 Java 기반의 서블릿 컨테이너이자 웹 애플리케이션 서버이다.
Java Enterprise Edition
표준의 일부만을 지원하기 때문에 완전한 웹 애플리케이션 서버(WAS
)는 아니지만, 편의상 WAS로 분류한다.- 톰캣은 내장되어 있는 웹서버를 이용해 독립적으로도 사용될 수 있고, 다른 웹서버와 함께 사용할 수도 있다.
아파치
는 Nginx 와 함께 웹서버 중 하나의 이름이기도 하다. 톰캣은 영어로 수컷 고양이라는 뜻이다.
Tomcat의 구조
- 톰캣의 요청 처리 흐름은 다음과 같다.
- 클라이언트가 HTTP 요청을 톰캣 서버로 보낸다.
- Coyote 커넥터가 HTTP 요청을 수신하고, Catalina 엔진에 전달한다.
- Catalina는 요청된 URL을 기반으로 어떤 웹 애플리케이션과 서블릿이 해당 요청을 처리할지 결정한다.
- 요청이 JSP 파일이라면, Jasper 엔진이 해당 JSP를 서블릿으로 컴파일하여 처리한다.
- 요청된 서블릿이 실행되어 동적 응답을 생성한다.
- 생성된 응답은 Coyote 커넥터를 통해 클라이언트로 전송된다.
[Catalina]
- 서블릿 컨테이너이다.
- 톰캣의 핵심 엔진으로, 서블릿과 JSP를 실행하는 역할을 한다.
- 클라이언트의 요청을 받고 동적인 웹 콘텐츠를 만들어 제공한다.
- 톰캣은 순수한 Java Http 웹 서버이지만, 카탈리나가 동적 콘텐츠 제공을 위한 실질적인 역할을 담당한다.
[Coyote]
- HTTP 1.1 커넥터로서, 웹 서버 역할을 한다.
- 요청을 엔진에 전달하고, 응답을 클라이언트로 보낸다.
- 아파치와 같은 웹 서버와 연동하는데 사용된다. 이때 코요테가 아파치와 카탈리나 간 중계기 역할을 수행하며, 이외의 요청 처리 방식은 비슷하다.
아파치와 톰캣을 연동할 때에는 주로
AJP(Apache JServ Protocol)
을 사용한다.
[Jasper]
- 톰캣의 JSP 컴파일러(JSP 엔진)다.
- JSP 파일을 서블릿으로 변환하고, 이를 실행하는 역할을 한다.
[서블릿 컨테이너]
- 서블릿은 자바로 작성된 서버 측 애플리케이션 구성 요소로, 클라이언트 요청을 처리하고 응답을 생성한다.
- 서블릿 하나 만으로는 모든 요청을 감당할 수 없기 때문에, 여러 개의 서블릿을 두고 서블릿 컨테이너가 이들의 생명주기를 관리한다.
톰캣 디렉터리 구조
- Tomcat 6.0 에서는
common
과server
가 빠진다.
완전한 WAS가 아닌 이유
- 앞서 설명한
Java Enterprise Edition 표준
은 분산 트랜잭션, 보안, 쓰레드 처리 등의 기능을 처리하는 분산 환경에서 사용되는 미들웨어다. - 이 중 톰캣은 트랜잭션, 보안, 원격 호출, 병행 처리 등을 지원하는
EJb(Enterprise JavaBeans)
의 기능이 빠져서 완전한 WAS라고 부를 수 없는 것이다. - 그럼에도 핵심적인 기능들을 사용하기 때문에 경량 서블릿 컨테이너로서, 웹 애플리케이션의 역할을 수행해내는 것이다.
다른 웹서버와 함께 사용하는 이유
- 객체지향을 공부하다 보면
책임 분리
라는 말을 많이 들어봤을 것이다.
하나의 클래스가 너무 많은 책임을 담당하게 되면 유지보수의 관점에서 매우 안좋은 설계가 되는 것이다. - 톰캣도 마찬가지인데, 톰캣은 동적 콘텐츠를 처리하는데 최적화되어 있지만 정적 콘텐츠의 처리는 상대적으로 느리다.
- DB 커넥션이나 외부 API, 비즈니스 로직 만으로도 많은 자원이 소모되는데 여기에 정적 콘텐츠 요청까지 더해져 과부하가 쉽게 오게 된다.
- 따라서 아파치나 Nginx 같은 웹서버를 두고 정적 콘텐츠 요청은 웹서버가 맡고, 톰캣 서버는 동적 콘텐츠를 위한 비즈니스 로직에만 집중하여 더 높은 성능을 이끌어 낼 수 있다.
이외에도 웹서버의 로드 밸런싱이나 리버스 프록시 같은 기능을 사용하여 확장성과 보안도 챙길 수 있다.
This post is licensed under CC BY 4.0 by the author.