안녕하세요. 오늘은 파이썬의 웹 서버 인터페이스인 WSGI에 대해서 알아보도록 하겠습니다.
WSGI
WSGI(Web Server Gateway Interface) 정의
WSGI — WSGI.org
Contributing Found a typo? Or some awkward wording? Want to add a link to a presentation, a tutorial or a new (or old and missing) WSGI-related tool? Fixing a dead link? WSGI.org is open-source and hosted on github, contributions are encouraged and appreci
wsgi.readthedocs.io
WSGI는 웹 서버와 웹 애플리케이션이 어떻게 통신해야 하는지 정의해 놓은 명세서입니다. 웹 서버와 웹 애플리케이션은 이 명세에 맞게 개발되어야 합니다.
- 웹 서버: Socket을 직접 사용하며 HTTP 통신하는 서버
- 웹 어플리케이션: Django, FastAPI 등 웹 프레임워크들 같이 요청에 따라 응답을 내려주는 애플리케이션
WSGI 애플리케이션
WSGI 자체는 명세서이므로, 바로 사용할 수 없습니다. 직접 개발하거나 이미 완성된 구현체(서버-Gunicorn, 애플리케이션-Django 등)를 사용해야 합니다.
간단하게나마 직접 WSGI 애플리케이션을 만들어보도록 하겠습니다.
def simple_app(environ: dict, start_response: Callable):
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
start_response(status, headers)
return [b"Hello, WSGI World!"]
# 혹은
class SimpleApp:
def __call__(environ: dict, start_response: Callable):
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
start_response(status, headers)
return [b"Hello, WSGI World!"]
WSGI 서버는 HTTP 요청 정보를 가지고 있는 environ
변수를 WSGI 애플리케이션에 제공합니다. 이 변수에는 query string, body, header, url, method와 같은 정보가 담겨있습니다. WSGI 애플리케이션은 이 정보를 보고 어떠한 응답을 할지 결정하고 반환합니다.
응답 반환은 어떠한 방식으로 이루어질까요? WSGI 서버가 제공하는 start_response
변수와 자체 return 값으로 이루어집니다. start_response
변수는 콜백 함수입니다. 이 함수를 통해서 HTTP status와 header를 전달합니다. 또한 body는 return 값으로 전달합니다. 이때 byte가 담긴 리스트로 반환해야 합니다.
장점
- 꽤 단순한 인터페이스
- 단순함으로 인한 안정성
- 많은 웹 프레임워크들이 지원함
단점
- 동기식으로 작동하기 때문에 File, Network I/O 작업이 발생할 경우 전체 응답 시간이 느려짐
- 해당 문제를 해결하기 위해 멀티 프로세싱을 이용해야 함, 다만 멀티 프로세싱도 많은 자원을 소모함
'Python' 카테고리의 다른 글
Python에서 멀티 스레드를 사용하지 않는 이유(Java와 비교, GIL) (0) | 2025.02.03 |
---|---|
Python WSGI 서버 직접 만들어보기 (0) | 2025.02.03 |
Python 추상클래스 만들기 (0) | 2025.02.03 |