본문 바로가기
카테고리 없음

RPA 실전 예시: 대학생이 만든 보고서 자동화 시스템 공개!

by makeseed 2025. 4. 25.
반응형

보고서 자동화 시스템 대표 이미지

"누구나 따라할 수 있게, 과정부터 결과까지 정리해봤어요"

안녕하세요, 지난 포스팅에서 RPA의 개념과 활용 사례에 대해 이야기했는데요, 많은 분들이 "실제 코드가 궁금해요", "어떻게 시작해야 할지 모르겠어요"라는 댓글을 남겨주셨어요. 그래서 오늘은 제가 실제로 구현한 보고서 자동화 시스템의 모든 것을 공개합니다! 코딩을 처음 접하는 분들도 따라 할 수 있도록 최대한 쉽게 설명해드릴게요.

📌 들어가며 – 자동화, 말만 쉽지 어떻게 하지?

인턴 생활 2주 차, 저에게 주어진 첫 미션은 "주간 마케팅 데이터 보고서 자동화"였습니다. 매주 엑셀에 쌓이는 데이터를 기반으로 분석 보고서를 작성하는 일이었는데요, 이 작업에는 다음과 같은 문제가 있었습니다:

  • 매주 반복적인 내용으로 보고서 작성 (데이터만 변경)
  • 엑셀 데이터 → 한글(HWP) 문서 수동 입력의 번거로움
  • 만들고 나면 결재자들에게 일일이 이메일 발송 필요
  • 매주 4시간씩 소요되는 비효율적인 업무

사실 처음엔 "이걸 어떻게 자동화하지...?" 하고 막막했어요. 하지만 이 작업을 통해 실제로 업무 시간을 4시간 → 10분으로 줄이는 데 성공했고, 그 과정에서 배운 내용을 여러분과 공유하려고 합니다!

🔧 사용한 도구와 환경 소개

제가 사용한 주요 도구와 환경은 다음과 같습니다:

1. 핵심 프로그래밍 환경

  • Python 3.9 - 전체 자동화 로직 구현
  • Visual Studio Code - 코드 작성 에디터
  • Anaconda - 가상환경 및 패키지 관리

2. 주요 라이브러리

  • pandas - 엑셀 데이터 처리
  • openai - GPT API 연동
  • python-docx - Word 문서 생성
  • win32com - HWP, PDF 변환
  • smtplib, email - 이메일 자동 발송

3. 필요한 API 키

  • OpenAI API 키 - GPT 모델 사용

4. 추가 도구

  • Git/GitHub - 코드 버전 관리
  • Windows 작업 스케줄러 - 자동 실행 스케줄링

대부분의 라이브러리는 pip를 통해 간단히 설치할 수 있습니다:

pip install pandas openai python-docx pywin32

🔄 자동화 흐름 설계하기

자동화 시스템을 만들기 전에 전체 흐름을 설계하는 것이 중요합니다. 제가 구현한 시스템은 다음 4단계로 구성됩니다:

[엑셀 데이터 읽기] → [GPT로 보고서 내용 생성] → [문서 자동 작성] → [이메일 자동 발송]

 

1. 데이터 수집 단계

첫 번째로 엑셀 데이터를 읽어들이는 과정입니다:

import pandas as pd

def read_excel_data(file_path):
    """엑셀 파일에서 마케팅 데이터를 읽어오는 함수"""
    try:
        # 엑셀 파일 읽기
        df = pd.read_excel(file_path, sheet_name='Weekly_Data')
        
        # 주요 지표 추출 (예: 주간 매출, 광고 클릭률 등)
        weekly_revenue = df['Revenue'].sum()
        avg_ctr = df['CTR'].mean()
        top_channel = df['Channel'].value_counts().idxmax()
        
        # 추출한 데이터를 사전 형태로 반환
        data = {
            'weekly_revenue': f"{weekly_revenue:,.0f}원",
            'avg_ctr': f"{avg_ctr:.2f}%",
            'top_channel': top_channel,
            'data_period': f"{df['Date'].min()} ~ {df['Date'].max()}"
        }
        
        return data, df
    
    except Exception as e:
        print(f"엑셀 데이터 읽기 오류: {e}")
        return None, None

이 함수는 주간 마케팅 데이터가 담긴 엑셀 파일을 읽고, 주요 지표(매출, 클릭률, 최고 성과 채널 등)를 추출합니다. 이 데이터는 다음 단계에서 GPT API로 전송될 것입니다.

2. GPT를 활용한 보고서 내용 생성

추출한 데이터를 기반으로 GPT API를 사용해 보고서 본문을 자동으로 생성합니다:

