어린이집 식판 세척 서비스 회원·자동이체 수납 시스템
추천
학부모 PWA와 관리자 CRM, CMS 자동이체 배치 출금·입금 매칭·명단 대조를 하나의 시스템으로 구축하고 2차 고도화까지 납품했습니다.
프로젝트 개요
엑셀로 관리하던 어린이집 식판 세척 서비스의 학부모 회원·결제 업무를 학부모용 모바일 앱(PWA)과 관리자 CRM으로 옮긴 시스템을 구축·납품했습니다. 학부모가 휴대폰으로 가입해 자녀를 어린이집·반에 연결하고 CMS 자동이체에 동의하면, 매월 정기 출금과 결과 반영, 미납 재청구, 은행 입금 확인까지 시스템에서 이어집니다. 기존 엑셀 데이터를 옮겨 운영을 시작한 뒤, 운영 중 나온 요구를 반영한 2차 고도화까지 마쳤습니다. 학부모 앱은 스토어 등록 없이 링크로 설치하는 PWA로 만들어 갱신도 바로 반영됩니다.
작업 범위
- 학부모 앱: 휴대폰 인증 가입, 자녀와 어린이집·반 연결, 월납·연납 선택과 자동이체 간편서명 등록, 결제 내역·영수증 조회, 서비스 중지·환불 신청, 1:1 문의와 공지 확인
- 관리자 CRM: 할 일 중심 대시보드, 회원·원아·어린이집·단가 관리, 배치 출금 모니터링, 수납·미납 관리와 재청구, 은행 입금 매칭, 작업지시서 엑셀, 공지·문의·환불 처리
- 자동이체 연동: 간편서명·전화·서면 3가지 동의 경로, 월 정기 출금 신청과 결과 회수, 실패 유형별 자동 재출금, 관리자 재청구와 즉시 출금까지 출금 전 과정을 연결
- 인프라·운영: AWS 인프라를 코드로 구성하고 장애 알람과 데이터 복원 훈련을 갖췄으며, 기존 엑셀 회원 데이터 이관과 관리자 매뉴얼·API·DB 문서를 함께 납품
주요 업무
- 이중출금 방지: 서버 재시작이나 배포 중에도 같은 달 같은 회원에게 두 번 출금되지 않도록 배치 선점·중복 차단·결과 확인을 여러 겹으로 적용
- 개인정보 보호: 계좌번호는 암호화해 저장하고 화면·기록에서는 가리며, 본인인증과 카드 정보 입력은 결제대행사 화면에서 끝나도록 해 보관 범위를 최소화
- 데이터 정합성: 어린이집이 보내는 명단 엑셀과 자동이체 계약을 시스템 데이터와 대조해 차이를 찾고, 돈이 걸린 변경은 자동으로 고치지 않고 사람이 확인해 반영
- 품질 관리: 5,000건 이상의 자동 테스트와 실제 DB 통합 시험, 화면 단위 시험을 배포 전 관문으로 두어 결제 로직이 바뀌어도 기존 동작이 깨지지 않게 유지









