자동화 slecs

봇 타임스탬프가 항상 자정으로 찍히던 버그 수정

목차

datetime.combine 으로 잘못 만들어진 타임스탬프가 봇 로직 안에서 조용히 쌓이고 있었다.


배경: 왜 이게 문제였나

bot/generate.py 안에서 "현재 시각"을 만들어야 하는 로직이 있었는데, 거기에 datetime.combine 이 쓰이고 있었다. 처음 보면 크게 이상해 보이지 않는다. datetime.combine 자체가 잘못된 함수는 아니니까. 문제는 의도와 실제 동작의 불일치에 있었다.

datetime.combinedate 객체와 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 datetimedatetime.datetime.now()
  • from datetime import datetimedatetime.now()
  • from datetime import datetime, date, time → 각각 직접 사용

세 가지가 혼용되면 리뷰어도 놓치기 쉽다. 특히 datetime.combine 은 IDE 에서 자동완성으로 쉽게 뜨기 때문에, 타입이 맞아 보이는 이상 정적 분석도 경고를 안 내는 경우가 있다.

팀 차원에서는 린트 룰이나 프로젝트 컨벤션으로 임포트 스타일을 하나로 맞춰두는 게 가장 확실한 예방책이다. 코드리뷰에서 "왜 combine 썼어요?" 를 한 번이라도 더 잡을 수 있으면 좋지만, 리뷰 단계에서 잡으려면 컨텍스트를 정확히 알아야 하니 도구로 강제하는 게 낫다.

봇 코드는 특히 "조용한 버그" 에 취약하다. 사람이 직접 호출하는 API 와 달리, 배치/봇은 결과가 틀려도 즉시 피드백이 없다. 그래서 타임스탬프처럼 기준값이 되는 로직은 더 꼼꼼하게 봐야 한다는 걸 이번에 다시 새겼다.

다음


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.