fastapi 5

Pydantic BaseSettings로 환경변수 관리하기 – @property 패턴 적용기

https://kojub.tistory.com/24 Pydantic.BaseSetting을 사용한 환경변수 관리.env 파일은 중요한 설정과 변수들을 정의한다. DB 정보, URL, API Key 등과 같은 민감한 정보를 코드에 하드코딩하지 않고 관리할 수 있어 필수적인 파일이다.그러나 개발⸰테스트⸰배포 환경이나kojub.tistory.com 한 5개월 전에 Pydantic BaseSetting으로 환경변수 관리하는 config파일을 구성한 적 있다.import osfrom dotenv import load_dotenvfrom pydantic_settings import BaseSettingsload_dotenv()def _getenv(name: str, default: str = None) -> str..

Python 2025.06.13

FastAPI + Prometheus + Grafana 연동으로 모니터링 환경 구축하기 ( Prometheus )

프로젝트 init을 마친 후, prometheus + grafana 조합의 모니터링 시스템을 구축했다.이왕 만들 거, 추후에 API 상태 모니터링을 통해 좀 더 안정적인 서비스를 운영해보고자 연동을 해보았는데, 그 과정들을 살펴보자. prometheus FastAPI 적용1. docker desktop을 활성화 시킨 뒤, prometheus의 docker 이미지를 로컬에 다운로드 한다.docker pull prom/prometheus 2. 루트경로에 prometheus_data 폴더를 생성한 뒤, 그 안에 promehteus 설정파일 (promehteus.yml)을 만들어준다.global: scrape_interval: 15sscrape_configs:- job_name: 'bread-pilgrim'..

Monitoring 2025.05.31

[ FastAPI ] HTTPException에서 CustomException으로 예외 처리 개선

BaseResponse, 예외 상황에서도 잘 동작할까? 대화 속에서 발견한 설계 실수{ status_code : INT (200, 400, ... 같은 상태코드), data : 응답 DTO ( 실질적 데이터 ) message : STRING ( 추가적인 메세지 ) } 어제 안드로이드 개발자분과 이야기하면서, Exception 응답도 BaseResponse 형태로 내려주면 되는지에 대한 질문을 받았다."아뇨, 정상처리 됐을 때만 해당 응답구조로 내려줍니다." 아니 애초에 BaseResponse 클래스를 처음 만든 이유가 예외 처리든 정상 처리든 일관성 있게 응답을 관리하고, 클라이언트에서 에러 핸들링을 더 쉽게 할 수 있도록 하기 위해서였는데, 왜 그렇게 짰는지 의문이 들었다. (좋은 부분을 캐치해주신 ..

FastAPI 2025.03.20

FastAPI Response 구조 분석 및 공통 구조 커스텀하기

미들웨어 적용도 해볼 겸 API response 구조를 통일해보려 했다.문서를 보니, 미들웨어 적용 자체는 꽤 간단했다. ( response 내부 까보기 전까진..ㅎ ) https://fastapi.tiangolo.com/tutorial/middleware/#create-a-middleware Middleware - FastAPIFastAPI framework, high performance, easy to learn, fast to code, ready for productionfastapi.tiangolo.com pydantic으로 BaseResponse 클래스 만들고 적용 base_response.pyclass BaseResponse(BaseModel): """공통 response DTO"""..

FastAPI 2025.02.27

@asynccontextmanager로 DB연결 및 세션관리하기

사이드 프로젝트를 FastAPI와 MongoDB를 조합해서z 진행하고 있는데, 오늘 DB 연결과 세션 관리를 하다가  @asynccontextmanager 어노테이션을 쓰게 됐다. 원래는 그냥 평소처럼 함수 하나 만들어서 처리하려고 했는데, 이걸 쓰면 좀 더 깔끔하게 정리될 것 같아서 시도해봤다. ( 그동안은 try ~ except ~ finally 형태를 주로 썼다. )@asynccontextmanager로 정의한 함수를 어떻게 사용했는지 부터 살펴보자. ( get_db 함수 )routes/users.pyfrom beanie import PydanticObjectIdfrom fastapi import APIRouter, Dependsfrom app.db.mongodb import get_dbfrom a..

DB & ORM 2025.02.20