[python] aiohttp에서의 오류 처리 방법

aiohttp는 Python의 비동기 웹 프레임워크로서, 클라이언트와 서버 간의 네트워크 통신을 처리하는 데 많이 사용됩니다. 오류 처리는 웹 애플리케이션의 안정성과 신뢰성을 보장하기 위해 중요한 부분입니다. 이번 글에서는 aiohttp에서 오류를 처리하는 방법에 대해 살펴보겠습니다.

오류 처리기 만들기

aiohttp에서의 오류 처리는 사용자 정의 오류 처리기를 만들어 처리할 수 있습니다. 커스텀 오류 처리기를 만들기 위해서는 aiohttp.web.Application 클래스를 사용해야 합니다. 다음은 aiohttp에서 오류 처리기를 만드는 간단한 예제입니다:

from aiohttp import web

async def handle_404(request):
    return web.Response(text='404 Not Found', status=404)

app = web.Application()
app.router.add_route('GET', '/{name}', handle_404)

web.run_app(app)

위의 코드에서는 / 경로로 들어오는 모든 GET 요청에 대해 handle_404 함수가 호출되도록 설정하고 있습니다.

기본 오류 처리기 설정하기

때로는 모든 오류에 대해 동일한 처리를 하고 싶을 수 있습니다. 이 경우에는 aiohttp.web.middleware 모듈의 ErrorMiddleware 클래스를 사용하여 기본 오류 처리기를 설정할 수 있습니다. 아래의 예제 코드를 보겠습니다:

from aiohttp import web
from aiohttp.web_exceptions import HTTPException
from aiohttp.web_middlewares import normalize_path_middleware, middleware

@middleware
async def error_middleware(request, handler):
    try:
        response = await handler(request)
        return response
    except HTTPException as ex:
        # HTTP 예외 처리
        return web.Response(text='An error occurred', status=ex.status)
    except Exception:
        # 기타 예외 처리
        return web.Response(text='An error occurred', status=500)

app = web.Application(middlewares=[normalize_path_middleware(), error_middleware])

# 라우터 설정 등을 추가적으로 수행

web.run_app(app)

위의 코드에서는 error_middleware 함수를 정의하여 모든 예외를 처리하는 기본 오류 처리기를 만들었습니다. HTTPException은 aiohttp가 제공하는 예외 클래스로, HTTP 상태 코드와 함께 처리됩니다. 그 외에 발생하는 모든 예외는 500 상태 코드와 함께 처리됩니다.

커스텀 예외 처리하기

마지막으로, 특정 상황에 맞게 커스텀 예외를 처리하고 싶을 수 있습니다. 이 경우에는 HTTPException을 서브 클래스로 정의하여 예외를 생성하고, 해당 예외를 처리하는 방법을 정의하면 됩니다. 아래의 예제 코드를 참고하세요:

from aiohttp import web
from aiohttp.web_exceptions import HTTPNotFound

class CustomNotFoundException(HTTPNotFound):
    def __init__(self, message):
        super().__init__()
        self.message = message

async def handle_custom_not_found(request):
    raise CustomNotFoundException('Custom Not Found Error')

app = web.Application()
app.router.add_route('GET', '/{name}', handle_custom_not_found)

web.run_app(app)

위의 코드에서는 CustomNotFoundException 클래스를 정의하여 HTTPNotFound 클래스를 상속하였습니다. 이 클래스를 사용하면 특정 상황에 맞는 커스텀 예외를 발생시킬 수 있습니다. handle_custom_not_found 함수에서는 CustomNotFoundException 예외를 발생시키고 있습니다.

이번 글에서는 aiohttp에서의 오류 처리 방법에 대해 알아보았습니다. aiohttp는 유연한 오류 처리 기능을 제공하므로, 애플리케이션의 안정성과 신뢰성을 높이기 위해 적절하게 활용하는 것이 좋습니다.