Tornado는 Python으로 작성된 비동기 웹 프레임워크로, 고성능 HTTP 서버를 구축하기 위해 사용됩니다. Tornado는 이벤트 기반 아키텍처를 통해 많은 동시 연결을 처리할 수 있으며, 비동기 처리를 통해 확장성과 성능을 개선할 수 있습니다.
하지만 기본적인 Tornado의 HTTP 요청 처리 방식은 모든 요청에 대해 동일한 처리 로직을 적용하게 되기 때문에, 맞춤형 요청 처리가 필요한 경우에는 추가 작업이 필요합니다. 이번 글에서는 Tornado를 사용하여 맞춤형 HTTP 요청을 처리하는 방법에 대해 알아보겠습니다.
RequestHandler 상속
Tornado에서 HTTP 요청을 처리하기 위해 사용되는 주요 클래스는 tornado.web.RequestHandler
입니다. 이 클래스를 상속하여 새로운 요청 처리 클래스를 만들 수 있습니다.
import tornado.web
class CustomRequestHandler(tornado.web.RequestHandler):
def get(self):
self.write("This is a custom request handler.")
위의 예제에서는 CustomRequestHandler
라는 새로운 클래스를 만들고, HTTP GET 요청에 대해 “This is a custom request handler.”라는 응답을 반환하도록 정의하였습니다.
URL 패턴과의 매핑
Tornado는 URL 패턴과 요청 처리 클래스를 매핑하여 요청을 적절한 핸들러로 라우팅할 수 있습니다. 이를 위해서는 tornado.web.Application
클래스를 사용해야 합니다.
import tornado.web
import tornado.ioloop
class CustomRequestHandler(tornado.web.RequestHandler):
def get(self):
self.write("This is a custom request handler.")
app = tornado.web.Application([
(r"/custom", CustomRequestHandler),
])
if __name__ == "__main__":
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
위의 예제에서는 /custom
URL에 대한 요청을 CustomRequestHandler
로 라우팅하도록 정의하였습니다. 따라서, 웹 브라우저에서 http://localhost:8888/custom
에 접속하면 “This is a custom request handler.”가 표시됩니다.
요청 처리 메소드
RequestHandler
클래스는 HTTP 메소드에 따라 다양한 메소드를 제공하여 요청을 처리할 수 있습니다. 아래는 일부 예시입니다.
get()
: GET 메소드로 들어오는 요청 처리post()
: POST 메소드로 들어오는 요청 처리put()
: PUT 메소드로 들어오는 요청 처리delete()
: DELETE 메소드로 들어오는 요청 처리
import tornado.web
import tornado.ioloop
class CustomRequestHandler(tornado.web.RequestHandler):
def get(self):
self.write("This is a GET request handler.")
def post(self):
self.write("This is a POST request handler.")
app = tornado.web.Application([
(r"/custom", CustomRequestHandler),
])
if __name__ == "__main__":
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
위의 예제에서는 GET 메소드와 POST 메소드에 대한 처리를 각각 다르게 정의하였습니다. 따라서, 웹 브라우저에서 http://localhost:8888/custom
에 GET 또는 POST 요청을 보낼 때 각각 다른 응답을 받을 수 있습니다.
요청 매개변수 접근
RequestHandler
클래스에서는 요청에 대한 매개변수에 접근할 수 있는 다양한 속성을 제공합니다.
get_argument(name, default=None)
: URL 또는 POST 데이터로부터 매개변수 값을 가져옵니다.get_arguments(name, strip=True)
: URL 또는 POST 데이터로부터 매개변수 값들의 리스트를 가져옵니다.get_query_argument(name, default=None)
: URL로부터 매개변수를 가져옵니다.get_body_argument(name, default=None)
: POST 데이터로부터 매개변수를 가져옵니다.
import tornado.web
import tornado.ioloop
class CustomRequestHandler(tornado.web.RequestHandler):
def get(self):
name = self.get_argument("name")
self.write(f"Hello, {name}!")
def post(self):
names = self.get_arguments("name")
self.write(f"Hello, {', '.join(names)}!")
app = tornado.web.Application([
(r"/custom", CustomRequestHandler),
])
if __name__ == "__main__":
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
위의 예제에서는 GET 메소드와 POST 메소드에서 각각 이름 매개변수를 가져와 화면에 출력합니다. 웹 브라우저에서 http://localhost:8888/custom?name=John
에 접속하면 “Hello, John!”이 표시되고, POST 요청으로 name
매개변수를 전달할 때는 매개변수 값들을 콤마로 구분하여 출력합니다.
결론
Tornado를 사용하여 맞춤형 HTTP 요청을 처리하는 방법에 대해 알아보았습니다. RequestHandler
클래스를 상속하여 새로운 요청 처리 클래스를 만들고, URL 패턴과의 매핑을 설정하여 해당 URL로 들어오는 요청을 적절한 핸들러로 라우팅할 수 있습니다. 이러한 방법을 활용하여 Tornado를 사용하면 HTTP 요청을 기반으로 한 다양한 웹 애플리케이션을 개발할 수 있습니다.
참고 자료: