[python] Flask-RESTful에서 예외 처리 방법

Flask-RESTful은 Flask 기반의 RESTful API를 개발하기 위한 도구입니다. 이를 사용하면 쉽게 API 엔드포인트를 생성하고 관리할 수 있습니다. 하지만 API를 개발할 때 예외 처리는 중요한 요소입니다. 이번 포스트에서는 Flask-RESTful에서 예외 처리하는 방법을 알아보겠습니다.

기본적인 예외 처리

Flask-RESTful에서 예외 처리를 위해 Api 클래스의 handle_error 데코레이터를 사용합니다. 이 데코레이터를 사용하면 특정 예외가 발생했을 때 어떻게 처리할지 정의할 수 있습니다. 아래는 예외 처리 예제입니다.

from flask_restful import Api, Resource

app = Flask(__name__)
api = Api(app)

@api.representation('application/json')
def handle_json_error(e):
    return {'message': str(e)}, 500

@api.representation('application/xml')
def handle_xml_error(e):
    return '<error>' + str(e) + '</error>', 500

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/hello')

if __name__ == '__main__':
    app.run()

위 예제에서 handle_json_error 함수는 JSON 형식의 응답을 처리하고, handle_xml_error 함수는 XML 형식의 응답을 처리합니다. 각각의 함수는 @api.representation 데코레이터를 사용하여 예외 처리 함수로 등록되어 있습니다.

특정 예외 처리

Flask-RESTful에서는 특정 예외를 처리하기 위해 abort 함수를 사용할 수도 있습니다. abort 함수는 HTTPException을 발생시키는 함수로, 클라이언트에게 응답이 전송되기 전에 바로 예외를 발생시킵니다. 아래는 abort 함수를 사용하여 404 예외를 처리하는 예제입니다.

from flask import abort
from flask_restful import Api, Resource

app = Flask(__name__)
api = Api(app)

class HelloWorld(Resource):
    def get(self):
        # Some condition to check if resource exists
        if not resource_found:
            abort(404, message="Resource not found")
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/hello')

if __name__ == '__main__':
    app.run()

위 예제에서 abort(404, message="Resource not found") 구문은 404 예외를 발생시키며, 클라이언트에게 “Resource not found” 메시지를 전송합니다.

커스텀 예외 처리

Flask-RESTful에서 커스텀 예외를 처리하려면 예외 클래스를 작성하고 Api 클래스의 errorhandler 데코레이터를 사용하여 예외 처리 함수를 등록해야 합니다. 아래는 커스텀 예외를 처리하는 예제입니다.

from flask_restful import Api, Resource
from werkzeug.exceptions import HTTPException

app = Flask(__name__)
api = Api(app)

class MyCustomException(HTTPException):
    code = 500
    description = "Something went wrong"

@api.errorhandler(MyCustomException)
def handle_custom_error(e):
    return {'message': e.description}, e.code

class HelloWorld(Resource):
    def get(self):
        raise MyCustomException()

api.add_resource(HelloWorld, '/hello')

if __name__ == '__main__':
    app.run()

위 예제에서 MyCustomException 클래스는 HTTPException을 상속받아 커스텀 예외를 정의합니다. 그리고 @api.errorhandler 데코레이터를 사용하여 예외 처리 함수를 등록합니다.

결론

Flask-RESTful에서 예외 처리는 API 개발에서 중요한 부분입니다. 우리는 handle_error 데코레이터를 사용하여 기본적인 예외 처리를 할 수 있고, abort 함수를 이용하여 특정 예외를 처리할 수 있습니다. 또한, 커스텀 예외를 만들어 처리하는 방법도 알아봤습니다. 이러한 예외 처리 기능을 통해 안정적이고 견고한 RESTful API를 개발할 수 있습니다.