| 항목 | 내용 |
|---|---|
| 인증 수단 | 구글 / 네이버 / 카카오 OAuth 본인인증 (택 1) — 고유 ID 기준 1인 1표 |
| 주민등록번호 | 미수집 — 개인정보보호법 제24조 준수 |
| 거주 확인 | "본인은 직장 혹은 거주지가 효성2동임을 서약합니다." 체크박스 (서울시 엠보팅 선례, 주소 미수집) |
| 수집 정보 | 생년월일, 성별, 전화번호(쿠폰 발송용) |
| 구분 | 방식 | 안건 | 선택 |
|---|---|---|---|
| 동센터형 | 사업 카드형 | AI 활용법 배우기 / 전통 장 담그기·전통강정 / 나는야 도시농부 / 배워서 남주나 | 4개 중 1개 |
| 일반형 | 심플 리스트형 | 미세먼지·오존농도 측정기 / LED 바닥등 / 삼오빌라 재활용 대체 운영안 / 전 연령 생활안전 교육 | 4개 중 1개 |
[참여자] 자기 휴대폰으로 QR 안내판 스캔
│
▼
[① 전화번호 입력] 발급 화면에서 번호 입력 + 개인정보 수집 동의 체크
│
▼
[② 서버 검증] 11자리 포맷 → 1인 1건(중복 차단) → 온라인 투표 이력 확인
│ (통과)
▼
[③ 순번 발급] 대기번호 자동 발급 → 참여자 폰 화면에 순번 표시
│
▼
[④ 프린터 즉시 출력] 운영 PC 데몬이 1~2초 내 감지 → 라벨 2장 인쇄 (1장당 약 1초)
│
▼
[⑤ 순번 호출 · 수령] 운영요원 "0042번!" → 참여자가 순번 확인 후 라벨 2장 수령
│ (1장 본인 소지 = 당첨 확인증)
▼
[⑥ 투표지 동봉] 나머지 1장을 투표지와 함께 투표함에 투입 → 응모 확정
│
▼
[⑦ 당첨 발표] 끝 4자리만 무대 발표 → 전화 확인 → 상품 수령 (대장 기록)
| 항목 | 수량 | 비고 |
|---|---|---|
| QR 안내판 | 2~3개 | 스캔 안내 + 이용 방법 1~2줄 문구 포함 / A4 또는 스탠드 인쇄 |
| 라벨 프린터 | 1대 기본, 혼잡 시 2대 | 라벨 폭 58mm급 / USB(데몬 PC 직결) 또는 네트워크 연결 |
| 운영 PC | 1대 | 프린터 관리 데몬 상시 실행 + 어르신·폰 미보유자 예외 입력 창구 겸용 |
| 라벨지(58×40mm) | 1,100장 이상 | 오류·폐기 대비 10% 여유 |
| 네트워크 | 와이파이 + LTE 백업 | 참여자 폰 접속은 이동통신망으로도 가능(QR 접속) |
| 예비 전원 | 연장선·멀티탭 | 프린터·PC 2시간 연속 운영 |
| 위험 | 기존(종이 띠지) | 라벨 프린터 방식 |
|---|---|---|
| 종이 몰아주기 | 수기 배부 → 통제 불가 | 라벨 출력이 전화번호 입력 기반 → 1인 1건 (DB 유니크) |
| 투표 없이 응모만 | 가능 (띠지 소지만으로 응모) | 응모 라벨이 투표함 동봉 → 투표해야 응모 성립 |
| 당첨 가로채기 | 남의 띠지 제시 가능 | 본인 라벨(순번) + 전화 확인 이중 검증 |
| 감사 흔적 | 수기 대장 | 발급 이력(시스템) + 라벨(물리) 이중 기록 |
[참여자 폰] [클라우드 서버: Next.js + Supabase] [운영 PC] [프린터] │ │ │ │ ├─ QR → 발급 페이지 ─────────►│ POST /api/raffle/issue │ │ │ │ ① 포맷(11자리) 검증 │ │ │ │ ② 중복 차단 (DB 유니크) │ │ │ │ ③ 온라인 투표 이력 조회 │ │ │ │ ④ 순번 발급 → DB 저장(pending) │ │ │◄── 순번·끝4자리 응답 ────────│ │ │ │ │ GET /api/raffle/queue ◄─폴링─── │ 데몬: 1~2초 간격 │ │ │◄──────────────────────────────── │ 새 발급 건 감지 │ │ │ ├─ 인쇄 명령 ─────────►│ │ │ │ │ 라벨 2장 출력 │ │ POST /api/raffle/print-result ◄─│── 보고(printed) │ │ │◄──────────────────────────────── │ │ [관리자 화면] ── GET /api/raffle/stats ──►│ │ │
create table raffle_entries (
id uuid primary key default gen_random_uuid(),
event_id uuid not null, -- 주민총회 이벤트(events.id)
seq_no integer not null, -- 순번(대기번호): 이벤트 내 1부터 자동 증가
phone_number varchar(11) not null, -- 숫자만 11자리 (010…)
print_status varchar(16) not null default 'pending',
-- pending(입력완료) → printing(인쇄중) → printed(출력완료) / error(실패)
printer_no varchar(1) not null default 'A', -- 2대 운영 시 A/B
printed_at timestamptz,
created_at timestamptz not null default now(),
unique (event_id, phone_number), -- 1인 1응모 (이중 발급 차단)
unique (event_id, seq_no)
);
| 엔드포인트 | 인증 | 역할 |
|---|---|---|
| POST /api/raffle/issue | 공개 + rate limit | 전화번호 검증(포맷·중복·온라인 이력) → 순번 발급 → 큐 등록 |
| GET /api/raffle/queue | 데몬용 키 | pending 건 조회 (마지막 인쇄 순번 이후) |
| POST /api/raffle/print-result | 데몬용 키 | 인쇄 성공/실패 보고 (printed / error) |
| GET /api/raffle/stats | 관리자 세션 | 실시간 발급 현황 — 총 발급·대기·오류 건수 (모니터링) |
| GET /api/raffle/status?phone= | 공개(마스킹) | 본인 순번 재조회 (재접속 시) |
// 데몬 핵심 로직 (1.5초 간격 폴링 예시)
setInterval(async () => {
const jobs = await api.get('/api/raffle/queue'); // ① 새 발급 건 조회
for (const job of jobs) {
await api.post('/api/raffle/print-result',
{ id: job.id, status: 'printing' }); // ② 인쇄 시작 알림
printer.print(label(job)); // ③ 라벨 2장 출력 (순번·번호·시각)
await api.post('/api/raffle/print-result',
{ id: job.id, status: 'printed' }); // ④ 완료 보고
}
}, 1500);
입력완료(pending) ──► 인쇄중(printing) ──► 출력완료(printed)
│ │
└──(데몬 미감지/실패)──┴──► error ──► (요원 해결) ──► 재시도
| 상황 | 대응 방법 |
|---|---|
| 스마트폰 미보유·어르신 | 운영 PC 예외 창구에서 직원이 전화번호를 확인해 대신 입력 → 동일하게 프린터 출력 |
| 전화번호 오입력 | 발급 버튼 전 "확인" 단계에서 재입력. 발급 후 오류 발견 시 운영요원이 확인하고 해당 건을 무효 처리 후 재발급 |
| 같은 번호 재시도 | "이미 발급된 번호입니다. 순번 0042로 발급 완료" 안내 — 발급 차단 (DB 유니크) |
| 프린터 용지 부족·오류 | 데몬이 화면·소리로 경고 → 요원이 용지 보충/교체, 해당 건 error 후 자동 재시도 |
| 네트워크 장애 | 발급 일시 중지 안내 → 복구 후 재개. (발급은 참여자 폰 입력 기반이라 장애 시간이 짧음) |
| 당첨자 전화 미수신 | 끝 4자리 2차 발표(5분 후) → 행사 종료 후 확인 데스크에서 성명 + 끝 4자리로 수령 (발신번호 표시제한·수신거부 예외 포함) |
| 라벨 분실·훼손 | 본인 전화번호로 재조회(순번 확인) → 운영요원 확인 후 재발급 1회 허용 (DB 중복은 무효 건 처리) |
| 항목 | 기존(종이 띠지) | 제안(라벨 발급) |
|---|---|---|
| 발급 매체 | 띠지 1,000매 × 1,000원 = 100만원 | 라벨지(58×40mm) 1,100장 약 1~2만원 |
| 단말 장비 | — | 태블릿 불필요(참여자 폰) + 라벨 프린터(보유/대여) + 운영 PC 1대 |
| 인증 | 수기 확인 | 전화 확인(당첨자 한정) — SMS 인증 추가 시 건당 약 10~20원 |
| 추첨 | 수기 추첨 | 발급 이력 기반 자동 추첨 가능 |
| 절감 효과 | — | 띠지 인쇄비 약 98만원 절감 → 경품·참여 예산으로 재배분 |
| 단계 | 작업 내용 |
|---|---|
| 1단계 | raffle_entries 테이블 + 발급 API(POST /api/raffle/issue) + 순번 발급 로직 |
| 2단계 | 운영 PC 프린터 데몬 + 라벨 서식(순번·번호·시각) + 인쇄 상태 관리 |
| 3단계 | 발급 화면 UI(입력·완료·중복 안내) + 관리자 모니터링 화면 |
| 4단계 | 온라인 투표 이력 연동(이중 응모 차단) + 커피쿠폰 발송 연결 |
| 5단계 | 모의 테스트(10명 규모 라벨 출력·중복·오류 시나리오) → 본행사 |