출처 : 변성윤님 블로그.
출처 : 부스트캠프 AI Tech.
1. FastAPI 익숙해지기
1.1 Event Handler
- 이벤트가 발생했을 때, 그 처리를 담당하는 함수
- FastAPI에선 Application이 실행할 때, 종료될 때 특정 함수를 실행할 수 있음
- @app.on_event(“startup”)
- @app.on_event(“shutdown”)
- 예시
- startup 할 때 머신러닝 모델 Load
- shutdown 할 때 로그 저장
- @app.on_event(“startup”)
- @app.on_event(“shutdown”)
1.2 API Router
- API Router는 더 큰 애플리케이션들에서 많이 사용되는 기능
- API Endpoint를 정의
- Python Subpackage
- APIRouter는 Mini FastAPI로 여러 API를 연결해서 활용
- 기존에 사용하던 @app.get, @app.post을 사용하지 않고, router 파일을 따로 설정하고 app에 import해서 사용
- python3 12_api_router.py
- user Router, order Router 2개 생성
- app에 연결(include_router)
- 실제 활용한다면 하나의 파일에 저장하지 않고 각각 저장
- (user.py, order.py)
- 2개의 Router가 추가됨
- 예제 프로젝트 구조
1.3 Error Handling
- Error Handling은 웹 서버를 안정적으로 운영하기 위해 반드시 필요한 주제
- 서버에서 Error가 발생한 경우, 어떤 Error가 발생했는지 알아야 하고 요청한 클라이언트에 해당 정보를 전달해 대응할 수 있어야 함
- 서버 개발자는 모니터링 도구를 사용해 Error Log를 수집해야 함
- 발생하고 있는 오류를 빠르게 수정할 수 있도록 예외 처리를 잘 만들 필요가 있음
- python3 13_exception_handling.py
- 간단한 코드지만 Error를 발생할 확률이 높음
- item_id가 1~3까진 정상
- 4 이상의 숫자가 들어올 경우 Key Error가 발생 - Internal Server Error
@app.get("/v1/{item_id}")
async def find_by_id(item_id: int):
return items[item_id]
- item_id가 1일 경우 정상적으로 200 Return
- item_id가 5일 경우 Internal Server Error 500 Return
- item_id가 5일 경우 Internal Server Error 500 Return
- 이렇게 되면 클라이언트는 어떤 에러가 난 것인지 정보를 얻을 수 없고, 자세한 에러를 보려면서버에 직접 접근해서 로그를 확인해야 함
- 에러 핸들링을 더 잘 하려면 에러 메시지와 에러의 이유 등을 클라이언트에 전달하도록 코드를 작성해야 함
@app.get("/v2/{item_id}")
async def find_by_id(item_id: int):
try:
item = items[item_id]
except KeyError:
raise HTTPException(status_code=404, detail=f"아이템을 찾을 수 없습니다 [id: {item_id}]")
return item
- FastAPI의 HTTPException은 Error Response를 더 쉽게 보낼 수 있도록 하는 Class
- HTTPException을 이용해서 클라이언트에게 더 자세한 에러 메시지를 보내는 코드 작성
- item_id가 1일 경우 정상적으로 200 Return
- item_id가 5일 경우 아이템을 찾을 수 없습니다 Return
1.4 Background Task
- FastAPI는 Starlett이라는 비동기 프레임워크를 래핑해서 사용
- FastAPI의 기능 중 Background Tasks 기능은 오래 걸리는 작업들을 background에서 실행함
- Online Serving에서 CPU 사용이 많은 작업들을 Background Task로 사용하면,
- 클라이언트는 작업 완료를 기다리지 않고 즉시 Response를 받아볼 수 있음
- 특정 작업 후, 이메일 전송하는 Task 등
- Background Tasks를 사용하지 않은 작업들은 작업 시간 만큼 응답을 기다림
- Background Tasks를 사용한 작업들은 기다리지 않고 바로 응답을 주기 때문에 0초 소요
- 실제 작업은 Background에서 실행됨
- 작업 결과물을 조회할 때는 Task를 어딘가에 저장해두고, GET 요청을 통해 Task가 완료됐는지 확인
- 결과 비교
2. FastAPI가 어렵다면
- 1) 프로젝트 구조를 어떻게 잡아야 할지 모르겠다
- 2) 객체 지향이 낯설다
- 3) 백엔드 프로그래밍 자체가 처음
- 4) 목표의 부재
2.1 프로젝트 구조 - Cookiecutter
- 쿠키를 만들 때 사용하는 Cookiecutter
- 많은 사람들이 프로젝트 구조에 대한 고민이 많아 템플릿을 서로 공유
- https://github.com/cookiecutter/cookiecutter
- CLI 형태로 프로젝트 생성 과정을 도와줌
- 회사에서 공통의 프로젝트 구조가 필요하면 쿠키 커터로 설정
- 개인용 쿠키 커터 템플릿을 만드는 것도 좋은 방법
- (Cookiecutter Data Science)[https://github.com/drivendata/cookiecutter-data-science]
- (cookitcutter-fastapi)[https://github.com/arthurhenrique/cookiecutter-fastapi]
- 아예 처음 진행할 때는 일단 하나의 파일에 모두 코드 작성해서 FastAPI에 익숙해지고
- 그 이후에 다른 프로젝트 구조를 참고해서 코드 개선
- 클린 아키텍처 류의 책을 보면서 계속 구조 고민해보기
2.2 객체 지향
- 절차형 프로그래밍 vs 객체 지향 프로그래밍의 차이 이해해보기
- 객체 지향 프로그래밍은 코드의 중복을 최소화해서 재사용성을 증가시킴
- 복잡한 로직이 들어갈수록 점점 빛을 발휘함
- 현재 가지고 있는 코드를 Class로 변경해보기
- Pydantic Use Case 탐색하기
2.3 Try & Error
- 백엔드 프로그래밍이 처음이면 낯선 것이 당연
- 코드를 작성하고 => 실행하고 => 수정하는 Flow
- 조급해하지 않고 작은 규모의 프로젝트부터 하나씩 만들기
- 목표를 설정하고(무엇을 만들겠다) => 기능을 정의 => 하나씩 구현
- 막연히 FastAPI를 학습해야지보다는 프로젝트를 FastAPI 백엔드로 구현! 등으로 목표 설정
'MLOps' 카테고리의 다른 글
MLOps - 16.Logging (0) | 2022.05.31 |
---|---|
MLOps - 15. Docker (0) | 2022.05.30 |
MLOps - 13. FastAPI (0) | 2022.05.28 |
MLOps - 12. FastAPI (0) | 2022.05.27 |
MLOps - 11. CI/CD, Github Action (0) | 2022.05.26 |
댓글