🧩 BE

공통 스키마 및 예외 처리 모듈 구현

Assigned To
Date
2026/02/10
Status
Done
Type
Issue
Server
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)