[Python] WSGI와 ASGI 이해하기
WSGI와 ASGI
WEB과 WAS의 차이
WEB 서버
- 웹 서버(소프트웨어) : 클라이언트로부터 HTTP 요청을 받아들이고, 요청에 맞는 HTML 문서 등과 같은 것들을 응답해주는 컴퓨터 프로그램
- 웹 서버(하드웨어) : 위의 컴퓨터 프로그램을 실행하는 컴퓨터
WAS(Web Application Server)
웹 서버 + 웹 컨테이너
인터넷 상에서 HTTP를 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)이다.
웹 애플리케이션 서버는 동적 서버 콘텐츠를 수행하는데, 이는 일반적인 웹 서버와 구별이 된다. 주로 데이터베이스 서버와 함께 수행된다.
웹 컨테이너란 JSP와 servlet을 실행시킬 수 있는 소프트웨어를 말한다.
WAS의 기본 기능
- 프로그램 실행 환경과 데이터베이스 접속 기능 제공
- 여러 개의 트랜잭션을 관리
- 업무를 처리하는 비즈니스 로직을 수행
- Web Service 플랫폼의 역할
웹 컨테이너(Web Container)
JSP와 Servlet을 실행시킬 수 있는 소프트웨어
JSP
쉽게 말해 Java 코드가 들어가 있는 HTML 코드이다.
Servlet
클라이언트의 요청을 처리하고, 그 결과를 반환하는 자바 웹 프로그래밍 기술
특징
- 클라이언트 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
- html을 사용하여 요청에 응답
- java thread를 사용하여 동작
- MVC 패턴에서 컨트롤러로 이용
- UDP 보다 처리 속도가 느림
서블릿 컨테이너
서블릿은 스스로 작동하는 것이 아니고, 서블릿을 관리해주는 것이 필요하다. 예를 들어 서블릿을 어떠한 역할을 수행하는 정의서라고 보면, 서블릿 컨테이너는 그 정의서를 수행하는 역할을 한다고 볼 수 있다.
서블릿 컨테이너는 클라이언트의 요청을 받아주고 응답할 수 있게 웹 서버와 소켓으로 통신하는데 대표적으로는 톰캣(Tomcat)이 있다. 톰캣은 웹 서버와 통신하여 JSP와 Sevlet이 작동하는 환경을 제공한다.
WEB과 WAS 비교
- 웹 서버 : 정적인 데이터를 처리. 이미지나 단순 html 파일과 같은 리소를 제공
- WAS : 동적인 데이터를 처리하는 서버. DB와 연결되어 데이터를 주고 받거나 프로그램으로 데이터 조작이 필요한 경우에는 WAS를 사용해야함
동적 페이지와 정적 페이지
- Static Pages
- 웹서버는 파일 경로 이름을 받아 경로와 일치하는 file contents를 반환
- 항상 동일한 페이지를 반환
- ex) image, html, css, javascript 파일과 같이 컴퓨터에 저장되어 있는 파일
- Dynamic pages
- 인자의 내용에 맞게 동적인 contents를 반환
- 웹 서버에 의해서 실행되는 프로그램을 통해 만들어진 결과물(인자에 맞게 가공되는 컨텐츠)
WSGI가 필요한 이유
Python에서는 WAS가 별도로 존재하지 않는다. 그래서 CGI, FastCGI 등을 이용해서 원하는 WAS 형태를 만들어서 사용해야하는데, WSGI는 python 어플리케이션, 스크립트가 웹 서버와 통신하기 위한 인터페이스이다. CGI 디자인 패턴을 모태로 하여 만들어졌지만 실제 CGI와는 다소 차이가 있다.
CGI는 매 요청마다 프로세스를 생성하고, 매 요청마다 Fork 등의 함수를 통해 커널 리소스를 추가/반납하는데 반해, WSGI는 한 프로세스에서 모든 요청을 받는다. 그리고 많은 요청을 콜백(callback)으로 받아 처리한다.
다시 말해, WSGI는 웹서버와 애플리케이션 사이에 미들웨어 역할을 하며 Client-Server Model을 응용한 것이다. 웹 서버가 애플리케이션의 코드를 직접적으로 읽을 수 없으므로 중간의 미들웨어가 해당 코드를 읽어서 결과를 대신 반환해주는 녀석이라고 생각하면 된다.
ASGI가 필요한 이유
WSGI만으로는 현대 웹 서비스의 대용량 트래픽 처리를 유연하게 하기 위한 만족된 조건을 충족하기 어려운 점이 존재하게 되었다.
python에서는 asyncio, coroutine과 같은 비동기 처리를 지원하는데 WSGI는 동기 함수 처리만을 지원하여 여러 작업을 동시에 처리하는 것에 한계가 발생하였다. 가령 현대 웹서비스에서는 웹 소켓 등을 사용한 실시간 채팅 서비스를 지원할 수 있는데 WSGI로는 서비스를 구현하는데 한게가 있다. 그래서 비동기 처리를 가능하게 하는 ASGI가 필요하게 되었다.
참고
- https://mangkyu.tistory.com/14
- https://helloworld-88.tistory.com/71
- http://blog.neonkid.xyz/249