톰캣은 자바 서블릿 컨테이너입니다. 웹서버처럼 동작하는 원리에 의해 프로그래머가 프로그래밍한 자바 서블릿과 자바 기반 웹기술을 서비스하는 서버의 일종이죠. 서비스 제공자는 톰캣을 설치하고 설정해서 서버 환경을 만들어주고, 자바 서블릿과 JSP와 같은 자바 웹기술로 만든 스크립트를 포함해서 (컨테이너) 이를 접속자에게 서비스하는 서버 소프트웨어입니다.
자바 웹기술을 서비스할때는 여러 프로토콜로 작동하지만, HTTP를 기반으로 해서 작동하는 것이 일반입니다. 사용자가 웹브라우저로 HTTP request를 보내면, 톰캣의 각 부분마다의 구성 요소가 이를 순차적으로 처리해서 단계별로 request와 response를 반복하면서 최종적으로 사용자의 웹브라우저에 동적인 표시를 하게 되는 원리입니다. 이로부터 게시판도 작동하고, 쇼핑몰의 쿼리 결과도 조회되는 것이죠.
그래서 중요한 기본 지식 중의 하나가, 톰캣이 어떻게 어떤 단계를 거쳐 사용자의 동적인 요청을 처리해서 표시하느냐인데요. 단계적으로 처리되는 각각의 파이프라인은 톰캣의 구성 요소에 의해 결정이 된다고 되어 있습니다.
우선 Server→Service→Engine→Host→Context로 구별됩니다. 각각의 단계는 커넥터로 통신하게 됩니다. (오른쪽으로 갈수록 좁은 개념)
서버는 유일하게 하나만 존재하는 엔티티구요. 전체 컨테이너라고 합니다. 톰캣 서버를 버전별로 여러개 운용하는게 아니라면, 그리고 데몬이나 윈도우 서비스를 여러개 분리해서 운용하는게 아니라면, 한 톰캣 서버는 유일합니다. 분리해서 운용할 경우에는 JVM이 별도로 운용되어 하나가 크래쉬되도 쓰임이 중단이 안되게 할 수 있습니다. 여러 리소스를 총괄해서 여러 서비스를 돌립니다.
서비스는 request를 승인하고, 적절한 자바 웹앱에 라우팅하고, request한 결과값을 반환하는 것을 총괄지휘합니다. 하나 이상의 커넥터와 엔진을 묶어 처리합니다.
커넥터는 톰캣의 진입로와 통로로서 HTTP request를 받아들이고 각 단계로 전달하는 역할을 합니다.
엔진은 Catalina 엔진과 Jasper 엔진으로 나누어지구요. Catalina 엔진에 서블릿과 JSP를 처리하는 엔진으로 Servlet 처리 엔진으로 불리웁니다. Catalina는 Jasper 엔진과 상호 작용을 해서 처리를 합니다. Jasper 엔진은 JSP 컴파일을 수행하고, Catalina가 처리할 자바 바이트코드를 Catalina에 전달하는 역할을 하죠. Catalina와 Jasper와 같은 닉네임은 설정 파일 이해나 오류 메시지 이해에도 도움을 주므로 알아두면 좋습니다. 엔진에는 여러개의 호스트가 포함될 수 있습니다.
호스트는 한대의 서버에 여러개의 웹사이트를 나누어 서비스하듯이 호스트네임으로 구별해서 서비스하는 개념입니다. 한대의 톰캣 서버에는 여러개의 호스트가 존재할 수 있습니다. 상위 단계인 엔진에서 HTTP 헤더를 조사하여 특정 도메인이나 IP로 요청된 것을 웹어플리케이션으로 라우팅합니다. 호스트에는 여러 컨텍스트가 존재해서 개별 웹어플리케이션으로 작동하는데, 이 작동을 호스트에서 처리합니다.
컨텍스트는 각각의 하나의 독립된 웹앱을 말합니다. 컨텍스트의 구성 방식은 톰캣 설정 파일에서 Context 태그로 구성하는 방식으로, path로 접근되며, docBase와 같은 파일들의 저장 경로에 의해 지정이 됩니다. 한 호스트에는 여러 컨텍스트가 존재할 수 있습니다.
이들의 분리와 종합을 심화하면 톰캣 운용시 해야 하는 설정 파일들 (conf/server.xml 이나 web.xml) 의 설정에도 인사이트를 주며, 운용시 있게 되는 오류 이해에도 인사이트를 줍니다.
알기 쉽게 구성한 문체는 아닌데, 정보력은 있는듯하여 올립니다.
참고로 위 구성 요소 단계의 통신은 양방향입니다.