프로젝트 핵심 과제
이중출금 방지
배치 선점 잠금, 월 1배치 유니크, 거래 ID 규칙, 회수 CAS, 재진입 시 결과 확인으로 같은 달 같은 회원에게 두 번 출금되는 모든 경로를 막았습니다
결과 회수 안정성
웹훅이 없는 배치 결과를 목록 조회와 단건 폴러 이중으로 회수하고, 오후까지 결과가 없으면 경고합니다. 콜백 유실 대비 대기 동의는 15분마다 다시 조회합니다
실패 처리의 분기
실패 코드를 5가지로 나눠 재출금·재등록 안내·관리자 알림을 다르게 처리하고, 법적 차단 건은 학부모에게 문자를 보내지 않습니다
데이터 정합성
명단 대조·계약 대조를 기록 전용으로 만들어 자동 수정이 이중출금으로 번지는 것을 막고, 같은 회차를 다시 올려도 이미 해소한 상태는 보존합니다
개인정보 최소 보관
카드번호·생년월일 미저장, 계좌 KMS 봉투 암호화, 화면·로그·감사 기록 마스킹, 탈퇴 회원 정기 파기를 적용했습니다
운영 이관
인프라를 CDK 코드로 두고 알람·복원 드릴·배포 번들 절차·매뉴얼을 함께 넘겨 운영자가 바로 이어받을 수 있게 했습니다
핵심 기능 상세
운영 대시보드 — 출금 결과·검수 남은 작업·수금률 한 화면
이번 달 출금 결과와 실패 사유, 입금 대기, 검수 남은 작업 8종을 카드로 모아 처리 화면으로 바로 보냅니다. 수금률·실패 회수율 추이도 함께 봅니다.
- 결과 대기 건을 분모에 넣는 수금률 공식으로 실제보다 높게 보이던 지표를 바로잡음
- 회원 확인 필요·자동출금 미준비·명단/계약 대조 등 검수 작업을 SQL 집계로 카드화하고 처리 화면으로 연결
- 첫 출금 실패율·회수율 최근 6개월 추이, 출금·재출금·연납 입금 일정 달력
- EC2(UTC)↔업무(KST) 경계를 +09:00 헬퍼로 고정 — 매월 1일 새벽 지난달 집계 버그 수정
숫자만 보여 주는 대시보드가 아니라 '돈이 걸린 미처리 건'을 우선순위로 띄우고 처리 화면으로 바로 보내는 작업 큐로 설계했습니다.


CMS 자동이체 월 배치 출금 — 결과 폴링·실패 분류·자동 재출금
정기 출금일에 회원별 출금을 신청하고 결과를 주기적으로 회수합니다. 실패 코드를 5가지로 분류해 잔액부족은 영업일 간격으로 자동 재출금합니다.
- 2026~2028 공휴일·대체공휴일 표로 출금일·신청 마감 영업일 계산, node-cron 별도 프로세스가 신청·결과 회수·재시도를 실행
- 배치 선점 FOR UPDATE SKIP LOCKED, 월 1배치 부분 유니크·거래ID 규칙·CAS 회수로 이중출금 차단
- 실패 코드 5분류(재시도·재등록·법적 차단·일시 차단·미상) — 법적 차단은 학부모 문자 금지, 관리자만 알림
- DB 토큰버킷으로 결제대행사 API 호출 간격 350ms 유지, 10건 연속 실패 시 배치 자동 중단·비상 정지 스위치
재기동·배포 중에도 회원 단위 경계에서 멈췄다 이어서 돌고, 이미 결과가 있는 회원은 다시 신청하지 않아 어떤 재진입에서도 같은 달 이중출금이 나지 않습니다.


학부모 PWA — 휴대폰 인증 가입·자동이체 간편서명 등록·중지/환불 신청
휴대폰 인증으로 가입해 자녀와 반을 연결하고 간편서명으로 자동이체를 등록합니다. 결제 내역·영수증, 중지·환불 신청, 문의를 앱에서 처리합니다.
- SMS 인증번호 6자리·5분 유효·5회 제한, 한 번호에 회원이 여럿이면 회원 선택 단계로 분기
- 간편서명: 서버가 회원 등록 후 단축 URL 발급 → 본인인증·계좌 입력은 대행사 화면, 완료 콜백으로 동의 활성화
- 콜백 유실 대비 15분마다 대기 동의 재조회, ARS 녹취·서면 신청서 대리 등록 대체 경로
- injectManifest 서비스워커로 Web Push 수신, 오프라인 캐시는 공개 목록만 두어 회원 간 캐시 혼입 차단
카드번호·생년월일은 우리 DB에 저장하지 않고 본인인증·계좌 입력을 결제대행사 화면에서 끝내, 민감정보 보관 범위를 최소로 줄였습니다.


