본문 바로가기

IT/Web

[WSGI/Flask/SocketIO] 개념 정리

Deeplearning 카테고리에 Self Driving Car 논문 구현체에 대해서 코드 리뷰를 하고 발표를 하던 중에 Flask와 SocketIO에 대해서 질문이 많이 들어왔는데, 대략적인 개념만 알고, 자세히는 모르고있어서 설명을 못드렸었습니다. 질문에 대한 답을 정리하고 이번 기회에 개념을 정리하고자, 이번 포스팅을 쓰려고 합니다.


[Code Review/ self-driving lab] Udacity Self-driving Car - (1)

[Code Review/ self-driving lab] Udacity Self-driving Car - (2)

[Code Review/ self-driving lab] Udacity Self-driving Car - (3)




1. Web의 기본 구조



초기의 웹 구조는 브라우져::Client에서 특정 서버에게 html을 요청하면 웹 서버::Server는 이를 찾아서 html문서를 전송해주는 방식을 취했습니다. 이를 static contents::정적 데이터라고 하는데, 이는 고정된 데이터만 보낼 수 있었기 떄문에 제한이 많습니다.


예를 들면, 내가 이 사람의 주민번호를 주면 그 사람의 자산정보다, 개인적인 신상정보를 줘라고 하는 이러한 데이터 가공 요청은 불가능했습니다. 따라서 이를 보안하고자, Web Application Service::WAS가 나옵니다. 웹 어플리케이션 프레임워크에는 JAVA는 스프링, PHP는 라라벨, Python은 Django, Ruby는 Rails등 여러가지 프레임워크들이 존재합니다. 이러한 프레임워크들은 Database등과 연동되어 사용자 요청에 맞게 데이터를 가공해서 응답해주게 됩니다.


2. WSGI:: Web Server Gateway Interface

WAS와 Web Server는 서로의 요청과 응답에 대해서 서로 데이터를 주고 받는 통신을 해야하는데, 이러한 통신 규약을 WSGI라고 합니다. 


3. WSGI Middleware

위의 WSGI 규약에 맞춰서 Web Server와 WAS간의 통신을 원활하게 도와주는 것을 WSGI Middleware라고 합니다. WSGI Middleware에는 PHP의 FPM, Python의 Flask, CGI, FastCGI 등등이 있습니다. Python에서는 각각의 Web application이 지원하는 WSGI Middleware가 달랐기 때문에 Web Server와 WAS, WSGI Middleware 선택이 제한적이었습니다. 

4. Flask

Flask는 Python의 마이크로 프레임워크인데, WSGI 미들웨어와 템플릿엔진 두가지로 구성되어있습니다. low-level로 작성되어있기 때문에 Python에서 Web Server, WAS, WSGI Middleware에 대한 제약을 없애주었습니다.

여기서 마이크로란 핵심 기능만 간결하게 유지하지만 확장가능한 것을 의미합니다.

따라서 Flask는 핵심 기능만 간결하게 유지하고(WSGI 미들웨어와 템플릿엔진으로 구성) 확장가능한(그 외의 모든 모듈과 서비스 패턴은 프로그래머가 붙여줘야함) 마이크로 프레임워크입니다.

5. SocketIO

일반적으로 Web Server는 Client 요청에 따른 응답만 해주므로 수동적으로 반응하며, http connection 특성상 연결이 되어 html 문서등 정리가 다 되었다면 연결이 끊기는 특징을 가지고 있습니다. 때문에 과거에는 어떠한 링크를 클릭하면 화면이 깜빡임과 동시에 새로고침이 일어났던 것입니다. 이러한 부분이 사용자의 사용성에 굉장히 좋지 않기 때문에, 특정한 부분만 반응하고, 특정한 부분만 데이터가 변경되는 형태의 양방향 통신 및 비동기 통신이 요구됩니다. 따라서 나온 것이 AJAX부터해서 Long Pooling, WebSocket 등등 많습니다. 

지금 표준은 WebSocket인데, 표준이 된지 얼마 되지 않아 오래된 브라우져에서는 이 WebSocket을 사용할 수 있는 기능이 없는 경우가 많아서 범용적으로 쓰이기 어려웠습니다. 따라서 자기가 사용자의 브라우져를 감지하고, 이를 파악해서 브라우져에 알맞는 통신방식을 지원하는 추상화된 API가 SocketIO입니다. 따라서 SocketIO는 하나의 API만 사용해서 프로그래밍을 하면, 스스로 클라이언트의 브라우져 환경을 분석해서 Long Pooling을 써서 양방향 통신을 할지, WebSocket을 사용할지 결정해서 똑같은 기능을 수행하도록 하는 것입니다.


[Reference]


[1]. WSGI로 보는 웹서버의 개념

[2]. <Python> 4개의 Web Framework 비교

[3]. Django과 Flask 비교

[4]. 웹 서버 게이트웨이 인터페이스

[5]. Python WSGI Server와 관련된 공부

[6]. Flask로 만들어보는 WSGI 어플리케이션

[7]. Python 가벼운 웹 프레임워크 Flask

[8]. Python 프레임워크 Flask - 1

[9]. 빠르게 훑어보는 node.js - #9 Socket.IO 1/4 기본 및 채팅프로그램 만들기

[10]. WebSocket과 Socket.IO

[11]. Node.js  Socket.IO #1

[12]. Socket.IO Server API