import openai
import os
from dotenv import load_dotenv

# .env 파일에서 API 키 로드 (보안을 위해)
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")

def generate_report_content(data):
    """GPT를 사용하여 보고서 내용을 생성하는 함수"""
    try:
        prompt = f"""
        다음 주간 마케팅 데이터를 바탕으로 보고서 내용을 작성해주세요:
        
        기간: {data['data_period']}
        주간 매출: {data['weekly_revenue']}
        평균 클릭률: {data['avg_ctr']}
        최고 성과 채널: {data['top_channel']}
        
        다음 섹션으로 구성된 보고서를 작성해주세요:
        1. 주간 성과 요약 (간략한 핵심 성과 요약)
        2. 핵심 지표 분석 (각 지표별 의미와 시사점)
        3. 주요 성공 요인 (최고 성과 채널 및 성공 요인)
        4. 다음 주 제안 사항 (데이터 기반 다음 주 마케팅 전략 제안)
        
        전문적이고 간결한 비즈니스 문체로 작성해주세요.
        """
        
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "당신은 전문 마케팅 보고서 작성 전문가입니다."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.7,
            max_tokens=1500
        )
        
        report_content = response.choices[0].message['content'].strip()
        
        # 섹션별로 분리
        sections = {}
        current_section = ""
        current_content = []
        
        for line in report_content.split('\n'):
            if line.startswith('1. ') or line.startswith('2. ') or line.startswith('3. ') or line.startswith('4. '):
                if current_section and current_content:
                    sections[current_section] = '\n'.join(current_content)
                    current_content = []
                current_section = line
            elif current_section:
                current_content.append(line)
        
        if current_section and current_content:
            sections[current_section] = '\n'.join(current_content)
        
        return sections
    
    except Exception as e:
        print(f"GPT API 오류: {e}")
        return None

💡 보안 팁: OpenAI API 키를 코드에 직접 넣지 말고, .env 파일이나 환경 변수를 사용하세요. 이렇게 하면 실수로 API 키가 GitHub에 공개되는 것을 방지할 수 있습니다. .env 파일은 다음과 같이 생성합니다:

OPENAI_API_KEY=your_api_key_here

3. 문서 자동 작성 (Word, PDF, HWP)

생성된 보고서 내용을 기반으로 다양한 형식의 문서를 자동으로 생성합니다:

from docx import Document
import win32com.client as win32
import os
import time

def create_word_document(data, sections, df, output_path):
    """워드 문서 생성 함수"""
    doc = Document()
    
    # 제목 추가
    doc.add_heading(f"주간 마케팅 성과 보고서 ({data['data_period']})", 0)
    
    # 섹션별 내용 추가
    for section, content in sections.items():
        doc.add_heading(section, level=1)
        doc.add_paragraph(content)
    
    # 핵심 지표 테이블 추가
    doc.add_heading("핵심 지표 요약", level=1)
    table = doc.add_table(rows=1, cols=2)
    table.style = 'Table Grid'
    
    # 테이블 헤더
    header_cells = table.rows[0].cells
    header_cells[0].text = "지표"
    header_cells[1].text = "값"
    
    # 데이터 행 추가
    for key, value in data.items():
        if key != 'data_period':  # 기간은 이미 제목에 포함됨
            row_cells = table.add_row().cells
            row_cells[0].text = key.replace('_', ' ').title()
            row_cells[1].text = str(value)
    
    # 문서 저장
    doc.save(output_path)
    return output_path

def convert_to_hwp_and_pdf(word_path):
    """워드 문서를 HWP와 PDF로 변환하는 함수"""
    try:
        # Word 애플리케이션 실행
        word = win32.Dispatch('Word.Application')
        word.Visible = False
        
        # Word 문서 열기
        doc = word.Documents.Open(word_path)
        
        # PDF로 저장
        pdf_path = word_path.replace('.docx', '.pdf')
        doc.SaveAs(pdf_path, FileFormat=17)  # 17은 PDF 형식을 의미
        
        # HWP로 저장 (Word에서 직접 HWP로 변환은 어렵습니다)
        # 따라서 HWP로 저장하기 위해 한글 프로그램 사용
        doc.Close()
        
        # 한글 프로그램 실행 (한글이 설치되어 있어야 함)
        hwp = win32.Dispatch('HWP.Application')
        hwp.Visible = False
        hwp.Open(pdf_path)
        
        hwp_path = word_path.replace('.docx', '.hwp')
        hwp.SaveAs(hwp_path, 'HWP')
        hwp.Quit()
        
        word.Quit()
        
        return pdf_path, hwp_path
    
    except Exception as e:
        print(f"문서 변환 오류: {e}")
        return None, None

