1. 컴퓨터는 어떻게 인터넷 프로토콜로 통신하는지 알자
인터넷이라는 것은 컴퓨터가 웹 서버라는 프로그램(혹은 하드웨어)을 통해 소통하는 것을 말합니다.
Ⅰ. 하드웨어 측면에서는 웹 서버의 소프트웨어와 웹사이트의 파일을 저장하는 컴퓨터
(여기서 파일은 HTML 파일, image와 video와 같은 media파일, CSS, Javascript 파일이며 이 파일들은 상대방 클라이언트인 브라우저로 넘겨져서 해석되고 유저에게 그려집니다.)
Ⅱ. 소프트웨어 측면에서의 웹서버는 사용자가 호스트 파일에 어떻게 접근하는지 관리합니다. HTTP 프로토콜로 요청(request)이 제대로 왔을 때, 그것에 해당하는 파일을 다시 HTTP 프로토콜을 통해 응답(response)해줍니다.
여기서 웹 서비스는 크게 정적 웹 페이지(static web page)와 동적 웹 페이지(dynamic web page)로 나뉩니다.
단순하게 설명하자면, 정적 페이지는 누가 들어오든지 같은 HTML, CSS, Javascript 파일로 보여주는 것입니다. 그래서 웹서버와 파일만 있으면 바로 서비스할 수 있습니다.
동적 페이지는 데이터베이스와 연결이 되어있거나 웹 서버 프로그램 외에도 계산하거나 파일을 조작하는 것들이 들어갑니다. 예를 들어서 컴퓨터에 있는 데이터베이스 안에 있는 User 테이블에 접근하여, 특정 이름을 가져와서 HTML 내부의 특정 태그에 {user_id}로 된 변수를 채워서 완성된 HTML을 만드는 것이죠.
이 경우에는 동적 페이지를 완성하기 위한 애플리케이션(우리가 데이터베이스와 연결하거나, HTML을 조립하는 완성된 코드 뭉치)이 돌아갈 것이 필요하고 이를 웹 애플리케이션 서버라고 합니다.
컴퓨터에 있는 애플리케이션이 HTML 파일을 조립하면, 그것을 웹 서버가 요청해온 클라이언트에게 보내주는 것이죠.
그래서 결론적으로 인터넷에 나만의 사이트를 서비스하려면 허접하더라도 저런 역할을 해주는 웹 서버 프로그램이 있어야 한다는 것입니다.
(웹 서버 프로그램은 여러 요청을 수행하기 위해서 운영체제단에서 프로세스 fork()도 해야 하고.. 여러 일을 수행해야 합니다.)
2. 그래서 왜 WSGI가 필요한 건데요..?
파이썬 자체는 웹 서버가 아닙니다. 정확히 말하면 HTML을 조립할 수 있는 동적인 프로그래밍 언어이죠.
여러분이 웹 백엔드를 구성하기 위해 이용하는 flask나 Django 프레임워크 조차도
그저 웹 서비스를 만드는 데에 도움이 되도록 누군가가 미리 작성해놓은 코드 뭉치입니다.
(내가 원하는 URL에 해당하는 요청이 왔을 때 HTML 파일을 잘 조립해서 내어주려고 하는 목적으로,
편하게 코딩할 수 있도록 누군가가 만들어둔 것이죠.)
개발자는 사람이 작성한 파이썬이라는 언어를 해석할 수 있는 인터프리터를 python.org에서 받았을 것이고,
이것은 한 줄씩 해석되어 CPU에 의해서 운영체제가 할당한 메모리 공간에 올라가서 일을 수행할 것입니다.
그러면 우리는 최종 완료된 HTML 파일을 어떻게 해야 할까요?
요청해온 클라이언트에게 보내주어야겠죠.
사실 Python 자체도 클라이언트에게 보낼 수 있는 능력이 있습니다.
(소켓 프로그래밍이 가능하기 때문에 웹 애플리케이션을 만들 수 있습니다.)
근데 이것을 직접 코딩해서 모든 웹 서비스를 구현할 수 있을 정도로 프레임워크를 만들기가 매우 귀찮고 힘들기 때문에,
Python을 통해 WSGI(위스키라고 읽습니다.)라는 인터페이스를 만들어냅니다.
왜 만들어냈냐면, 기존에 있던 일반적인 웹 서버 프로그램은 Python으로 쓰인 애플리케이션 연결을 지원하지 않았거든요.
그런데 사람들은 파이썬으로 웹 애플리케이션을 만들고 싶어하니까 만들어낸 것이죠.
(1990년대 후반에 Grisha Trubetskoy가 최초로 mod_python이라는 아파치 서버 모듈을 만들었다고 합니다.
물론 그 때 당시 개발된 mod_python은 현재 PEP 3333을 준수하지는 않는다고 하네요.)
WSGI는 Web Server Gateway Interface의 줄임말로 웹 서버로 연결해주는 역할을 합니다.
그러니까 저것만 우리가 웹 서버에 잘 연결하면,
그 웹 서버 프로그램이 자기가 코딩된 대로 HTML 파일 뭉치들을 잘 전달해줄 것이라는 겁니다.
Python 공식문서에는 PEP 3333이라고 해서 Python WSGI의 규칙이 있습니다.
이를 준수하면서도 안정적인 프로그램들이 많습니다.
대표적인 프로그램이 Gunicorn이라고 불리는 Green Unicorn입니다.
(이것도 그냥 웹 서버와 연결할 수 있는 기능을 가진 코드 뭉치에요..)
3. 덕분에 기존 웹 서버 프로그램을 쓸 수 있다!
Python과 웹 서버 프로그램의 구조, 운영체제를 정확히 이해하는 분들이야
직접 코딩해서 자신만의 웹 서버 프로그램을 파이썬으로 구현할 수 있겠지만,
대부분의 사람들은 서비스를 위해서 빠르게 애플리케이션을 개발하여 배포하고 싶어합니다.
덧붙여서 기존에 익숙하게 쓰이던 Nginx나 Apach 웹 서버를 이용하고 싶어하죠.
그것을 이용하려면 내가 코딩한 파이썬 코드는 HTML을 열심히 조립하고,
그 조립된 HTML을 다른 파일들(아까 위에 적어놓은 사진, 영상, CSS 등..)과 함께
웹 서버와 연결하여 클라이언트에게 보내주면 되는 것입니다.
모든 것을 다 알고 밑바닥부터 만들어서 사용할 수 있으면 좋겠지만,
우리 인생은 짧고 할 건 많잖아요..?
출처 :
1. 웹 서버란 무엇인가요?
https://developer.mozilla.org/ko/docs/Learn/Common_questions/What_is_a_web_server
2. Python WSGI에 대하여
https://www.python.org/dev/peps/pep-3333/
3. About WSGI servers
https://www.fullstackpython.com/wsgi-servers.html
4. WSGI란 도대체 무엇이고 이걸로 뭘 할 수 있는가?
https://rahmonov.me/posts/what-the-hell-is-wsgi-anyway-and-what-do-you-eat-it-with/
5. WSGI Server에 대한 소개
https://www.appdynamics.com/blog/engineering/an-introduction-to-python-wsgi-servers-part-1/