
파이썬으로 업무 자동화나 웹 서비스를 만들 때 필요한 기능을 모두 직접 구현할 필요는 없습니다. 파일 경로, 날짜 계산, 데이터 묶음, 로그, 명령행 옵션처럼 자주 반복되는 작업은 표준 라이브러리만으로도 안정적으로 처리할 수 있습니다. 표준 모듈을 잘 활용하면 외부 패키지 의존성이 줄고 배포 환경도 단순해집니다. 다만 이름만 알고 가져다 쓰는 것보다 자료형과 예외, 운영체제 차이를 이해한 뒤 사용하는 것이 실무에서 더 중요합니다.
pathlib로 안전하게 파일 경로 다루기
문자열을 슬래시로 이어 붙이면 윈도우와 리눅스의 경로 구분자 차이, 중복 구분자, 상대 경로 문제를 만나기 쉽습니다. pathlib의 Path 객체는 경로 결합과 존재 확인, 파일 탐색을 읽기 쉬운 형태로 제공합니다. 예를 들어 Path('data') / 'users.json'처럼 작성하면 운영체제에 맞는 경로가 만들어집니다. 파일을 열 때는 read_text(encoding='utf-8')처럼 문자 인코딩을 명시해야 한글 깨짐을 줄일 수 있습니다.
파일 처리 체크포인트
- 사용자가 전달한 경로는
resolve()후 허용된 디렉터리 안인지 확인합니다. - 파일 존재 여부와 디렉터리 여부를 구분합니다.
- 중요 파일을 덮어쓰기 전 임시 파일에 저장한 뒤 교체합니다.
- 대용량 파일은 전체를 한 번에 읽지 말고 줄 단위로 처리합니다.
경로 탐색 결과를 무조건 삭제하거나 이동해서는 안 됩니다. 심볼릭 링크와 상위 경로 이동이 섞이면 의도한 작업 폴더 밖의 파일을 건드릴 수 있으므로 최종 절대 경로를 검증해야 합니다.
datetime과 zoneinfo로 시간 오류 줄이기
서버 시간은 단순한 시각 문자열이 아닙니다. 지역과 일광절약시간을 고려해야 하며, 시간대 정보가 없는 datetime과 있는 datetime을 섞으면 비교 오류가 생깁니다. 내부 저장은 UTC 기준의 시간대 포함 값으로 통일하고 화면에 표시할 때 사용자의 지역 시간으로 변환하는 방식이 안전합니다. 파이썬의 zoneinfo는 운영체제의 시간대 데이터베이스를 사용해 Asia/Seoul 같은 지역을 표현합니다.
날짜에 하루를 더하는 것과 정확히 24시간을 더하는 것은 일광절약시간이 있는 지역에서 결과가 다를 수 있습니다. 예약 업무에서는 ‘현지 날짜의 다음 날 오전 9시’인지 ‘현재부터 24시간 뒤’인지 요구사항을 먼저 구분해야 합니다. 다른 언어와 연동할 때는 ISO 8601 형식과 UTC 오프셋을 포함해 전달하고 초와 밀리초 단위도 문서화합니다.
collections로 데이터 집계를 간결하게
Counter는 값의 빈도를 세고, defaultdict는 키가 없을 때 기본 자료형을 생성합니다. 주문 상태별 건수를 세는 작업은 Counter(order.status for order in orders)처럼 표현할 수 있습니다. 다만 defaultdict를 API 응답에 그대로 사용하면 접근만 해도 키가 생성되는 부수 효과가 생길 수 있으므로 외부로 반환할 때 일반 dict로 바꾸는 것이 좋습니다. deque는 양쪽 끝에서 데이터를 넣고 빼는 작업이 빠르므로 최근 로그 버퍼나 너비 우선 탐색에 유용합니다.
dataclasses로 데이터 구조를 명확하게
서로 관련된 값을 딕셔너리로만 넘기면 키 오타를 실행 중에야 발견하고 어떤 필드가 필요한지 알기 어렵습니다. dataclass를 사용하면 필드와 기본값을 한곳에 정의할 수 있습니다. 변경되면 안 되는 값 객체에는 frozen=True를 고려하고, 리스트처럼 변경 가능한 기본값은 직접 []를 쓰지 말고 field(default_factory=list)를 사용해야 인스턴스 간 데이터 공유 버그를 피할 수 있습니다.
실무 원칙: dataclass는 입력 검증 도구가 아니므로 외부 요청의 자료형과 범위 검사는 별도로 수행해야 합니다.
logging으로 운영 가능한 기록 남기기
print는 빠른 확인에는 편하지만 시간, 심각도, 모듈명, 요청 식별자를 일관되게 남기기 어렵습니다. logging 모듈을 사용해 DEBUG, INFO, WARNING, ERROR 수준을 구분하고 설정은 애플리케이션 시작점에서 한 번만 적용합니다. 라이브러리 모듈에서 basicConfig를 호출하면 사용하는 애플리케이션의 로그 정책을 덮을 수 있습니다.
오류를 기록할 때는 logger.exception으로 스택 추적을 포함하되 비밀번호, 토큰, 주민번호, 결제 정보는 로그에 남기지 않습니다. 구조화 로그를 쓰면 다른 언어의 서비스와 필드를 맞추기 쉽습니다. 요청 ID, 서비스명, 버전, 처리 시간을 공통 필드로 정하면 분산된 시스템에서도 한 요청의 흐름을 찾을 수 있습니다.
argparse와 환경 변수의 역할 나누기
명령행 도구는 argparse로 필수 옵션, 선택값, 도움말을 정의할 수 있습니다. 실행할 때마다 달라지는 입력 파일이나 작업 모드는 명령행 인자로 받고, 비밀키와 배포 환경 설정은 환경 변수나 비밀 저장소로 분리합니다. 기본값이 위험한 삭제나 공개 배포를 수행하게 해서는 안 되며, 실제 변경 작업에는 명시적인 옵션을 요구하는 편이 안전합니다.
contextlib로 자원 정리 보장하기
파일과 데이터베이스 연결은 오류가 나더라도 닫혀야 합니다. with 문은 컨텍스트가 끝날 때 정리 작업을 보장합니다. 직접 컨텍스트 관리자를 만들 때는 contextlib의 contextmanager를 사용할 수 있지만, 예외를 실수로 삼키지 않도록 주의해야 합니다. 트랜잭션에서는 성공 시 커밋하고 실패 시 롤백하는 규칙을 명확히 구현합니다.
표준 모듈 적용 순서
- 반복되는 문자열 경로를 Path 객체로 교체합니다.
- 시간 저장 형식과 시간대 정책을 통일합니다.
- 집계 코드를 Counter와 defaultdict로 단순화합니다.
- 딕셔너리 데이터의 구조를 dataclass로 명시합니다.
- print를 수준별 logging으로 전환합니다.
- 파일과 연결 객체를 with 문으로 관리합니다.
- 정상 입력뿐 아니라 파일 없음과 권한 오류도 테스트합니다.
표준 라이브러리는 설치 없이 사용할 수 있다는 점 외에도 오랫동안 검증된 API와 문서를 제공한다는 장점이 있습니다. 무조건 외부 패키지를 피할 필요는 없지만, 작은 문제부터 표준 모듈로 해결할 수 있는지 확인하면 유지보수 비용을 낮출 수 있습니다.
한 줄 요약: pathlib, datetime, collections, dataclasses, logging을 제대로 익히면 파이썬 실무 코드가 더 짧고 안전하며 운영하기 쉬워집니다.