⚠️ 실패 사례: 처음에는 python-hwp 라이브러리를 사용해 HWP 문서를 직접 생성하려 했으나, 여러 버전 호환성 문제가 발생했습니다. 결국 한글 프로그램을 COM 인터페이스로 제어하는 방식으로 변경했습니다. 이처럼 라이브러리에 의존하기보다는 실제 설치된 프로그램을 활용하는 방식이 더 안정적인 경우가 많습니다.

4. 이메일 자동 발송

마지막으로, 생성된 보고서를 이메일로 자동 발송합니다:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import os

def send_email(receivers, subject, body, attachments):
    """보고서를 이메일로 발송하는 함수"""
    try:
        # 이메일 계정 정보 (환경 변수에서 로드)
        sender_email = os.getenv("EMAIL_USERNAME")
        sender_password = os.getenv("EMAIL_PASSWORD")
        smtp_server = "smtp.gmail.com"  # Gmail 사용 예시
        smtp_port = 587
        
        # 이메일 메시지 생성
        msg = MIMEMultipart()
        msg['From'] = sender_email
        msg['To'] = ', '.join(receivers)
        msg['Subject'] = subject
        
        # 본문 추가
        msg.attach(MIMEText(body, 'plain'))
        
        # 첨부 파일 추가
        for file_path in attachments:
            with open(file_path, 'rb') as file:
                attach = MIMEApplication(file.read(), _subtype="docx")
                attach.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file_path))
                msg.attach(attach)
        
        # SMTP 서버 연결 및 이메일 발송
        with smtplib.SMTP(smtp_server, smtp_port) as server:
            server.starttls()  # TLS 보안 연결
            server.login(sender_email, sender_password)
            server.send_message(msg)
            
        print(f"이메일 발송 완료: {', '.join(receivers)}")
        return True
    
    except Exception as e:
        print(f"이메일 발송 오류: {e}")
        return False

이 함수는 생성된 보고서 파일을 첨부하여 지정된 수신자에게 이메일을 발송합니다. 이메일 보안을 위해 계정 정보는 환경 변수로 관리합니다.

🔄 전체 시스템 통합

위의 모든 함수를 통합하여 하나의 완전한 자동화 시스템을 구축합니다:

def main():
    """보고서 자동화 메인 함수"""
    print("주간 마케팅 보고서 자동화 시스템을 시작합니다...")
    
    # 1. 엑셀 데이터 읽기
    excel_path = "weekly_marketing_data.xlsx"
    data, df = read_excel_data(excel_path)
    
    if not data:
        print("데이터 읽기에 실패했습니다. 프로그램을 종료합니다.")
        return
    
    # 2. GPT로 보고서 내용 생성
    sections = generate_report_content(data)
    
    if not sections:
        print("보고서 내용 생성에 실패했습니다. 프로그램을 종료합니다.")
        return
    
    # 3. 워드 문서 생성
    current_dir = os.path.dirname(os.path.abspath(__file__))
    output_dir = os.path.join(current_dir, "reports")
    os.makedirs(output_dir, exist_ok=True)
    
    timestamp = time.strftime("%Y%m%d")
    word_path = os.path.join(output_dir, f"마케팅보고서_{timestamp}.docx")
    
    create_word_document(data, sections, df, word_path)
    
    # 4. PDF와 HWP 변환
    pdf_path, hwp_path = convert_to_hwp_and_pdf(word_path)
    
    if not pdf_path or not hwp_path:
        print("문서 변환에 일부 실패했습니다.")
    
    # 5. 이메일 발송
    receivers = ["manager@company.com", "director@company.com"]
    subject = f"[주간 마케팅 보고서] {data['data_period']}"
    body = f"""
    안녕하세요,
    
    {data['data_period']} 기간의 주간 마케팅 보고서를 첨부합니다.
    
    핵심 실적:
    - 주간 매출: {data['weekly_revenue']}
    - 평균 클릭률: {data['avg_ctr']}
    - 최고 성과 채널: {data['top_channel']}
    
    자세한 내용은 첨부 파일을 확인해 주세요.
    
    감사합니다.
    마케팅팀 인턴 홍길동 드림
    """
    
    attachments = [word_path]
    if pdf_path:
        attachments.append(pdf_path)
    if hwp_path:
        attachments.append(hwp_path)
    
    send_email(receivers, subject, body, attachments)
    
    print("보고서 자동화 프로세스가 완료되었습니다.")

if __name__ == "__main__":
    main()

🔄 Windows 작업 스케줄러로 자동 실행 설정