수납·미납 관리 + 은행 입금 내역 자동 매칭
월별 청구·수납·미납을 회원 단위로 보고 유형별 재청구와 안내 문자를 보냅니다. 은행 거래내역을 올리면 입금자를 6단계 규칙으로 자동 매칭합니다.
- 과거 CMS 수납내역과 우리 배치 결과를 같은 형태로 합친 수납 탭, 행 상세에서 재시도·금액 수정·현금영수증 재발급
- 미납 관리: 실패 유형·기간으로 대상 산출 → 재청구 배치 생성, 안내 문자는 인증번호 몫을 남기는 발송 페이서
- 입금 매칭 6단계(제외·회원번호·원+원아·원아만·다자녀 합산·원 일괄), 금액 허용오차와 동명이인 반 구분
- 은행 .xls(CP949)·.xlsx 파싱 → S3 보관 → 매칭 결과를 연납 결제로 기록, 원 이름 입금자명 학습
매칭은 DB를 건드리지 않는 순수 함수로 분리해 입금자명 규칙을 100여 개 테스트 케이스로 고정했고, 애매한 건은 자동 확정하지 않고 '확인 필요'로 남깁니다.


명단 대조·CMS 계약 대조·작업지시서 자동 생성
원별 명단 엑셀과 대행사 계약을 시스템 데이터와 대조해 차이를 쌓고 사람이 확인해 반영합니다. 원·반별 식기 수량 작업지시서도 한 번에 만듭니다.
- 명단 대조: 반·식기·재원 여부는 파일을 정본으로, 신규·DB만·이동·모호 4종 차이로 분류해 생성·이동·탈퇴로 해소
- CMS 계약 대조 8종(계약 없음·과소청구·이름 불일치·탈퇴인데 활성 등) — 이중출금 위험 때문에 자동 수정 없이 기록만
- 같은 회차 재업로드에도 이미 해소한 상태 보존, 같은 전화·같은 이름은 사람 판단으로 분기
- ExcelJS 작업지시서: 기사 코스·박스 합포장 라벨·포크/젓가락 수량·명단, 30명 초과 경고, S3 presigned URL 다운로드
엑셀로 관리되던 현장 데이터와 결제 데이터가 어긋나는 지점을 자동으로 찾되 고치지는 않게 해, '돈이 걸린 데이터는 사람이 확정한다'는 원칙을 코드로 지켰습니다.


프로젝트 진행 단계
요구사항 분석·데이터 모델·CMS 연동 · 2026.04
계약 기능 18개를 화면·API로 매핑하고 데이터 모델·회원번호·인증을 구축한 뒤, 자동이체 동의와 월 배치 출금·결과 회수·재출금을 연결합니다.
1차 검수·운영 데이터 이관·오픈 · 2026.05
1차 검수를 통과하고 기존 엑셀의 회원·원아·단가·연납 이력을 옮긴 뒤 청구액 대조 게이트를 거쳐 운영을 시작합니다.
운영 안정화·정합성 강화 · 2026.07
중복 회원 검출, 이중출금 하드 가드, 장애 알람과 Web Push, 데이터 복원 훈련과 운영 이관 절차를 더합니다.
2차 고도화·최종 납품 · 2026.09
입금 매칭·원결제·수납 탭 일원화·명단과 계약 대조, 관리자 화면 통일을 마치고 2차 최종 납품합니다.
개발 결과
기술적 주안점
- 돈이 걸린 데이터는 자동으로 고치지 않는다 — 명단·계약 대조는 기록만 하고 사람이 확정
- 재기동·배포 중에도 이중출금이 나지 않는 배치 — 잠금·유니크·CAS·결과 확인의 4중 방어
- 민감정보 최소 보관 — 본인인증·계좌 입력은 대행사 화면, 계좌는 KMS 봉투 암호화
- UTC 서버와 KST 업무 일정의 경계를 헬퍼와 공휴일 표로 고정
- 숫자를 보여 주는 대시보드가 아니라 미처리 건을 처리 화면으로 보내는 작업 큐
다양한 도메인 응용
- 학원·체육시설·돌봄·급식 등 월 정기 회비를 CMS 자동이체로 걷는 회원 관리 시스템
- 정기 구독·렌탈·관리비처럼 매월 청구·출금·미납 재청구가 반복되는 수납 업무
- 은행 거래내역을 업로드해 입금자를 자동으로 찾아 주는 입금 대사·정산 도구
- 현장에서 오는 엑셀 명단과 시스템 데이터를 주기적으로 맞추는 B2B2C 운영 CRM
- 학부모·회원용 모바일 PWA와 운영자 관리 화면이 같은 데이터를 쓰는 서비스