[python] Tornado의 에러 핸들링 방법

Tornado는 파이썬으로 작성된 웹 프레임워크로서, 비동기 처리와 이벤트 기반 아키텍처를 특징으로 합니다. 하지만, 어떠한 어플리케이션에서도 예외가 발생할 수 있으며, 이를 적절하게 핸들링하는 것은 중요합니다. 이번 포스트에서는 Tornado 애플리케이션에서 에러를 처리하는 방법을 알아보겠습니다.

에러 핸들링 미들웨어

Tornado는 RequestHandler 클래스를 통해 라우팅과 요청 처리를 합니다. 에러 핸들링을 위해 Tornado는 RequestHandler 클래스의 write_error() 메소드를 제공합니다. 예외가 발생하면 이 메소드가 호출되며, 사용자에게 에러 메시지를 제공하는 기능을 구현할 수 있습니다.

import tornado.web

class ErrorHandler(tornado.web.RequestHandler):
    def write_error(self, status_code, **kwargs):
        self.set_status(status_code)
        self.write("Oops! Something went wrong.")

위 예제에서는 ErrorHandler 클래스를 정의하고, write_error() 메소드를 오버라이드하여 요청 처리 중에 발생한 에러를 처리하는 로직을 작성했습니다. self.set_status() 메소드를 통해 응답 상태 코드를 설정하고, self.write() 메소드를 통해 에러 메시지를 작성합니다. 이제 이 클래스를 사용하여 에러 핸들링을 수행하는 웹 애플리케이션을 작성할 수 있습니다.

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        raise Exception("Oops! Something went wrong.")

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

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위 예제에서는 MainHandler 클래스에서 의도적으로 예외를 발생시키고, 이를 ErrorHandler 클래스를 이용하여 처리하는 애플리케이션을 작성했습니다. 예외가 발생하면 ErrorHandler 클래스의 write_error() 메소드가 호출되어 사용자에게 에러 메시지를 제공합니다.

전역 에러 핸들러

만약 애플리케이션 전역에서 발생한 예외를 일괄적으로 처리하고 싶다면, Application 클래스에서 settings 인자에 default_handler_class를 설정할 수 있습니다. 이를 통해 전역 에러 핸들러를 등록할 수 있습니다.

import tornado.ioloop
import tornado.web

class ErrorHandler(tornado.web.RequestHandler):
    def write_error(self, status_code, **kwargs):
        self.set_status(status_code)
        self.write("Oops! Something went wrong.")

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

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위 예제에서는 Application 클래스의 default_handler_classErrorHandler 클래스로 설정하였습니다. 따라서, 애플리케이션의 어느 부분에서 예외가 발생하더라도 ErrorHandler 클래스의 write_error() 메소드가 호출되어 에러를 처리합니다.

정리

Tornado 애플리케이션에서 에러를 적절하게 핸들링하는 것은 안정적인 서비스를 제공하기 위해 중요한 요소입니다. 이번 포스트에서는 Tornado의 에러 핸들링에 대해 알아보았습니다. write_error() 메소드를 오버라이드하여 에러 메시지를 작성하고, 애플리케이션의 라우트나 전역 핸들러에서 이를 사용할 수 있습니다.