Python

[Python] Tornado 란

비번변경 2024. 7. 3. 18:58

개요

최근 Python Tornado 기반 API 개발 업무를 맡게 되었다. 이전에 API 개발에 대한 호기심으로 아래와 같은 글을 작성했었는데……

2022.09.04-[Flask] 웹 애플리케이션 만들기

2022.09.05-[Flask] REST API 만들기

2022.09.11-[Flask] 요청(Request) 데이터 접근

공부했었던 Flask가 아닌 Tornado 를 사용하게 돼서 알아보려고 한다.

 

 

Tornado

FriendFeed에서 개발한 Python 웹 프레임워크이자 비동기 네트워킹 라이브러리

높은 동시성을 처리할 수 있도록 설계되어 있어 수천 명의 사용자가 동시 접속하는 서비스를 개발할 수 있다. 일반적인 웹 개발, 실시간 서비스와 웹소켓을 포함한 비동기 네트워킹 애플리케이션 개발에 적합하다.

 

주요 오소는 다음과 같다.

  • 웹 프레임워크 : 웹 애플리케이션을 생성하는 RequestHandler과 여러 지원 클래스
  • HTTP의 클라이언트 측 및 서버 측 구현 : HTTPServer, AsyncHTTPClient
  • 비동기 네트워킹 라이브러리 : IOLoop, IOStream

또한 다음과 같은 기능을 지원한다.

  • 비동기 I/O 지원: 이벤트 루프를 기반으로 하는 비동기 네트워킹 코드 작성 지원
  • 웹 프레임워크: 요청 핸들러, 템플릿 엔진 등 기본적인 웹 개발 도구 제공
  • 웹소켓 지원: 웹소켓을 통한 실시간 클라이언트-서버 통신 구현 가능
  • 오래 실행되는 연결 관리: HTTP와 같은 전통적인 프로토콜 뿐만 아니라 오래 지속되는 연결에 대한 효과적인 관리 가능
  • 보안 기능: SSL/TLS 지원

 

이 글에서는 Tornado를 이용해 간단한 웹 서버를 만들어보려고 한다.

 

 

설치

tornado는 다른 라이브러리와 동일하게 pip를 이용해 간단히 설치할 수 있다.

pip install tornado

 

 

기본 구조

공식 문서에서 제공하는 기본적인 Tornado 애플리케이션은 다음과 같은 모습이다.

 

Tornado 6.2, Python 3.10부터는 Tornador 애플리케이션을 시작할 때 asyncio.run으로 main 코루틴(coroutine)을 생성하는 패턴을 권장하고 있다.

import asyncio
import tornado

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

async def main():
    app = make_app()
    app.listen(8888)
    await asyncio.Event().wait()

if __name__ == "__main__":
    asyncio.run(main())

 

기존에는 일반 함수를 초기화하여 IOLoop.current().start()로 이벤트 루프를 시작하는 방법이 일반적이었다.

# app.py

import tornado.ioloop
import tornado.web

# 애플리케이션 작업을 위한 하위 클래스 생성
# get, post 등의 함수가 주요 엔트리포인트가 된다.
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

# 애플리케이션 생성
# 요청을 핸들러에 매핑하는 라우팅 테이블을 포함하여 전역적인 구성을 담당한다.
def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

# 프로그램 시작점
if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

업무 환경에 설치되어 있는 Tornado 버전이 6.1이므로 아무래도 기존 패턴을 따라서 개발해야 할 것 같다.

 

 

실행

Tornado 애플리케이션은 python 명령어로 실행시키면 된다.

python app.py

웹 브라우저로 접속하면 아래와 같이 동작함을 확인할 수 있다.

 

 

 

참고 문서

https://www.tornadoweb.org/en/branch6.1/guide/coroutines.html

https://wikidocs.net/239405

https://blog.naver.com/sundooedu/221340732814

728x90