Backend/FastAPI

CGI, WSGI, ASGI 에 대하여

지미닝 2024. 5. 10. 11:37

 2년전인 1학년 때, 아무것도 모르는 상태에서 FastAPI를 시작했었는데 당시 FastAPI가 Starlette 과 Pydantic을 기반으로 한 웹 프레임워크이며, ASGI방식을 사용한다는 것을 알게되었다.

 

🤔 그래서 ASGI방식이 뭔데?

 

선배가 ASGI방식임을 알려주셨는데, 그게 뭔질 알아야 또 그거말고 뭐가 있는지 알아야 이해를 할텐데 너무 답답했다. (물론 선배가 설명을 못하신게 아니라, 내가 뭐가 있는지 모르니 아무리 설명해줘도 "그게뭔데? 머좋은건데?"라는 생각만 나는 상황..)

 

 

최근에, FastAPI공부를 하면서, DB에 접근할 때 session개념이 생기던데 Asynchronous하게/Synchronous하게 접근해야할지 고민했는데 (물론 비동기가 맞다고 생각했다!! 이건 다른 글에서..다루도록) 이것에 곧 ASGI의 특성과 이어진다고 생각해서 이번에 제대로 한번 다뤄보자라는 마음으로 게시물 작성하게 되었다.

 

순전히 내 학습용도이기 때문에 잘못된 내용이 있을 수도 있고, 구글에 더 좋은 정보가 많을테니 내 게시물은 참고만 해주시길..!

 

 

 

🧚🏻 웹 서버와 웹 어플리케이션 간의 통신을 가능하게 하는 프로토콜/인터페이스

ASGI(Asynchronous Server Gateway

Interface)는, 웹 서버와 웹 어플리케이션 간의 통신을 가능하게 하는 "프로토콜,인터페이스"를 말한다.

 

먼저 ASGI를 알기 전에 WSGI, 그리고 그 전의 CGI까지 거슬러올라가보자!

 

✔️ CGI

요청마다 새로운 프로세스

정의

CGI는 웹 서버와 외부 프로그램이나 스크립트 간의 데이터를 주고받을 수 있는 방법을 제공하는 오래된 표준이다. 웹 서버가 클라이언트의 요청을 받으면, 이 요청을 외부 프로그램에 전달하고, 그 결과를 클라이언트에게 전달하는 방식으로 동작한다.

 

작동 방식

클라이언트로부터 HTTP 요청이 들어오면, 웹 서버는 새로운 프로세스를 생성하여 해당 요청을 처리하는 CGI 스크립트를 실행합니다. 스크립트는 실행 결과를 웹 서버에 반환하고 웹 서버는 이를 클라이언트에게 전달한다.

 

단점

매 요청마다 새로운 프로세스를 생성해야 하므로 리소스 사용이 비효율적이고, 대규모 트래픽에 대응하기 어려운 구조다.

 

 

✔️ WSGI

WSGI컨테이너

정의

WSGI는 파이썬 어플리케이션 또는 프레임워크와 웹 서버 간의 표준 인터페이스로, CGI의 단점을 개선하기 위해 만들어졌다. WSGI는 파이썬 웹 개발에서 거의 표준으로 자리 잡았다.

 

작동 방식

WSGI는 어플리케이션과 웹 서버 간의 간단한 호출/응답 프로토콜을 사용한다. 웹 서버는 WSGI 컨테이너를 통해 어플리케이션에 요청을 전달하고, 어플리케이션은 웹 서버에 응답을 반환한다. 이 구조는 동시성과 공유 리소스 활용을 효율적으로 관리할 수 있다.

 

특징

여러 요청을 동시에 처리할 수 있으며, 프로세스나 스레드를 재사용할 수 있어 리소스 효율성이 높다.

 

 

✔️ ASGI

컨테이너가 비동기적으로 동작

정의

ASGI는 WSGI의 비동기 버전으로, 비동기 프로그래밍을 지원하여 파이썬에서 더 높은 동시성을 가능하게 한다. 웹 소켓과 같은 지속적인 연결을 처리할 수 있도록 설계되었다.

 

작동 방식

ASGI는 이벤트 루프를 사용하여 여러 비동기 작업을 동시에 처리할 수 있다. 이는 더 많은 요청을 동시에 처리하고, 특히 I/O 작업이 많은 어플리케이션에서 유리히다.

 

