피드로 돌아가기
Building a Countdown Timer CLI in Python — time, finally, mock, and Testing Exceptions
Dev.toDev.to
Backend

Python time.sleep과 try-finally를 활용한 인터럽트 대응 CLI 타이머 설계

Building a Countdown Timer CLI in Python — time, finally, mock, and Testing Exceptions

Uya2026년 6월 28일17beginner

Context

단순 값 계산 중심의 기존 프로젝트에서 벗어나 시간 제어 및 예외 처리 기반의 상태 관리 필요성 증대. 사용자 인터럽트(Ctrl+C) 발생 시 프로그램의 비정상 종료를 방지하고 안정적인 종료 시퀀스를 보장하는 구조적 설계가 요구됨.

Technical Solution

  • Separation of Concerns 원칙에 따라 메뉴 I/O(main.py)와 타이머 핵심 로직(timer.py)을 분리한 계층 구조 설계
  • range(seconds, 0, -1) 기반의 역순 루프와 time.sleep(1)을 조합하여 정밀한 시간 단계 제어 구현
  • \r(Carriage Return), end="", flush=True 설정을 통한 터미널 라인 오버라이팅으로 실시간 UI 업데이트 최적화
  • try-except-finally 블록을 통한 KeyboardInterrupt 및 일반 Exception의 통합 캡처와 공통 종료 메시지 보장
  • unittest.mock.patch를 통해 time.sleep을 Mocking하여 의도적인 Exception 발생 및 예외 처리 경로 검증

- CLI UI 구현 시 `\r`과 `flush=True`를 조합하여 화면 깜빡임 없는 상태 업데이트 적용 - 외부 라이브러리나 시간 제어 함수 의존성이 있는 로직 테스트 시 Mock 대상을 '호출 지점' 기준으로 설정하여 테스트 격리성 확보 - 예외 발생 여부와 상관없이 실행되어야 하는 리소스 해제나 종료 알림은 `finally` 블록에 배치하여 원자성 확보

원문 읽기