마지막으로, 이 스크립트를 매주 자동으로 실행하도록 Windows 작업 스케줄러를 설정합니다:

  1. Windows 작업 스케줄러 열기
  2. "기본 작업 만들기" 클릭
  3. 이름과 설명 입력 (예: "주간 마케팅 보고서 자동화")
  4. 트리거 설정 (매주 금요일 오후 5시 등)
  5. 동작 설정에서 "프로그램 시작"을 선택하고 Python 실행 파일과 스크립트 경로 지정:
    • 프로그램/스크립트: C:\Path\To\Python\python.exe
    • 인수 추가: C:\Path\To\Your\Script\marketing_report_automation.py
  6. 필요한 추가 설정을 완료하고 "완료" 클릭

![작업 스케줄러 설정 스크린샷](이미지 추가 권장)

📊 실행 결과 및 효과

실제로 이 시스템을 구현한 후 얻은 결과는 놀라웠습니다:

  • 시간 절약: 매주 4시간 → 10분으로 단축 (자동 실행 시 0분)
  • 일관성 향상: 매주 동일한 품질과 형식의 보고서 생성
  • 오류 감소: 수동 데이터 입력 과정에서 발생하는 실수 제거
  • 업무 만족도 상승: 반복 작업 대신 더 가치 있는 업무에 집중

가장 흥미로웠던 점은 팀 리더가 이 자동화 보고서가 GPT로 작성된 것임을 전혀 눈치채지 못했다는 것입니다. 오히려 "보고서 퀄리티가 많이 올라갔네요"라는 긍정적인 피드백을 받았습니다! 😄

🌟 해보고 느낀 점 + 팁

배운 점

  • GPT 프롬프트 최적화가 핵심: 처음에는 단순히 "보고서 작성해줘"라고 요청했더니 내용이 너무 일반적이었어요. 구체적인 지시와 데이터를 제공하니 품질이 크게 향상되었습니다.
  • 자동화는 완벽보다는 작동하는 것이 중요: 처음부터 모든 것을 자동화하려 하기보다 작은 부분부터 시작해 점진적으로 개선하는 접근이 효과적이었습니다.
  • 에러 처리는 필수: 실제 운영에서는 예상치 못한 상황이 발생합니다. try-except로 적절한 에러 처리를 해두니 중간에 문제가 생겨도 전체 시스템이 멈추지 않았습니다.

주의사항 & 팁

  1. OpenAI API 요금 주의: GPT API는 사용량에 따라 비용이 발생합니다. 무한 루프 등으로 API를 과도하게 호출하지 않도록 주의하세요.
  2. 이메일 보안: Gmail을 사용할 경우 "앱 비밀번호"를 생성해야 할 수 있습니다. 2단계 인증을 설정한 후 앱 비밀번호를 발급받으세요.
  3. 문서 변환 환경: HWP 변환은 한글 프로그램이 설치된 환경에서만 작동합니다. 실행 환경을 미리 확인하세요.
  4. 실패 대비 백업 방안: 자동화 시스템이 실패할 경우를 대비해 항상 백업 계획을 마련해두세요.

🚀 다음 단계: 더 발전시킬 수 있는 아이디어

이 시스템을 더 발전시킬 수 있는 몇 가지 아이디어를 공유합니다:

  1. 데이터 시각화 추가: matplotlib이나 seaborn을 사용해 자동으로 그래프를 생성하고 보고서에 삽입
  2. 웹 인터페이스 구축: Flask나 Streamlit으로 간단한 웹 대시보드 만들기
  3. 알림 시스템 추가: 슬랙이나 카카오톡으로 보고서 생성 알림 보내기
  4. 데이터 소스 확장: 구글 애널리틱스, 페이스북 광고 등 다양한 소스에서 데이터 자동 수집하기

🔄 마무리

이렇게 Python, OpenAI API, 문서 자동화를 조합해 반복적인 보고서 작업을 완전히 자동화하는 방법을 알아보았습니다. 이 글이 여러분의 업무나 학업에서 반복적인 작업을 자동화하는 데 도움이 되었으면 좋겠습니다.

혹시 구현 과정에서 어려움이 있거나 질문이 있으시면 댓글로 남겨주세요! 제 경험을 바탕으로 최대한 도움드리겠습니다. 또한 여러분만의 자동화 사례가 있다면 공유해주세요. 다양한 아이디어를 나누면 더 좋은 자동화 솔루션을 만들 수 있을 것입니다! 😊

다음 포스팅에서는 자동화는 어디까지 가능할까? GPT로 이메일 답장까지 자동화해봤습니다라는 주제로 찾아뵙겠습니다. 기대해주세요!

 

반응형