특징 

ASGI는 비동기적으로 작동하며, 동시에 여러 네트워크 연결을 관리할 수 있다. 또한, 웹 서버와 어플리케이션 사이의 메시지 전달 방식을 사용하므로 더 복잡한 비동기 작업을 용이하게 처리한다.

 

또한, WSGI에서 지원하지 않는 Websocket & HTTP 2.0을 지원한다.

 

 

✨ Web Server와 Web Application Server의 차이

여기서 의문이 생기는 부분은, 웹 서버와 어플리케이션 서버는 뭐가 다른가다.

 

 

먼저 서버는 정적이다. Static하며 있는 그대로 Response를 한다. 또한 변경되지 않는 동안 해당 페이지를 Response하게 된다. 

반면 Web Application Server는 동적으로 동작한다.

 

Request에 따라서 Response가 달라지는 구조다.

 

 

그럼 이것을 왜 이것을 나누냐?

다양한 로직 처리를 Application이 하고 정적 처리를 Server가 한다면 서버 부하가 감소된다.

또한 보안/유지보수 성에서 뛰어나기 때문에 해당 구조를 따르고 있다.

 

 

따라서!!  ASGI, WSGI구조가 저렇게 설계된 것이다.

 

 

👀 각 인터페이스를 사용하는 대표적인 웹 프레임워크

1. CGI를 활용하는 프레임워크

CGI는 현재는 크게 선호되지 않는 방식이기 때문에, 대부분의 현대 웹 프레임워크에서는 직접적으로 사용되지 않는다. 그러나 초기 웹 어플리케이션 개발에서는 Perl의 CGI.pm 라이브러리나 Python의 cgi 모듈과 같은 도구들이 이용되었다.

2. WSGI를 활용하는 프레임워크

  • Flask: 가볍고 확장 가능한 웹 프레임워크로, 간단한 웹 애플리케이션부터 복잡한 웹 사이트까지 다양하게 개발할 수 있다. WSGI를 기반으로 동작하며, 사용자 친화적인 API를 제공한다.
  • Django: 고수준의 웹 프레임워크로, 웹 사이트의 빠른 개발과 깔끔한 설계를 지향한다. ORM, 템플릿 시스템, URL 라우팅 등을 포함한 "배터리 포함" 접근 방식을 사용하며 WSGI를 지원한다.

3. ASGI를 활용하는 프레임워크

  • Starlette: 비동기 프로그래밍을 완전히 지원하는 경량 ASGI 프레임워크로, 고성능 비동기 애플리케이션을 구축하기 위한 도구를 제공한다. FastAPI의 기반이기도 하다.
  • FastAPI: Starlette 위에 구축되어, 빠른 API 개발을 위한 현대적인, 빠른 (고성능) 프레임워크다. ASGI 통해 비동기 동기 코드 모두를 실행할 있으며, 데이터 유효성 검사와 자동 문서화 기능을 제공한다.

 

 

🍃 Spring은 뭐임?

멍청한 생각이지만 Spring은 어떨까? 고민해봤다.

 

그런데 Spring프레임워크는 해당 3가지와 완전히 다르다. 위에서 언급한 인터페이스는 주로 파이썬 언어에서 웹 서버와 어플리케이션 사이의 통신을 위해서 설계된 것이라, Spring은 자바 기반 어플리케이션 개발을 위해 다양한 기능을 제공하지만, CGI, WSGI, ASGI 같은 프로토콜을 사용하진 않는다.

 

대신 서블릿 API와 같은 자바 EE의 기술을 기반으로 하여 웹 서버와의 통신을 처리한다고 한다.

서블릿 API는 HTTP 요청과 응답을 관리하고, 웹 어플리케이션의 생명주기를 관리하는 자바의 표준 방식이다.  (김영한 선생님 MVC 강의를 참고하면 더 자세하게 알 수 있다.)

 

Spring은 이 서블릿 API를 사용하여 웹 어플리케이션의 구성요소들을 효율적으로 관리하고, 다양한 웹 관련 기능을 손쉽게 구현할 수 있도록 도와준다!!

 

 

 

Spring이 그립다...