💡 자세한 원인을 분석하고 싶으나 에러 재현하는 방법을 알 수 없어, 추후 동일 문제가 다시 나타날 경우 업데이트할 예정입니다.
1. Introduction
📌 Why aren't the changes being updated?
내 운영환경은 Windows 11이었고, VSCode 내장 터미널에 다음과 같이 애플리케이션을 실행 중이었다.
uvicorn app.main:app --reload --host=127.0.0.1 --port=8080
지금껏 아무런 문제가 발생한 적이 없고, 이번 작업은 코드 복잡도가 더 증가하기 전에 무지성으로 작업한 코드를 리팩토링 하는 간단한 일이었다.
그런데 리팩토링 도중 다음과 같은 에러가 발생했다.
2025-03-17 19:23:36,025 - [PID:16652/TID:6740] - app.common.aop.ApiLogRouter - [32mINFO[0m - API Request:
{'httpMethod': 'POST', 'path': '/api/v1/correct', 'headers': Headers({'user-agent': 'PostmanRuntime/7.43.2', 'accept': '*/*', 'cache-control': 'no-cache', 'postman-token': '6ac1b793-fea0-49e2-a432-10e233245398', 'host': '127.0.0.1:8080', 'accept-encoding': 'gzip, deflate, br', 'connection': 'keep-alive', 'content-length': '209715', 'content-type': 'audio/mp4'}), 'queryParameters': QueryParams('')}
2025-03-17 19:23:36,025 - [PID:16652/TID:6740] - app.domain.services.correct_text_helper - [31mERROR[0m - Error processing request: 'bytes' object has no attribute 'original'
2025-03-17 19:23:36,025 - [PID:16652/TID:6740] - app.api.routes.routes - [31mERROR[0m - Error processing request: 'bytes' object has no attribute 'original'
파라미터로 전달받은 command 객체에서 command.original로 값을 조회하는데, command가 bytes 타입으로 식별되고 있던 것이다.
파라미터를 bytes로 받은 건 임시로 구현할 때 잠시 끼워맞춘 방법이었으니, 그냥 변경 사항이 반영이 안 되었겠거니 싶어서 애플리케이션을 재실행했음에도 동일한 에러가 발생했다.
당연히 내가 놓친 부분이 있다고 생각해서 로그를 추가로 남겼으나, 반드시 나타나야 할 로그는 나오지도 않았다.

그래~ 한 번 해보자~~
2. Trial and Error
📌 trial1. --reload option
uvicorn 명령어에 reload 옵션을 추가하면, 소스 코드 변경마다 hot reload를 실행한다.
정확한 원리는 모르겠다만, 애플리케이션을 완전히 재실행하면 될 것이라 생각했으나 실패.
📌 trial2. pycache
파이썬 스크립트를 실행시키면 __pychache__라는 폴더와 함께 .pyc 확장자 파일이 하나 생기는 것을 볼 수 있다.
이게 일종의 성능 최적화용인데, python이 아무리 인터프리터 언어라지만 매번 소스코드 읽으면 아무래도 성능이 느릴 수밖에 없으니, 인터프리터는 항상 __pycache__ 폴더의 .pyc 파일이 최신 컴파일 버전이 있는 지 확인한다.
예전에 django 개발할 때 아직도 기억나는 건, 이 cache가 가끔 문제를 일으킬 때가 있었다는 것.
find . -name "__pycache__" -type d -exec rm -rf {} +
그래서 루트 폴더에서 __pycache__ 폴더를 전부 날려버리고, 이참에 잊어먹었던 .gitignore까지 등록해준 후 재실행 해보았다.
...그러나 여전히 코드 변경 사항이 반영이 되질 않았다.
📌 trail3. IDE
VSCode의 터미널을 사용한 것이 문제가 되는 건 아닐까 싶어서, PyCharm 2023 버전으로 실행했으나 동일 현상 반복
📌 trail4. PC restart
PC를 재시작해보겠다고 생각한 계기가 좀 웃긴데, Jupyter Notebook은 모듈을 한 번 불러오면 커널을 재시작할 때까지 다시 불러오지 않는다는 글을 읽었다.
이걸 읽고 "커널...재시작...? PC를 껐다 켜볼까?"라는 기적의 사고 흐름으로 이어졌다.
물론, 이런 주먹구구식 해결 방법을 혐오하지만,
이렇게까지 해도 문제가 해결이 안 되면 python 혹은 uvicorn을 low-level까지 파고 들어야 할 명분이 생길 테니,
공부할 게 늘어서 싱글벙글하면서 기대도 안 하고 PC를 재실행 했다.

왜 되는 건데
3. Reason?
📌 taskkill
다행히도 나만 이런 현상을 겪는 건 아니었는데, Stackoverflow와 Reddit에서 관련된 주제로 논의하는 것을 찾을 수 있었다.
PyCharm 쓰지 말고, 직접 명령어에 uvicorn 명령어 쳐서 실행하라는 조언은 나와 관련없으니 버리고,
한 가지 흥미로운 것은 다음 명령으로 실행 중인 모든 uvicorn 인스턴스를 확인하고, 모두 종료 후 재실행하라는 것이었다.
tasklist /FI "IMAGENAME eq python.exe"
taskkill /F /PID <프로세스ID>
그런데 port가 8080으로 고정되어 있는데, 프로세스가 두 개 이상 뜬다는 게 말이 되나..?
하지만 또 생각해보니 PC 재시작해서 되는 걸 보면, 진짜 이거 원인일 수도 있겠다는 생각이 들긴 한다.
당장 테스트해보고 싶은데, 문제가 다시 발생할 때까진 어떻게 해볼 방법이 없는 관계로 일단 미해결 상태로 포스팅을 남겨둔다.