[FastAPI] 10. Middleware를 이용한 전후 처리

반응형

API를 호출할 때 처리 시간이 어느 정도 소모되는지 궁금하다거나 클라이언트로부터 요청을 받았을 때 받은 EndPoint와 데이터가 궁금하다면 어떻게 해야할까요?

 

 

 

Middleware

Spring에서는 Intercepter, Filter와 같은 중간 처리 방법이 있다면, Flask에서는 App Context 중 after_request나 before_request 등의 콜백 함수로 받아 처리하는 등 여러가지 방법이 있습니다.

 

FastAPI에는 Middleware 패턴을 가지고 있습니다. Middleware 패턴은 API 호출 전후를 중심으로 하나의 콜백 함수가 실행되고 난 뒤, API Router로 요청을 넘기는 패턴입니다.

 

클라이언트가 요청을 받으면 이 요청은 먼저 Middleware에서 받게 됩니다. 그리고 Middleware는 다시 이를 API Router로 넘기게 되는 방식으로 진행됩니다.

 

 

 

BaseHTTPMiddleware

FastAPI에서 제공하는 Middleware 패턴은 BaseHTTPMiddleware를 상속한 클래스들로 동작합니다. 이 클래스는 클라이언트로부터 요청이 오면 그 요청을 받은 뒤 dispatch 함수를 호출하는데, 우리는 이 dispatch 함수에서 중간 처리를 진행할 수 있습니다.

 

dispatch 함수에서는 BaseHTTPMiddleware가 클라이언트로부터 받은 요청과 EndPoint 함수를 파라미터로 제공하여 넘겨줍니다.

 

이를 활용해서 API 요청시 걸리는 시간을 Header에 포함해서 클라이언트로 넘겨주는 미들웨어를 만들어보도록 하겠습니다.

 

Python에서 제공하는 time 함수를 통해 미들웨어로부터 요청값을 받아온 시간을 start_time으로 지정해줍니다. 그리고 call_next를 호출하여 EndPoint 지점으로 요청값을 넘겨줍니다.

 

마지막으로 time 함수를 한 번 더 호출한 다음 start_time에 지정된 시간을 빼주면 총 API가 처리하는 데 걸리는 시간이 나오게 됩니다. 이를 call_next에서 반환 받은 response의 header 값에 넣어주면 클라이언트에게 이 값과 함께 전송되게 됩니다.

 

 

 

RequireJSON

클라이언트가 PUT, PATCH, POST 메소드를 호출했을 때 JSON 형태의 데이터만을 받도록 할 때도 미들웨어를 이용한다면 간단히 처리할 수 있습니다.

 

request의 정보 중에서 클라이언트가 요청한 메소드를 가져와 메소드를 확인하고, Header의 content-type이 application/json인지 확인해줍니다. 만약 application/json이 아니라면 415 상태를 반환해주고, 맞다면 요청을 EndPoint에 넘겨주면 간단히 구현할 수 있습니다.

 

 

 

 

마치며...

FastAPI에서도 Falcon, Nest.js와 마찬가지로 Middleware를 사용하여 간단하게 전후처리를 이용하며 이는 아주 접근성이 용이하여 쉽게 사용할 수 있다는 점이 장점이라고 생각합니다.

 

하지만 이러한 미들웨어에서도 지원이 미흡한 부분이 있는데, 이 이슈는 다음 글에서 다뤄보도록 하겠습니다.

 

 

 

P.S: 한동안 블로그 내에 문제가 생겨 포스팅을 잠정 중단했었습니다. 2차 도메인과 구글 크롬 브라우저의 문제점이 점점 악화되면서 2차 도메인 (https://blog.neonkid.xyz)를 잠정 폐쇄하기로 결정하였습니다. 따라서 제 블로그를 구독해주시는 분들이라면 1차 도메인 (https://byneonkid.tistory.com)을 이용해주면 감사하겠습니다.

반응형