오늘은 늘 보지만 어색한 WSGI에 대해 알아보겠습니다.
WSGI란?
먼저 WSGI를 한마디로 정리해보면 웹서버(Web Server)와 서버 어플리케이션 사이를 연결해주는 부분입니다. 물론 후려친 정의이지만 일단 이렇게 알아둡시다.
아직 웹서버와 웹 어플리케이션 차이를 모르신다면 아래 페이지를 통해 알아보세요!
이를 조금 어렵게 말해보자면 웹서버와 웹어플리케이션간 인터페이스라고 합니다. 이 인터페이스는 WS와 서버 어플리케이션 연결부분을 추상화 시켜 서로간의 결합도를 줄입니다. 사실 정확히 말하자면 WSGI는 모든 언어에 해당하는게 아닌 파이썬으로 작성된 WAS와 다른 웹서버를 연결시켜주는 기능을 합니다. 이를 구체적으로 알기 위해선 WSGI가 등장한 배경에 대해서 알아야합니다!
WSGI가 등장한 배경
1. 정적 페이지와 동적 페이지
인터넷이 생기기 시작한 시점으로 돌아가보면 당시에는 동적인 웹페이지라는게 존재하지 않았습니다. 즉 접속한 유저마다 다른 페이지를 볼 수 없었다는 의미입니다. 그래서 당시에는 정적인 페이지를 빠르게 뿌려줄 수 있는 웹서버라는 기술이 먼저 등장합니다.
시간이 흘러 단순히 웹페이지만을 보여주는 것이 아닌 사용자마다 다른 로직을 수행하거나 버튼을 눌렀을 때 로직을 수행하는 기능을 필요로 합니다. 이러한 페이지를 동적페이지라고 하며 이러한 동적 웹페이지의 시작은 단순히 특정한 로직을 수행하는 스크립트 형태로 구현했습니다. 즉 특정한 요청에 대해 웹서버 내부에 저장되어 있는 스크립트 파일을 실행시키는 방법으로 서버 로직을 수행하는 방식으로 구현한 것 입니다. 이 웹서버와 스크립트 파일 간의 인터페이스가 CGI(Common Gateway Interface)입니다.
2. CGI(Common Gateway Interface)
CGI의 가장 초기의 구현형태는 웹서버로 특정 요청이 들어오면 CGI를 통해 프로그램을 호출해 동적인 응답을 해주는 형태였습니다.
이후에 초기에 빌드나 인터프리터 실행과 같은 병목을 잡고자 웹서버에 인터프리터를 내장해 프로세스를 fork하여 스크립트를 실행시키는 방법을 사용했습니다. 즉 정리해보면 정적인 웹서버를 동적으로 동작시키기 위해 웹서버외에 외부 프로그램을 실행시켜야 했고 웹서버와 외부 프로그램사이의 인터페이스를 CGI라고 하는 것 입니다.이러한 CGI의 구현체로는 Java Serverlet, mod perl, mod php, FastCGI 같은 것들이 있습니다.
3. 서버 어플리케이션의 등장
이후에 서버 어플리케이션은 스크립트 파일 하나씩이 아닌 말그대로 하나의 어플리케이션 형식으로 발전하게 되는데 하나의 프로그램으로 사용했을 때 메모리 관리나 Throughput 더 좋아집니다. 가령 같은 웹서버를 CGI로 관리하면 모든 요청에 대한 프로그램을 메모리에 적재하지만 서버 어플리케이션 방식은 메모리에 한번만 적재합니다. 이런식으로 전체적인 메모리 사용량을 줄여서 더 많은 요청을 처리할 수 있게끔 합니다.
4. WSGI 등장
자 이 지점에서 WSGI가 등장합니다. 웹서버와 파이썬 서버 어플리케이션사이를 연결해줄 연결 부위가 필요하게 된 것입니다. 이 연결부위는 환경정보와 콜백합수를 앱에 인풋으로 넣고 받은 환경정보를 통해서 서버 로직을 처리한 후에 다시 콜백을 통해 서버에 응답합니다. 파이썬에서는 WSGI를 일종의 프로토콜로 규정해 놓고 이 규칙을 따르면 지원하는 웹서버와 통신이 가능하도록 구현해 놓았습니다. 서버 어플리케이션 마다 일일이 웹서버와의 연동을 구현하는 것이 아닌 규칙을 따라서 구현하면 웹서버와의 연동이 자동으로 되도록 구현해놓은 것 입니다. 이러한 WSGI의 구현체로는 mod_wsgi, uwsgi, gunicorn, twisted.web, tornado 등이 있습니다.
즉 "WSGI는 서버 어플리케이션과 웹서버를 연결해주는 연결부위고 CGI의 발전된 형태다"로 정리하면 되겠습니다.
세줄 정리
1. WSGI는 서버 어플리케이션과 웹서버를 연결해주는 인터페이스이고 CGI의 발전된 형태다
2. OS의 환경 변수와 콜백을 서버 어플리케이션으로 전달하고 서버 어플리케이션이 로직 후 받은 콜백을 통해 웹서버로 응답한다.
3. CGI보다 시스템 자원 관리가 잘되어 있고 파이썬으로 만든 어떤 서버 어플리케이션이든 wsgi를 따르면 웹서버와 통신이 가능하다.
저도 공부하면서 정리한거라 혹시 틀린 부분이 있다면 알려주시면 감사하겠습니다!
'Language > Python' 카테고리의 다른 글
[NestJS] 스웨거에서 여러 Type의 Object Array 정의 (0) | 2022.08.22 |
---|---|
[FactoryBoy] Trouble Shooting (0) | 2021.11.06 |
[Python] 파이썬 노답 삼형제(1) - 데코레이터 (0) | 2021.07.17 |
[Python] Thread-safe 한 자료구조 (0) | 2021.04.29 |
[Python] @property 너 누구야? 후아유 (0) | 2021.03.28 |