Post

톰캣은 어떻게 WAS로서 동작하는가?

Tomcat 이란?

tomcat

  • 아파치 소프트웨어 재단에서 개발하는 Java 기반의 서블릿 컨테이너이자 웹 애플리케이션 서버이다.
  • Java Enterprise Edition 표준의 일부만을 지원하기 때문에 완전한 웹 애플리케이션 서버(WAS)는 아니지만, 편의상 WAS로 분류한다.
  • 톰캣은 내장되어 있는 웹서버를 이용해 독립적으로도 사용될 수 있고, 다른 웹서버와 함께 사용할 수도 있다.

    아파치는 Nginx 와 함께 웹서버 중 하나의 이름이기도 하다. 톰캣은 영어로 수컷 고양이라는 뜻이다.


Tomcat의 구조

  • 톰캣의 요청 처리 흐름은 다음과 같다.
    1. 클라이언트가 HTTP 요청을 톰캣 서버로 보낸다.
    2. Coyote 커넥터가 HTTP 요청을 수신하고, Catalina 엔진에 전달한다.
    3. Catalina는 요청된 URL을 기반으로 어떤 웹 애플리케이션과 서블릿이 해당 요청을 처리할지 결정한다.
    4. 요청이 JSP 파일이라면, Jasper 엔진이 해당 JSP를 서블릿으로 컴파일하여 처리한다.
    5. 요청된 서블릿이 실행되어 동적 응답을 생성한다.
    6. 생성된 응답은 Coyote 커넥터를 통해 클라이언트로 전송된다.

tomcat server tomcat server2

[Catalina]

  • 서블릿 컨테이너이다.
  • 톰캣의 핵심 엔진으로, 서블릿과 JSP를 실행하는 역할을 한다.
  • 클라이언트의 요청을 받고 동적인 웹 콘텐츠를 만들어 제공한다.
  • 톰캣은 순수한 Java Http 웹 서버이지만, 카탈리나가 동적 콘텐츠 제공을 위한 실질적인 역할을 담당한다.

[Coyote]

  • HTTP 1.1 커넥터로서, 웹 서버 역할을 한다.
  • 요청을 엔진에 전달하고, 응답을 클라이언트로 보낸다.
  • 아파치와 같은 웹 서버와 연동하는데 사용된다. 이때 코요테가 아파치와 카탈리나 간 중계기 역할을 수행하며, 이외의 요청 처리 방식은 비슷하다.

    아파치와 톰캣을 연동할 때에는 주로 AJP(Apache JServ Protocol) 을 사용한다.

    AJP

[Jasper]

  • 톰캣의 JSP 컴파일러(JSP 엔진)다.
  • JSP 파일을 서블릿으로 변환하고, 이를 실행하는 역할을 한다.

[서블릿 컨테이너]

  • 서블릿은 자바로 작성된 서버 측 애플리케이션 구성 요소로, 클라이언트 요청을 처리하고 응답을 생성한다.
  • 서블릿 하나 만으로는 모든 요청을 감당할 수 없기 때문에, 여러 개의 서블릿을 두고 서블릿 컨테이너가 이들의 생명주기를 관리한다.


톰캣 디렉터리 구조

directory1

  • Tomcat 6.0 에서는 commonserver가 빠진다.

directory2


완전한 WAS가 아닌 이유

  • 앞서 설명한 Java Enterprise Edition 표준은 분산 트랜잭션, 보안, 쓰레드 처리 등의 기능을 처리하는 분산 환경에서 사용되는 미들웨어다.
  • 이 중 톰캣은 트랜잭션, 보안, 원격 호출, 병행 처리 등을 지원하는 EJb(Enterprise JavaBeans)의 기능이 빠져서 완전한 WAS라고 부를 수 없는 것이다.
  • 그럼에도 핵심적인 기능들을 사용하기 때문에 경량 서블릿 컨테이너로서, 웹 애플리케이션의 역할을 수행해내는 것이다.


다른 웹서버와 함께 사용하는 이유

  • 객체지향을 공부하다 보면 책임 분리라는 말을 많이 들어봤을 것이다.
    하나의 클래스가 너무 많은 책임을 담당하게 되면 유지보수의 관점에서 매우 안좋은 설계가 되는 것이다.
  • 톰캣도 마찬가지인데, 톰캣은 동적 콘텐츠를 처리하는데 최적화되어 있지만 정적 콘텐츠의 처리는 상대적으로 느리다.
  • DB 커넥션이나 외부 API, 비즈니스 로직 만으로도 많은 자원이 소모되는데 여기에 정적 콘텐츠 요청까지 더해져 과부하가 쉽게 오게 된다.
  • 따라서 아파치Nginx 같은 웹서버를 두고 정적 콘텐츠 요청은 웹서버가 맡고, 톰캣 서버는 동적 콘텐츠를 위한 비즈니스 로직에만 집중하여 더 높은 성능을 이끌어 낼 수 있다.
    이외에도 웹서버의 로드 밸런싱이나 리버스 프록시 같은 기능을 사용하여 확장성과 보안도 챙길 수 있다.
This post is licensed under CC BY 4.0 by the author.