fastapi에서는 application 안에 application을 넣을 수 있습니다. sub application이라고 칭하겠습니다. 이 sub application들을 mount를 하면, 각 어플리케이션 별로 미들웨어 등을 넣을 수 있어요. 분리를 한다? 예를 들어, health check 어플리케이션이랑, api 어플리케이션이랑 분리할 수 있습니다.

 

 이 방법을 간단하게 알아볼 거에요. 

 


 먼저 패키지 구조부터 보겠습니다. 별 다른 것은 없고요. sub 패키지 안에 sub_app_1.py와 sub_app_2.py가 있는 구조에요.

 

 먼저 main.py를 보겠습니다. app_1과 app_2를 import 하는데요. 하나는 /sub1에, 다른 하나는 /sub2에 mount 합니다. 여기까지 어렵지 않지요? 여기까지 그림으로 그려보겠습니다.

 

 /sub1은 어플리케이션 인스턴스 app_1에 mapping이 되고, /sub2는 어플리케이션 인스턴스 app_2에 매핑됩니다. 이 어플리케이션 인스턴스에는 여러 가지 설정들을 할 수 있는데요. 대표적으로 get, post와 같이 api를 추가할 수도 있고, 미들웨어를 추가할 수도 있어요.

 

 먼저, app_1을 봅시다. app_1 = FastAPI()라고 되어 있어요. 어플리케이션 인스턴스를 선언했어요. 이 app_1은 메인 어플리케이션 객체에 mount 되어 있어서, subapp이라고 할 수 있어요. 여기에는 어떤 설정이 있나요? app_1.get("/health") 정도만 있어요. get /health 정도만 추가로 있네요. 여기까지 그림으로 그려 보겠습니다.

 

 

 그렇기 때문에, get /sub1/health로 접근하면 "ok"가 나오게 됩니다. 이제 sub2를 보겠습니다.

 

 여기도 마찬가지로 어플리케이션 인스턴스를 생성하였어요. 다른 점이 하나 있다면, 미들웨어를 하나 추가했다는 것입니다. 뭔가 이상한 것을 추가한 것을 볼 수 있는데요. TrustedHostMiddleware입니다. allowed_hosts를 "localhost"로만 설정해 놓았음을 볼 수 있어요.

 

 그러면 이것도 그림으로 그려볼게요.

 

 

 요래 되었네요. 결국, app_1과 달리, app_2는 Trusted Host 미들웨어를 타게 됩니다. 여기까지 정리하면 sub app으로 어플리케이션을 분리해서 mount를 시켜 놓았습니다. 각 sub app별로 middleware를 설정하였기 때문에, 어떤 api endpoint에서는 미들웨어를 타고, 어떤 곳에서는 타지 않게 하려면 이 방법을 쓰는 방법도 나쁘지 않습니다.

 

 이제, postman으로 호출을 한 번 해 보겠습니다.

 


 먼저, http://127.0.0.1:8000/sub/health를 호출해 보겠습니다. /sub1에 mount된 app의 경우에는 아무런 Trusted Host 미들웨어가 걸려있지 않습니다. 고로, 응답은 아래와 같이 오게 됩니다.

 

 200 OK가 잘 수행되었네요.

 

 문제는 /sub2/health입니다. 127.0.0.1:8000의 경우 host가 127.0.0.1이였기 때문에, middleware에서 Invalid host header가 뜨면서, 400 에러를 떨구게 됩니다.

 

 

 대신에 GET http://localhost:8000/sub2/health 요래 호출하면 이야기가 달라집니다. 이 때에는 host가 localhost로 잡힙니다.

 

 이것은 허용 host 옵션에 있기 때문에, 200이 떨어지게 됩니다.