Spec

바디코디 + 온스튜디오
통합 자동화 1단계

두 관리자 시스템에서 오늘의 수업·예약 데이터를 모아, 매일 아침 8시에 한 통의 메일로 받아본다. 온스튜디오 신청자는 바디코디에 자동으로 예약 등록된다.

2026-05-04 v0.1 draft 담당 midbar_@naver.com
01 Overview

한눈에 보기

대상 시스템
2
바디코디 · 온스튜디오
발송 시각
08:00
매일 아침
수신 채널
1
네이버 메일
핵심 가치
오전 8시 한 통의 메일로 두 시스템의 오늘 일정과 예약 현황을 통합 파악하고, 온스튜디오 신청자를 바디코디에 자동 동기화하여 수동 작업을 제거한다.
02 Flow

동작 흐름

07:50

launchd 자동 트리거

macOS launchd가 메인 스크립트를 실행한다. cron보다 안정적이며, 절전 모드에서도 깨워서 실행할 수 있다.

07:51

두 시스템 병렬 로그인 · 스크래핑

Playwright로 바디코디와 온스튜디오에 각각 로그인하여 오늘 날짜의 수업 일정과 예약자 명단을 수집한다.

07:55

온스튜디오 → 바디코디 자동 예약

온스튜디오 신청자를 바디코디 동일 시간 수업에 예약 등록한다. 이름이 있으면 그대로, 없으면 오붓 1, 오붓 2… 형식으로 표기. 이미 등록한 예약은 state.json으로 추적해 중복 방지.

07:58

통합 데이터 → HTML 메일 본문 생성

두 시스템 결과를 시간순 하나의 타임라인으로 병합하고 자동 동기화 결과 섹션을 함께 구성한다.

08:00

네이버 SMTP로 발송

midbar_@naver.com로 한 통의 메일을 발송한다. 앱 비밀번호 기반 SMTP 인증.

03 Mail Sample

메일 본문 예시

한 수업 당 두 시스템 신청자를 묶어 보여주고, 총인원과 자동 동기화 결과를 한 줄로 명시한다. 시간순 정렬.

📧 Subject: [수업알림] 2026-05-04 (월) 오늘의 수업 · 총 N명
# 📅 2026-05-04 (월) 오늘의 수업
   수업 3개 · 총 12명 · 동기화 2건 완료

─────────────────────────────────────
🕖 07:00 · 모닝요가 / 강사 김XX
   바디코디 (3명) — 이경수, 이미림, 이차린
   온스튜디오 (2명) — 이정, 미연
   ▸ 총 5명온스튜디오 2명(이정·미연) 바디코디 등록 완료

─────────────────────────────────────
🕘 09:00 · 그룹PT / 강사 이ZZ
   바디코디 (4명) — 정수정, 최한솔, 강예린, 김도윤
   온스튜디오 (0명) — 없음
   ▸ 총 4명

─────────────────────────────────────
🕙 10:30 · 필라테스 / 강사 박YY
   바디코디 (1명) — 김도윤
   온스튜디오 (2명) — 오붓1, 오붓2  # 이름 미수집
   ▸ 총 3명온스튜디오 2명 바디코디 등록 실패 (정원 초과)
표기 규칙
  • 이름 모를 때 — 온스튜디오에서 이름을 받지 못한 경우 오붓1, 오붓2… 순번 표기
  • 해당 시스템 신청자 0명없음으로 표시 (행 자체는 유지)
  • 동기화 결과 — 같은 줄에 ✅ 성공 / ❌ 실패 + 사유. 동기화 대상이 없으면 표기 생략
  • 맨 위 요약 줄 — 수업 개수 · 총 인원 · 동기화 성공 건수를 한눈에
04 Components

컴포넌트 구성

파일 역할 주요 책임
bodycody_client.py 바디코디 어댑터 로그인 · 오늘 수업 조회 · 예약 등록
onstudio_client.py 온스튜디오 어댑터 로그인 · 오늘 수업 조회
sync.py 크로스 시스템 동기화 온스튜디오→바디코디 예약 추가, 중복 방지
report.py 리포트 생성기 통합 데이터 → HTML 메일 본문
mailer.py 메일 발송 네이버 SMTP 인증 · 발송
main.py 오케스트레이션 전체 파이프라인 실행 · 예외 라우팅
.env 자격증명 양쪽 ID/PW · 메일 앱비밀번호 (gitignore)
state.json 중복 방지 추적 이미 등록한 예약 기록
05 Stack

기술 스택

언어
Python 3.11+
브라우저 자동화
Playwright (Chromium headless)
스케줄러
macOS launchd native
메일 발송
smtplib + email (표준 라이브러리) → smtp.naver.com:465
자격증명 보관
.env 파일 → 향후 macOS Keychain으로 이전 가능
상태 저장
JSON 파일 (state.json) → 양 적으면 충분, 추후 SQLite 옵션
06 Error Handling

에러 처리

로그인 실패
1회 재시도 후 실패 시 에러 메일 발송. 메일 본문에 "비밀번호 만료 의심" 문구 명시. 자동 등록은 건너뛰고, 가능한 데이터만이라도 발송한다.
한쪽 시스템만 다운
가능한 시스템의 데이터만이라도 정상 발송. 메일 상단에 "온스튜디오 데이터 가져오기 실패" 등 명시.
네트워크 일시 오류
60초 대기 후 1회 재시도. 그래도 실패하면 위 단계로 폴백.
자동 등록 실패
실패 사유를 메일에 명시 (정원 초과 / 시간 매칭 실패 / 회원 정보 누락 등). 사용자가 수동 처리할 수 있도록 모든 실패 건은 한 곳에 모아 표시.
07 Safety Nets

안전장치

🛡

Dry-run 모드

첫 1주일은 자동 등록 없이 미리보기만 메일로 받아 검증한다. 실 등록은 충분히 안정 확인 후 활성화.

🔁

중복 방지

state.json에 이미 등록한 예약을 기록. 재실행되어도 같은 사람이 두 번 등록되지 않는다.

📋

모든 액션 로그

자동 등록 전후 모든 액션을 로그 파일에 기록. 문제 발생 시 추적·롤백 근거가 된다.

📨

메일 본문 검증

매일 메일에 "자동 동기화 결과"가 포함되므로 이상 발생 시 당일 발견 가능.

08 Scope

범위 · 단계 분할

전체 자동화 비전은 큰 프로젝트라, 위험도와 가치 순으로 3단계로 분할한다. 본 스펙은 1단계만 다룬다.

1단계 — 통합 알림 + 동기화
본 스펙
2단계 — 수업 등록·수정·삭제
차후
3단계 — 회원 만료/신규 알림
차후

1단계 포함 내용

1단계에서 제외

09 Next

다음 단계

이 설계로 진행할까요?

승인 시 스펙 문서를 markdown으로 정리해 저장 후, 구현 계획(plan) 작성 단계로 넘어간다. 첫 구현 산출물은 두 시스템 로그인 검증부터 시작.

스펙 저장 구현 계획 작성 로그인 검증부터 시작
준비물 (사용자 측)
  • 바디코디 관리자 ID · PW
  • 온스튜디오 관리자 ID · PW
  • 네이버 메일 앱 비밀번호 (네이버 환경설정 → POP3/IMAP에서 발급)