Apache, Nginx = Web Server
Tomcat = WAS, Web Application Server = 서블릿 컨테이너 = 미들웨어
1. Web Server 란
클라이언트가 서버에 페이지 요청을 하면 요청을 받아 정적 컨텐츠(.html, .png, .css등)를 제공하는 서버
WEB서버는 클라이언트에서 요청이 올 때 가장 앞에서 요청에 대한 처리를 진행한다.
동작 Process
- 클라이언트가 컨텐츠 요청
- 정적 컨텐츠 요청이면, 웹서버에서 정적 컨텐츠를 클라이언트에게 전달
- 동적 컨텐츠 요청이면, 웹서버에서 처리하기 버거움 -> WAS에게 요청
※ 정적 컨텐츠, 동적 컨텐츠?
정적 컨텐츠 : 누가 언제 서버에 요청하더라도 동일하게 내용을 보여주는 컨텐츠. HTML, CSS, JavaScript 로 이미 만들어진 결과물을 사용자에게 보여주는 컨텐츠이다.
동적 컨텐츠 : 누가, 언제, 어떻게 서버에 요청했는지에 따라 각각 다른 내용이 보여지는 컨텐츠.
쿠팡 사이트로 예를 들어보면
상단의 카테고리 바와 각종 배너들은 모든 사용자들에게 동일하게 보여주는 정적 컨텐츠이다.
로그인 이후 우측 상단의 마이쿠팡, 장바구니를 클릭하면 사용자들마다 다른 정보를 받는 것이 동적 컨텐츠이다.
이 경우 사용자별 정보는 DB에 저장되어 있다.
2. WAS(Web Application Server)란
- DB조회 혹은 로직처리가 요구되는 동적 컨텐츠를 제공하기 위해 만들어진 Server이다.
- 좀 더 구체적으로는 분산 트랜잭션, 보안, 메시징, 쓰레드 처리 등의 기능을 처리하는 분산환경에서 사용되는 미들웨어다. 클라이언트에서 DB서버로 데이터를 직접 요청하는 것에 여러 문제가 있었다. 첫 번째는 보안 문제, 두 번째는 클라이언트와 DB의 갯수가 많아지면서 로직이 복잡해진다는 것이다. 따라서, 미들웨어라는 새로운 개념이 생겼는데, 클라이언트는 이 미들웨어에 자신의 요청을 모두 전송하고 이 미들웨어는 가운데에서 이를 db서버에 전달하고 response를 받아 다시 클라이언트에 전달하는 역할을 수행한다.
- JSP, Servlet이 구동할 수 있는 환경을 제공힌다.
동작 Process
- 웹서버로부터 요청이 오면 컨테이너가 받아서 처리
- 컨테이너는 web.xml을 참조하여 해당 서블릿에 대한 쓰레드를 생성하고 httpServletRequest와 httpServletResponse 객체를 생성하여 전달한다.
- 컨테이너는 서블릿을 호출한다.
- 호출된 서블릿의 작업을 담당하게 된 쓰레드(2번에서 만든 쓰레드)는 doPost()또는 doGet()을 호출한다.
- 호출된 doPost(), doGet() 메소드는 생성된 동적 페이지를 Response객체에 담아 컨테이너에 전달한다.
- 컨테이너는 전달받은 Response객체를 HTTPResponse형태로 바꿔 웹서버에 전달하고 생성되었던 쓰레드를 종료하고 httpServletRequest, httpServletResponse 객체를 소멸시킨다.
3. 웹서버와 WAS 구분 이유
웹서버는 다양한 구조를 가질 수 있다.
Client -> Web Server -> DB
Client -> WAS -> DB
Client -> Web Server -> WAS -> DB
이 중에서 가장 마지막 구조인 Client -> Web Server -> WAS -> DB가 위의 도식화된 형태이고, 이렇게 가장 많이 구분되어 있는 구조가 좋다고 평가받고 있다.
일단 WAS는 웹서버의 역할도 맡을 수 있다.
이전에는 정적컨텐츠까지 WAS에서 하기에는 서버에 부하를 많이 줘 비효율적이어서 나눴었다. 하지만 최근에는 WAS의 성능이 더 올라갔기 때문에 굳이 성능상의 이유 때문에 둘을 나누지는 않는다고 한다.
그럼에도 불구하고 이 두 가지를 구분해서 쓰고 있는데 이유는 다음과 같다.
물리적 분리로 인한 보안 강화
- WAS는 db서버를 호출하는 역할을 맡는데, 이 db서버에는 회원정보와 같이 가장 중요한 정보들이 들어있다. 따라서 클라이언트와 가장 가까이 있는 웹서버의 보안이 뚫려도, WAS에서 db에 접근하는 한 단계가 더 생기므로 보안에 상대적으로 용이하다. 반면, 웹서버와 WAS를 구분하지 않는 경우 한 번에 다 뚫리기 때문에 보안에 취약하다고 볼 수 있다.
여러 WAS를 연결할 수 있음
- java서버, C서버, php서버 등 하나의 웹서버를 통해 여러 서비스가 가능하다.
장애 극복
- 만약 WAS에 오류가 났을 경우, 웹서버에서 이를 인지하고 사용자가 오류가 난 WAS에 접근하지 못하도록 막고 WAS를 재시작한다. 이때, 이 사용자가 WAS를 호출하는 요청을 하기 전까지는 웹서버에서 정적컨텐츠(html, png) 등을 보여주고 있기 때문에 오류상황을 인지하지 못할 수 있다.
특히나 서비스의 규모가 커질수록 WAS와 웹서버를 더욱 필수적으로 분리한다.
Web Server를 WAS 앞에 두고 필요한 WAS들을 Web Server에 플러그인 형태로 설정하면 더욱 효율적인 분산 처리가 가능하다.
이미지 출처 및 참고 사이트
https://likelionsungguk.github.io/21-01-01/WAS%EC%99%80-%EC%9B%B9%EC%84%9C%EB%B2%84
https://www.blog.fusion-techno.com/?p=354
'개념' 카테고리의 다른 글
REST란? REST가 뭔데? (0) | 2024.01.05 |
---|---|
의존성(Dependency)과 의존성 주입(Dependency Injection) 간단하게 이해하기 (0) | 2022.09.29 |
온프레미스(On-premise)와 클라우드 (0) | 2022.09.20 |
C언어, 컴파일, 동적 컴파일, 정적 컴파일, 동적 라이브러리, 정적 라이브러리 (0) | 2021.03.29 |
댓글