Table of contents
Issue Point
기존에 custom exception, global exception handler 구현을 통해 예외처리를 깔끔하게 구성
but 해당 기능은 어디까지나 exception이기에, try-catch 쪽에서 failback 처리 하는 정도로만 사용됐고, 이번에 전반적인 로그 개선도 해보고자 응답 에러 형식, 성공 형식을 정규화
app/common 모듈에 적용하고, 날짜 검증 등 validatior도 공통 모듈로 처리하면 좋을 것 같음
Detail
•
exception
•
success response
•
fail response
로그 개선
ELB-HealthChecker/2.0 로그 반복적으로 발생. INFO → WARNING으로 로깅 레벨 내리기. 아니면 해당 user_agent 값 예외처리
•
app/core/middleware.py 에 관련 로직 존재
# 헬스체크 요청은 로그에서 제외
if request.url.path == "/health" and response.status_code == 200:
return response
Python
복사
예외처리 개선
•
성공 (2xx)
{
"success": true,
"data": { ... }, // JSON 형식
"error": null
}
Shell
복사
•
실패 (4xx / 5xx)
{
"success": false,
"data": null,
"error": {
"code": "NOT_FOUND",
"message": "No data found for platform 'naver' on date '2025-01-01'"
}
}
Shell
복사
위와 같이 success, data, error로 envelope하여 최종 응답 형식을 통일
기존에는 main.py에서 { "detail": "~~" } 형식으로 반환
•
ReponseWrapperMiddleware class 추가
core 모듈에 response.py 파일을 작성하여 ResponseWrapperMiddleware 클래스를 만들었다.
해당 코드는 2xx + Json 응답에만 적용하며, 위의 개선된 응답 형식에 따라 응답을 래핑
4xx/5xx 응답에 대한 경우는 main.py의 global handler가 처리하기에 건너뜀
ErrorCode | ErrorMessage |
400 | VALIDATION_ERROR |
404 | NOT_FOUND |
422 | VALIDATION_ERROR |
500 | INTERNAL_ERROR |
502 | EXTERNAL_SERVICE_ERROR |
날짜 Validator 공통 모듈 처리
위와 같이 router 코드에서 날짜 형식 검증 패턴이 반복. 이를 공통 validator 함수로 모듈화 해서 불필요한 반복을 줄이고 재사용성을 개선
from datetime import datetime
from app.core.exceptions import ValidationError
def validate_date_format(date: str) -> str:
try:
datetime.strptime(date, "%Y-%m-%d")
except ValueError:
raise ValidationError("Invalid date format. Please use YYYY-MM-DD format.")
return date
Python
복사
validator.py
레이어 요약
•
Router → 입력 검증, 의존성 주입, 응답 조립
•
Service → 비즈니스 로직, 데이터 가공/집계
•
Query → SQLAlchemy 쿼리 실행
•
Model → ORM 엔티티 정의
•
Schema → Pydantic 응답 모델 + 매핑
•
Cache → DynamoDB 캐시 (article/top 에서 cache-first → DB fallback)

