봇 타임스탬프가 항상 자정으로 찍히던 버그 수정
목차
datetime.combine 으로 잘못 만들어진 타임스탬프가 봇 로직 안에서 조용히 쌓이고 있었다.
배경: 왜 이게 문제였나
bot/generate.py 안에서 "현재 시각"을 만들어야 하는 로직이 있었는데, 거기에 datetime.combine 이 쓰이고 있었다. 처음 보면 크게 이상해 보이지 않는다. datetime.combine 자체가 잘못된 함수는 아니니까. 문제는 의도와 실제 동작의 불일치에 있었다.
datetime.combine 은 date 객체와 time 객체를 합쳐서 datetime 객체를 만드는 함수다. "오늘 날짜 + 특정 시각" 같이 고정 시각을 조합할 때 쓰는 게 맞다. 반면 "지금 이 순간"을 가져오려면 datetime.now() 를 써야 한다. 둘의 용도는 완전히 다른데, 코드 안에선 "현재 시각"이 필요한 자리에 combine 이 들어가 있었던 것.
이런 실수가 생기는 패턴이 있다. datetime 모듈을 from datetime import datetime 으로 임포트하면 datetime.now() 가 자연스럽게 쓰이는데, 모듈 자체를 import datetime 으로 가져왔을 때는 datetime.datetime.now() 처럼 네임스페이스가 달라진다. 이 혼용이 누적되면 "어, 이거 그냥 combine 으로 만들면 되지 않나?" 식의 엉뚱한 우회가 코드에 슬며시 끼어든다.
# 잘못된 패턴: combine 으로 현재 시각을 만들려는 시도
import datetime
now = datetime.datetime.combine(
datetime.date.today(),
datetime.time() # 이러면 자정(00:00:00) 고정
)
# 올바른 패턴
now = datetime.datetime.now()
위처럼 datetime.time() 을 넘기면 자정이 기본값이라 "오늘 00:00:00" 이 찍힌다. 봇이 이 값을 기준으로 스케줄 계산이나 로그 타임스탬프를 만들면, 실행 시각이 항상 자정으로 고정되는 조용한 버그가 생긴다. 모니터링 로그만 봐선 당장 터지는 에러가 없으니 한동안 발견이 안 될 수도 있다.
변경 내용
bot/generate.py 한 파일, 핀포인트 수정이다.
| 항목 | 변경 전 | 변경 후 |
|---|---|---|
| 타임스탬프 생성 | datetime.combine(date.today(), time()) |
datetime.now() |
| 실제 값 | 오늘 자정(00:00:00) 고정 | 실행 시점 정확한 시각 |
| 의도와 일치 여부 | ❌ | ✅ |
줄 수는 몇 줄 안 되는 변경이지만, 이 파일이 봇의 생성 로직 핵심이라면 타임스탬프 하나가 downstream 에 미치는 영향은 크다. 로그 집계, 배치 중복 방지, 실행 이력 추적 등이 모두 이 값을 참조할 수 있으니까.
회고: 모듈 임포트 패턴을 팀 안에서 통일해야 하는 이유
이번 fix 를 하면서 다시 한번 느낀 건, datetime 모듈 임포트 패턴이 파일마다 제각각이면 이런 실수가 반복된다는 점이다.
import datetime→datetime.datetime.now()from datetime import datetime→datetime.now()from datetime import datetime, date, time→ 각각 직접 사용
세 가지가 혼용되면 리뷰어도 놓치기 쉽다. 특히 datetime.combine 은 IDE 에서 자동완성으로 쉽게 뜨기 때문에, 타입이 맞아 보이는 이상 정적 분석도 경고를 안 내는 경우가 있다.
팀 차원에서는 린트 룰이나 프로젝트 컨벤션으로 임포트 스타일을 하나로 맞춰두는 게 가장 확실한 예방책이다. 코드리뷰에서 "왜 combine 썼어요?" 를 한 번이라도 더 잡을 수 있으면 좋지만, 리뷰 단계에서 잡으려면 컨텍스트를 정확히 알아야 하니 도구로 강제하는 게 낫다.
봇 코드는 특히 "조용한 버그" 에 취약하다. 사람이 직접 호출하는 API 와 달리, 배치/봇은 결과가 틀려도 즉시 피드백이 없다. 그래서 타임스탬프처럼 기준값이 되는 로직은 더 꼼꼼하게 봐야 한다는 걸 이번에 다시 새겼다.
다음
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.