- 복수 송장번호 검색 기능 최적화: routers/returns.py 파일의 단건 조회(/lookup) 및 벌크 입고(/receive/bulk) 내 orders 테이블 대상 SQL 쿼리 개선 / 기존 단일 송장번호 완전 일치 검사(B-Tree 인덱스 스캔)를 유지하면서, 불일치 시 명시적 IS NOT NULL 및 빈값 검사 방어 코드를 수행하여 안정성 확보 / 쉼표(,)나 공백( ) 외에도 슬래시(/) 및 세미콜론(;) 구분자('[,\s/;]+')까지 함께 분리 지원하여 다양한 입력 형태 호환 보장
- 코드 안정성 확보: 다중행 SQL 문자열에 raw string(r 접두사)를 적용하여 Python의 이스케이프 시퀀스 구문 경고(SyntaxWarning: '\s' is an invalid escape sequence) 해결
- 설정 조회 속도 개선을 위한 인메모리 캐싱 도입: read_config(force_refresh=False)로 변경하여 캐시가 존재하고 유효 기간(10분) 내인 경우 구글 시트 API 호출을 건너뛰고 메모리 데이터 즉시 반환 / 다중 스레드 환경을 고려한 threading.Lock 및 Double-Checked Locking 적용으로 동시성 안전 보장
- 실시간 데이터 일관성 유지: write_config(config) 함수 성공 시 새로 작성한 설정 로우(rows) 데이터로 로컬 캐시 즉시 최신화
- 신규 제어 장치 및 Warm up 추가: /api/config/refresh (POST) API 신설 (구글 시트 웹 문서에서 직접 변경 시 강제로 캐시를 갱신할 수 있는 기능 제공) / 서버 시작(startup_event) 시 캐시 초기 적재(Warm up) 처리 추가로 첫 로딩 딜레이 완전 차단
OMS 의 반품 신청 같은 서버-서버 호출은 사용자 세션이 없으므로 AuthGuard 가
401 로 막아왔다. INTERNAL_SERVICE_TOKEN env 가 설정돼 있고 요청 헤더
X-Service-Token 이 같은 값이면 세션 검사를 우회한다.
보안: NPM 의 /corm/ location 블록에서 외부에서 들어온 X-Service-Token 헤더를
proxy_set_header X-Service-Token ""; 로 strip 해야 외부에서 토큰 추측 공격 방지.
uvicorn --root-path 설정 시 ASGI scope.path 가 환경/버전에 따라 prepend 되는
경우가 있어 매칭이 어긋났다. raw path 가 APP_ROOT_PATH 로 시작하면 잘라내고,
아니면 그대로 사용하도록 정규화.
증상: GET /health/db → 302 (exempt 미작동), next=/corm/corm/ (이중 prefix).
request.url.path 는 uvicorn --root-path 가 prepend 된 형태(/corm/health/db)라
_AUTH_EXEMPT_PREFIXES 의 /health prefix 와 매칭 안 됐다. scope.path 는
root_path 가 제외된 형태(/health/db)라 정확히 매칭된다.
next_path 계산도 같이 정리 (이중 prefix 방지).
Starlette 의 add_middleware 는 마지막에 추가한 것이 가장 바깥(먼저 실행).
AuthGuardMiddleware 가 request.session 을 보려면 SessionMiddleware 가
먼저 scope 에 session 을 주입해야 한다. 따라서:
app.add_middleware(AuthGuardMiddleware) # 안쪽
app.add_middleware(SessionMiddleware, ...) # 바깥쪽 (먼저 실행)
주요 변경사항:
- DB 접속정보를 환경변수(.env) 방식으로 분리
- orderlist_app → orderlist_db 변경 (main.py, routers/returns.py)
- 네이버/카페24 API 키도 환경변수로 분리
- Dockerfile / docker-compose.yml 작성 (외부 PostgreSQL 네트워크 연결)
- .gitignore: 민감파일(.env, cafe24_tokens.json, manual-ordering.json) 제외
- 불필요 파일 정리 (venv, __pycache__, 일회성 스크립트, xlsx 등)
- README.md / .env.example / push_to_gitea.bat 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>