왜 작업 환경부터 정리해야 하는가
업무 자동화는 보통 작은 스크립트 하나에서 시작한다. 엑셀 파일 이름을 바꾸거나, 폴더 안의 파일 목록을 정리하거나, 매일 반복해서 보내는 보고서 초안을 만드는 식이다. 처음에는 코드 몇 줄이면 충분해 보인다. 하지만 자동화가 실제 업무에 들어가면 상황이 달라진다.
내 컴퓨터에서는 잘 실행되던 코드가 동료 컴퓨터에서는 실행되지 않을 수 있다. 패키지 버전이 달라 결과가 바뀔 수 있다. API 키나 비밀번호를 코드에 그대로 적어 두었다가 보안 문제가 생길 수도 있다. 오류가 났는데 어디서 실패했는지 기록이 남지 않으면, 자동화는 오히려 관리 부담이 된다.
그래서 파이썬 자동화의 첫 단계는 문법을 많이 외우는 것이 아니다. 반복해서 실행해도 안전한 작업 환경을 만드는 것이다. 이번 장에서는 업무 자동화 프로젝트를 시작할 때 필요한 기본 구성을 만든다.
자동화 스크립트의 기본 흐름은 다음과 같이 생각하면 쉽다.
입력을 확인한다.
데이터를 처리한다.
결과를 저장한다.
실행 기록을 남긴다.
필요하면 사람에게 알린다.
이 흐름을 안정적으로 만들기 위해 파이썬 설치, 가상환경, 패키지 관리, 기본 문법, 환경 변수, 로그와 예외 처리를 차례로 준비한다.
AI 생성 이미지
업무용 파이썬 환경 구성하기
업무 자동화용 환경은 복잡할 필요가 없다. 처음에는 다음 네 가지면 충분하다.
파이썬 실행 환경
가상환경
패키지 관리자
코드 편집기
파이썬은 3.11 이상 버전을 권장한다. 회사에서 표준 버전을 정해 두었다면 그 기준을 따른다. 중요한 것은 최신 버전을 무조건 쓰는 것이 아니라, 팀에서 같은 버전을 재현할 수 있게 관리하는 것이다.
코드 편집기는 Visual Studio Code처럼 파이썬 확장을 지원하는 도구를 쓰면 편하다. 자동완성, 오류 표시, 터미널 실행, 파일 탐색을 한 화면에서 처리할 수 있기 때문이다.
프로젝트 폴더는 업무 단위로 나눈다.
automation-sales-report/
data/
output/
logs/
src/
config.json
requirements.txt
README.md각 폴더와 파일의 역할은 단순해야 한다.
data/: 입력 파일을 둔다.output/: 자동화 결과물을 저장한다.logs/: 실행 기록을 저장한다.src/: 파이썬 코드를 둔다.config.json: 반복해서 바뀌는 설정값을 둔다.requirements.txt: 필요한 패키지 목록을 둔다.README.md: 실행 방법과 주의사항을 적는다.
이렇게 나누면 나중에 자동화가 커져도 파일이 섞이지 않는다. 특히 data, output, logs를 분리하는 습관은 중요하다. 원본 데이터와 결과 파일이 섞이면 실수로 원본을 덮어쓸 수 있다.
가상환경과 패키지 관리자 사용하기
가상환경은 프로젝트별로 독립된 파이썬 실행 공간을 만드는 기능이다. 예를 들어 A 프로젝트는 pandas 2.x 버전을 쓰고, B 프로젝트는 다른 버전을 써야 할 수 있다. 가상환경을 쓰면 서로 영향을 주지 않는다.
프로젝트 폴더에서 다음 명령을 실행한다.
python -m venv .venv만약 macOS나 Linux에서 python 명령이 동작하지 않는다면 python3 -m venv .venv처럼 실행하면 된다. 회사 PC에서는 이미 설치된 파이썬 명령 이름이 다를 수 있으므로, 처음 한 번은 python --version 또는 python3 --version으로 버전을 확인해 두는 것이 좋다.
이제 가상환경을 활성화한다. Windows의 명령 프롬프트에서는 다음과 같이 실행한다.
.venvScriptsactivateWindows PowerShell을 사용한다면 보통 다음 명령을 쓴다.
..venvScriptsActivate.ps1macOS나 Linux에서는 다음과 같이 실행한다.
source .venv/bin/activate활성화되면 터미널 앞에 (.venv) 표시가 붙는다. 이제 패키지를 설치하면 이 프로젝트 안에서만 사용된다.
pip install pandas openpyxl python-dotenv설치한 패키지 목록은 파일로 저장한다.
pip freeze > requirements.txt다른 사람이 같은 환경을 만들 때는 다음 명령을 실행하면 된다.
pip install -r requirements.txt업무 자동화에서는 이 과정이 매우 중요하다. 자동화 스크립트는 한 번 만들고 끝나는 것이 아니라, 나중에 다른 컴퓨터나 서버에서 실행될 수 있다. 그때 필요한 패키지가 문서화되어 있지 않으면 재현이 어렵다.
자동화에서 자주 쓰는 기본 문법
파이썬 문법 전체를 한 번에 외울 필요는 없다. 자동화에서 자주 쓰는 개념부터 익히면 된다. 가장 많이 쓰는 것은 파일 경로, 날짜, 문자열, 리스트, 딕셔너리다.
파일 경로
업무 자동화는 대부분 파일을 읽고 쓰는 일에서 시작한다. 이때 문자열로 경로를 직접 이어 붙이기보다 pathlib을 쓰는 것이 안전하다.
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
DATA_DIR = BASE_DIR / 'data'
OUTPUT_DIR = BASE_DIR / 'output'
input_file = DATA_DIR / 'sales.xlsx'
output_file = OUTPUT_DIR / 'sales_summary.xlsx'
print(input_file)Path를 쓰면 Windows와 macOS의 경로 구분자 차이를 덜 신경 써도 된다. 또한 BASE_DIR, DATA_DIR처럼 기준 폴더를 변수로 만들어 두면 코드가 읽기 쉬워진다.
날짜
자동화 결과물에는 날짜가 자주 들어간다. 예를 들어 매일 생성되는 보고서 파일명에 실행일을 붙일 수 있다.
from datetime import datetime
today = datetime.now().strftime('%Y-%m-%d')
file_name = f'sales_report_{today}.xlsx'
print(file_name)날짜를 파일명에 넣으면 이전 결과를 덮어쓰지 않고 보관할 수 있다. 다만 회사의 파일명 규칙이 있다면 그 규칙을 따르는 것이 좋다.
문자열
문자열은 메일 제목, 보고서 문장, 파일명, 로그 메시지를 만들 때 계속 사용된다.
department = '영업팀'
count = 128
message = f'{department} 처리 대상 파일은 {count}건입니다.'
print(message)f-string은 변수 값을 문장 안에 넣는 간단한 방법이다. 자동화 결과를 사람이 읽기 좋은 문장으로 만들 때 유용하다.
리스트
리스트는 여러 값을 순서대로 담는 자료형이다. 여러 파일을 반복 처리할 때 자주 쓴다.
files = ['a.xlsx', 'b.xlsx', 'c.xlsx']
for file in files:
print(f'처리 중: {file}')실제 업무에서는 폴더 안의 파일 목록을 읽어 반복 처리하는 방식으로 확장된다.
for file_path in DATA_DIR.glob('*.xlsx'):
print(f'엑셀 파일 발견: {file_path.name}')딕셔너리
딕셔너리는 이름과 값을 짝으로 저장한다. 설정값, 코드 매핑, API 요청 데이터처럼 구조가 있는 정보를 다룰 때 많이 쓴다.
status_map = {
'A': '승인',
'R': '반려',
'P': '대기'
}
code = 'P'
print(status_map.get(code, '알 수 없음'))딕셔너리를 잘 쓰면 조건문을 길게 늘어놓지 않고도 값을 변환할 수 있다.
비밀번호와 API 키는 코드에 쓰지 않는다
업무 자동화가 외부 서비스나 사내 시스템과 연결되면 API 키, 비밀번호, 토큰 같은 민감한 정보가 필요하다. 이 값을 코드에 직접 적으면 안 된다.
나쁜 예는 다음과 같다.
API_KEY = 'my-secret-key'
PASSWORD = '1234'이렇게 작성한 코드를 메신저로 공유하거나 저장소에 올리면 민감 정보가 함께 퍼진다. 대신 환경 변수를 사용한다. 환경 변수는 운영체제나 실행 환경에 저장해 두고, 파이썬 코드에서는 값을 불러오기만 하는 방식이다.
실무에서는 .env 파일을 많이 사용한다.
API_KEY=실제_API_키
DB_PASSWORD=실제_비밀번호파이썬에서는 다음처럼 읽을 수 있다.
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv('API_KEY')
db_password = os.getenv('DB_PASSWORD')
if not api_key:
raise ValueError('API_KEY가 설정되어 있지 않습니다.').env 파일은 절대 공유 저장소에 올리지 않는다. 프로젝트에는 .env.example 파일만 만들어 둔다.
API_KEY=여기에_API_키를_입력하세요
DB_PASSWORD=여기에_DB_비밀번호를_입력하세요그리고 Git을 사용한다면 .gitignore에 .env와 .venv/를 추가해 두는 것이 좋다.
.env
.venv/이렇게 하면 동료는 어떤 값이 필요한지 알 수 있고, 실제 비밀값과 개인별 실행 환경은 각자 안전한 위치에 보관할 수 있다.
설정 파일을 코드에서 분리하기
자동화 스크립트에는 자주 바뀌는 값이 있다. 입력 폴더, 출력 폴더, 보고서 수신자, 최소 처리 금액, 실행 옵션 같은 값이다. 이런 값을 코드 안에 직접 넣으면 변경할 때마다 코드를 수정해야 한다.
간단한 자동화에서는 JSON 설정 파일을 사용할 수 있다.
{
"input_folder": "data",
"output_folder": "output",
"minimum_amount": 100000,
"notify_email": "[email protected]"
}파이썬에서 읽는 코드는 다음과 같다.
import json
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
config_path = BASE_DIR / 'config.json'
with open(config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
minimum_amount = config['minimum_amount']
print(minimum_amount)설정 파일을 분리하면 업무 담당자가 바뀌어도 코드 구조를 크게 건드리지 않아도 된다. 자동화의 재사용성도 높아진다.
로그와 예외 처리로 실행 기록 남기기
자동화는 조용히 실행되기 때문에 기록이 중요하다. 화면에 print()만 찍으면 실행이 끝난 뒤 확인하기 어렵다. 운영용 스크립트에서는 logging을 사용한다.
import logging
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
LOG_DIR = BASE_DIR / 'logs'
LOG_DIR.mkdir(exist_ok=True)
logging.basicConfig(
filename=LOG_DIR / 'automation.log',
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
encoding='utf-8'
)
logging.info('자동화 작업을 시작합니다.')로그에는 최소한 다음 내용이 남아야 한다.
언제 실행했는가
어떤 입력을 사용했는가
몇 건을 처리했는가
어디에 결과를 저장했는가
어떤 오류가 발생했는가
예외 처리는 오류가 났을 때 프로그램이 무너지는 방식을 관리하는 것이다. 예외를 모두 숨기면 안 된다. 대신 예상 가능한 오류는 친절하게 기록하고, 중요한 오류는 사람이 확인할 수 있게 남겨야 한다.
try:
logging.info('입력 파일 확인을 시작합니다.')
if not input_file.exists():
raise FileNotFoundError(f'입력 파일이 없습니다: {input_file}')
logging.info(f'입력 파일 확인 완료: {input_file.name}')
except FileNotFoundError as e:
logging.error(e)
raise
except Exception:
logging.exception('알 수 없는 오류가 발생했습니다.')
raiselogging.exception()은 오류 메시지뿐 아니라 오류가 발생한 위치도 함께 남긴다. 운영 중 문제를 찾을 때 큰 도움이 된다.
재사용 가능한 스크립트 구조 만들기
처음에는 코드를 위에서 아래로 쭉 작성해도 된다. 하지만 조금만 길어지면 함수를 나누는 것이 좋다. 함수는 하나의 작업을 이름 붙여 재사용하는 단위다.
다음은 자동화 스크립트의 기본 구조다.
from pathlib import Path
import logging
BASE_DIR = Path(__file__).resolve().parent.parent
DATA_DIR = BASE_DIR / 'data'
OUTPUT_DIR = BASE_DIR / 'output'
LOG_DIR = BASE_DIR / 'logs'
def setup_logging():
LOG_DIR.mkdir(exist_ok=True)
logging.basicConfig(
filename=LOG_DIR / 'automation.log',
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
encoding='utf-8'
)
def validate_input(input_file):
if not input_file.exists():
raise FileNotFoundError(f'입력 파일이 없습니다: {input_file}')
def process_file(input_file, output_file):
logging.info(f'처리 시작: {input_file.name}')
# 실제 처리 로직은 이후 장에서 작성한다.
output_file.write_text('처리 결과 예시', encoding='utf-8')
logging.info(f'처리 완료: {output_file.name}')
def main():
setup_logging()
logging.info('자동화 실행 시작')
input_file = DATA_DIR / 'sample.txt'
output_file = OUTPUT_DIR / 'result.txt'
OUTPUT_DIR.mkdir(exist_ok=True)
validate_input(input_file)
process_file(input_file, output_file)
logging.info('자동화 실행 종료')
if __name__ == '__main__':
try:
main()
except Exception:
logging.exception('자동화 실행 실패')
raise이 구조에는 중요한 습관이 들어 있다.
첫째, main()에 전체 흐름을 모은다. 그러면 코드의 시작점이 분명해진다.
둘째, 입력 확인과 처리 로직을 나눈다. 입력이 잘못되었는데 처리를 시작하면 결과가 더 복잡하게 망가질 수 있다.
셋째, 로그 설정을 별도 함수로 둔다. 나중에 로그 파일명이나 형식을 바꿔도 수정 범위가 작다.
넷째, 예외를 기록한 뒤 다시 발생시킨다. 오류를 숨기지 않아야 운영자가 실패를 알 수 있다.
작은 자동화도 운영 기준을 갖춘다
파이썬 자동화는 코드 몇 줄로도 시작할 수 있다. 하지만 업무에 쓰이는 순간부터는 운영 기준이 필요하다. 다음 항목을 기본 점검표로 삼자.
프로젝트 폴더가 업무 단위로 분리되어 있는가
가상환경을 사용하고 있는가
필요한 패키지가
requirements.txt에 기록되어 있는가원본 데이터와 결과 파일이 분리되어 있는가
API 키와 비밀번호가 코드에 직접 들어 있지 않은가
설정값이 코드와 분리되어 있는가
실행 로그가 남는가
입력 파일이 없거나 형식이 다를 때 오류를 알 수 있는가
다른 사람이 실행 방법을 읽고 따라 할 수 있는가
이 기준은 복잡한 시스템을 만들기 위한 것이 아니다. 작은 자동화를 오래 쓰기 위한 최소한의 장치다.
다음 장부터는 이 환경을 바탕으로 엑셀과 파일 업무를 자동화한다. 파일을 읽고, 정리하고, 결과를 저장하는 일은 대부분의 업무 자동화에서 반복되는 기본 동작이다. 이번 장에서 만든 폴더 구조, 가상환경, 설정 파일, 로그와 예외 처리 방식은 이후 예제에서도 계속 사용된다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.