규도자 개발 블로그

gunicorn은 대체 뭐하는 놈일까 (부제: CGI, WSGI는 대체 뭐냐) 본문

Topic

gunicorn은 대체 뭐하는 놈일까 (부제: CGI, WSGI는 대체 뭐냐)

규도자 (gyudoza) 2020. 5. 8. 13:19

gunicorn은 대체 뭐하는 놈일까 (부제: CGI, WSGI는 대체 뭐냐)

django를 배포하려고 하면 꼭 gunicorn이나 uWSGI라는 놈과 마주친다. 튜토리얼 보스마냥 이 둘을 마주치지 않고 배포를 할 수는 없는 모냥이다. 왜 php는 Apache나 nginx처럼 웹서버만 있으면 되는데 django는 WSGI라 불리는 아이들을 거쳐야 하는 걸까? 한번 알아보자.

 

gunicorn은 WSGI의 일종이다. 그렇다면 WSGI는 뭘까? CGI의 일종이다. 그렇다면 CGI는 뭘까? 그렇다. gucniron이 뭐하는 놈인지 이해하기 위해선 CGI라는 것부터 이해해야 한다.
 CGI를 풀어써보면 Common Gateway Interface라고 하는데 한국말로 직역하자면 "공용 경로 인터페이스"라고도 할 수 있다. 영어로 된 단어를 억지로 직역하려니 느낌이 이상한데 이는 웹의 역사와 함께 이해하면 쉬울 것이다.
 웹은 원래 정적인 정보의 나열이 전부였다. 워낙에 웹이 발전하다보니 오히려 정적인 웹을 찾기 힘든 추세가 되어 잘 와닿지 않을 수 있는데 회원가입이나 Contact Form도 따로 없는, 그저 할 수 있는게 볼 수 있는 것밖에 없는 회사소개 페이지를 떠올리면 될 것이다. 그렇게 단순 정보의 나열뿐이었던 단방향 형태의 웹은 점점 수요가 다양해지고 당연스럽게 동적인 웹으로서의 발돋음을 하게 되는데 그 과정에서 사용자들이 입력하는 데이터를 처리할 로직이 필요했다. 예를 들어 내가 회원가입을 하면 회원 리스트에 내 이름이 올라가는 것처럼 말이다.
 이것을 처리하기 위해 개발자들은 각자 자신이 사용하던 언어를 사용하기 시작했는데 언어가 제각각이니 규격도 제각각 아니겠는가. 하지만 이를 "공통적인 형태"로 주고받기 위해 만든 것이 바로 CGI이다. 그러니까 이런저런 언어들이 사용자들의 다양한 요청을 이해할 수 있게 "이 문을 지나면 이러한 형태가 됩니다"하고 정해놓은 규약이자 프로그램이 바로 CGI라는 것이다.
 위의 예제로 설명하자면 회원가입한 자신의 목록을 다시 조회하기 위해선 html만으로는 어림없다. 서버 내부에서 데이터를 저장하고 조회하는 일련의 기능이 있어야 하는데 이러한 사용자의 http request가 webserver를 통해 서버 내부로 들어오고 CGI를 통해 일관된 형태로 해석되어 응용 프로그램에 전달돼 사전 작성해놓은 로직에 따라 html을 다시 그래내어 webserver의 http response를 통해 사용자에게 되돌아가는 것이다. 그러니까 결론적으로 말하자면 CGI는 웹서버와 응용프로그램 사이의 동시통역사라고 할 수 있다.

 

그렇다면 WSGI는 무엇일까? WSGI는 풀어 쓰면 Web Server Gateway Interface이다. 딱 봐도 "웹을 위해 만들어진 인터페이스구나" 라는 걸 알 수 있는데 틀린 말은 아니지만 애석하게도 파이썬 스크립트가 웹 서버와 통신하기 위해 만들어진 인터페이스이다. 파이썬이라는 단어는 없지만 파이썬을 위해 만들어진 것이라는 의미이다. 위에서 CGI를 설명한 것과 같이 웹서버에서의 요청을 해석하여 파이썬 응용프로그램에 던지는 역할을 한다.

 

그러니까 Gunicorn이나 uWSGI는 Apache나 nginx로 들어오는 HttpRequest를 Python이 이해할 수 있게 동시통역하여 던져주는 애들이라고 할 수 있는 것이다. 글을 들어가면서 말했던, 이러한 미들웨어가 필요없어보이는 php도 apache서버를 설정할 때 주석 해제를 통해 php버전에 맞게 모듈을 활성화시키는 걸 알고 있을 것이다. 그것이 바로 CGI역할을 하는 것이다. 스프링을 배포할 때에는 톰캣이 이러한 역할을 맡는다고 보면 쉽게 이해가 될 것이다. 그리고 이렇게 해석기와 웹서버가 달려있는 애들을 흔히 WAS(Wep Application Server)라고 부른다.

 

각주

표현하기 쉽게 하기 위해 WSGI가 CGI의 일종이라고 하였지만 사실 WSGI는 CGI에서 파생된 개념이고 CGI는 CGI그 자체가 독창적인 실행방식으로 존재하고 있는 프로그램의 일종(예: 요청마다 프로세스를 생성하여 던져주는 방식 등)이기 때문에 WSGI는 CGI의 일종이라고 표현하는 데에는 약간 어폐가 있다. 하지만 이해하기 쉽게 하기 위해 이렇게 표현하였음을 알리는 바이다. 컵라면은 라면의 파생품이지만 각자가 각자의 방식대로 존재하는 것처럼 이해하면 쉬울 것이다.

Comments