웹 어플리케이션 서버
웹은 HTTP 기반으로 통신한다. 클라이언트에서 서버로 데이터를 전송할 때, 서버에서 클라이언트로 데이터를 응답할 때 모두 HTTP 프로토콜 기반으로 동작한다.
웹 서버
- HTTP 기반으로 동작
- 정적 리소스 제공, 기타 부가기능
- 정적인 파일을 제공하므로 HTML 을 특정 사용자마다 다르게 보여줄 수 있음
- 정적 HTML, CSS, JS, 이미지, 영상
- 웹 서버에서 요청에 알맞은 파일을 반환하며, 항상 동일한 페이지를 반환
- 예) NGINX, APACHE
웹 애플리케이션 서버(WAS)
- HTTP 기반으로 동작
- 웹 서버 기능 포함 (정적 리소스 제공 가능)
- 프로그램 코드를 실행해서 애플리케이션 로직 수행
- 동적 HTML, HTTP API(JSON)
- 사용자에 따라서 다른 화면들을 보여줄 수 있다.
- 들어온 요청에 맞게 동적으로 만들어진 컨텐츠로 데이터베이스, 서버 내 로직 등을 활용해 만들어진 컨텐츠를 반환
- 서블릿, 스프링 MVC가 WAS에서 동작
- Tomcat, Jetty, Undertow
웹 시스템 구성
- 역할 분리
웹 시스템을 구성할 때 WAS, DB 만으로 시스템 구성이 가능하다. WAS는 정적 리소스, 어플리케이션 로직 모두 제공 가능하기 때문이다. 그러나 WAS가 너무 많은 역할을 담당하면 서버 과부하가 우려 된다. HTML, CSS, JS 파일 같은 경우는 시스템적으로 단순하고 값이 싸다. 그러나 어플리케이션 로직은 비즈니스 로직이므로 값이 비싸다. 어플리케이션 로직이 정적 리소스 때문에 수행이 어려우면 안되므로 역할을 분리해준다.
- 장애 발생시
정적 리소스만 제공하는 웹 서버는 잘 죽지 않고 대부분의 장애는 WAS에서 발생한다. 하지만 WAS는 장애가 발생하면 요청하는 웹 브라우저에서 WAS로 접근조차 되지 않으므로 오류 화면 조차도 노출이 불가능하다. WAS 서버가 죽더라도 웹 서버가 WAS 에 요청을 했는데 응답이 없거나 잘 연결되지 않으면 오류화면 HTML 제공하도록 설정할 수 있다.
- 리소스 관리
WAS는 중요한 어플리케이션 로직 처리에 전담할 수 있다. 그리고 시스템 리소스를 효율적으로 관리할 수 있다. 정적인 리소스가 많이 필요하면 웹 서버를 증설하면 되고 어플리케이션 리소스가 많이 사용되면 WAS를 증설하면 된다.
웹 어플리케이션 서버 vs 웹 컨테이너 (서블릿 컨테이너)
톰캣을 부를 때, 어플리케이션 서버와 서블릿 컨테이너를 혼용해서 사용하는 경우가 잦아서 두 키워드에 혼란이 있었다. 톰캣은 굳이 둘 중에 하나로 분류하자고 하면 서블릿 컨테이너 쪽에 가깝다고 한다.
왜냐하면 톰캣은 서블릿과 JSP를 위한 런타임 환경을 제공하나 어플리케이션 서버의 필수적이라고 할 수 있는 EJB 같은 기술이 적용되어 있지 않기 때문이다.
서블릿 컨테이너는 오직 서블릿 API 만 지원하는 것을 말하고 어플리케이션 서버는 Java EE (EJB, CDI, 서블릿 API 등..)의 전체를 지원한다고 한다.
하지만, 톰캣은 서블릿 뿐만 아니라 JSP 같은 것도 실행할 수 있기 때문에 서블릿 컨테이너라고 부르는 것이 맞다라는 관점도 있고, 톰캣이 서블릿 컨테이너를 포함하고 있는 개념이라는 관점도 있다.
참고
스프링 핵심 원리 - 기본편 (김영한 님)