태극기가 바람에 펄럭입니다(3권 5장) ''부록"

독자를 위한 서비스

by 또 래 호태

앱 개발 관계자 설계 협의


“트리거 플랫폼”


회의실 테이블 위에 태블릿과 노트북이 줄지어 놓였다.
정세린은 화이트보드 앞에 서서 제목을 적었다.


「G.E.D 플랫폼 ┃ 기록이 아니라 트리거」


정세린이 말했다.


“오늘 회의 목표는 하나입니다.
‘개인 실적/랭킹 없이’ 전국 확산이 가능한 운영체계를 확정합니다.
이 플랫폼은 아이를 계량하지 않습니다.

학교 환경을 ‘도착’시키는 장치입니다.”


개발사 대표가 손을 들었다.


“정리부터 확인하겠습니다.
이 앱은 학생 행동을 기록하지 않습니다.
그러면 앱이 하는 일은 무엇입니까?”


정세린이 보드에 세 줄만 썼다.

학급/학교의 ‘유지 상태’ 체크(0/1)

기업 제공 트리거 자동 발동

피드백(환경 개선)이 ‘도착했다’는 신호만 반환


정세린이 말했다.


“여기서 벗어나는 기능은 전부 금지합니다.”


강호태가 고개를 끄덕였다.
호태는 개발사 대표를 보며 말했다.


“이 플랫폼은 ‘선행 인증 앱’이 아닙니다.
이 플랫폼은 ‘유지 신호 앱’입니다.
학생 이름이 남는 순간, 이 시스템은 죽습니다.”



1) 요구사항 충돌 지점 ┃ “증거 없이 신뢰를 어떻게 확보하나”


개발사 대표가 말했다.


“요구사항이 모순입니다.
증빙 업로드를 금지하면서 부정 방지를 요구합니다.
개인 데이터가 없다면서 정책 준수 감시를 요구합니다.”


회의실 공기가 잠깐 멈췄다.


선지훈이 말했다.


“맞습니다. 모순입니다.
그래서 오늘은 기능이 아니라 원칙으로 설계합니다.”


정세린이 개발사 대표를 향해 말했다.


“증빙은 업로드가 아닙니다.
증빙은 패턴 탐지입니다.”


정세린이 이어서 말했다.


“‘무엇을 저장하지?’에서 막히면, 이 플랫폼은 길을 잃습니다.
저장하는 것은 이것뿐입니다.”



2) 데이터 모델 ┃ “개인은 애초에 테이블에 없다”


정세린은 화면을 띄웠다.


화면에는 엔터티 목록이 단정하게 정리돼 있었다.

• School : school_id, region_code, level, delivery_address_token

• Class : class_id, school_id, grade, class_no

• Pulse : pulse_id, class_id, date, status(0/1)

* 사유 없음

* 코멘트 없음

• SchoolWeekStatus : school_id, week, maintained_class_count

* 정부 뷰에서는 반 정보 숨김 옵션

• Trigger : trigger_id, school_id, level(1/2/3), fired_at

• OfferPool : donor_id, sku_bundle, capacity, region_filter

• Match : match_id, trigger_id, donor_id, sku_bundle, ship_by, ship_status

• DeliveryReceipt : school_id, match_id, received_at, photo_optional=false

• PCCCertificate : donor_id, quarter, tier, issued_at


“핵심은 단순합니다.

개인 이름/포인트/랭킹 테이블이 아예 없습니다.
개발자가 ‘나중에 필요할지 모른다’는 이유로 개인을 넣는 순간,

우리는 오늘 회의를 실패합니다.”


개발사 보안 담당이 물었다.


“그러면 학생 앱은 없습니까?”


정세린이 답했다.


“학생 앱은 Optional입니다.
사용자가 학생일 필요가 없습니다.
학급은 Class Steward 1~2명이 ‘유지’만 체크합니다.
개인 이름은 노출되지 않습니다.”



3) 권한 설계 ┃ “누가 무엇을 못 하게 할 것인가”


정세린은 다음 슬라이드를 넘겼다.
권한 표에는 “할 수 있는 일”보다 “할 수 없는 일”이 더 많았다.


• Student(선택): 앱 사용 안 해도 됨

• Class Steward(학생 1~2명):

* 가능 : “오늘 유지됨(ON)” 1회

* 불가: 코멘트, 사진, 증거, 보상 문구 열람

• Teacher(선택):

* 가능: 관찰자(체크권한 X) 또는 긴급 중지 권한

• School Admin(교감/행정실 1명):

* 가능: 주간 1회 확인(Confirm), 물품 수령 확인

• Ops Secretariat(중립 운영 사무국):

* 가능: 매칭/물류/트리거 운영, 샘플링 콜백

• Donor(기업):

* 가능: 익명 제공 승인, PCC 수령

* 불가: 학교명/반명 열람

• Gov Oversight(위원회/부처):

* 가능: 원칙 위반 감시, 익명 총량 통계

* 불가: 반 단위 식별(옵션으로 숨김)



호태가 말했다.


“권한 설계에서 중요한 것은 ‘누가 무엇을 하느냐’가 아닙니다.
누가 무엇을 절대 못 하느냐입니다.”



4) 핵심 플로우 4개 ┃ “이대로 개발하면 된다”


정세린이 말했다.


“플로우는 4개로 끝냅니다.
개발팀은 이 네 줄을 구현하면 됩니다.”



A. 학급 ‘유지’ 체크(하루 3초)


정세린이 말했다.


“Class Steward가 앱을 열고 버튼 하나를 누릅니다.
버튼 문구는 이것뿐입니다.”


‘오늘도 유지(ON)’


정세린이 이어서 말했다.


“서버는 Pulse(status=1)만 저장합니다.

업로드도 없고, 사유도 없습니다.

오남용 방지는 ‘하루 1회 제한’과 ‘이상 패턴 탐지’로 처리합니다.”



B. 학교 주간 집계(자동)


정세린이 말했다.

“매주 금요일 18:00, 서버가 자동 집계합니다.

maintained_class_count 만 저장합니다.

학교 관리자는 Confirm만 누릅니다.”



C. 트리거 발동(자동)


정세린이 말했다.


“예시로 4주 연속 유지면 Trigger(level=1)이 생성됩니다.


운영 사무국 인박스에 ‘새 트리거’가 뜹니다.

시스템은 OfferPool에서 자동 매칭을 추천합니다.”


운영 사무국 담당자가 물었다.


“매칭은 자동입니까, 반자동입니까?”


정세린이 답했다.


“초기는 반자동입니다.
추천을 띄우고, 사무국이 승인합니다.
안정화 이후에 자동 비율을 늘립니다.”



D. 제공/피드백(환경 개선)


기업 협력 담당이 말했다.


“기업은 무엇을 보게 됩니까?
기업이 학교를 알면 홍보 압박이 생깁니다.”


선지훈이 단호하게 말했다.


“기업은 어느 학교인지 모르는 상태로 제공 승인만 합니다.
학교명은 물류 토큰으로만 처리합니다.”


호태가 덧붙였다.


“학급과 학생에게는 ‘보상 메시지’를 금지합니다.
대신 학교에는 환경 개선 항목이 도착했다는 신호만 돌려줍니다.
예: 봉투, 장갑, 미끄럼방지테이프.”



5) 기업 대시보드 ┃ “홍보가 아니라 PCC를 받는다”


기업 측 담당자가 말했다.


“기업은 내부적으로 ‘무엇을 받는가’가 필요합니다.
홍보가 아니라 내부 감사가 요구됩니다.”


정세린이 말했다.


“기업 화면은 단순합니다.”

이번 분기 제공 건수(학교명/반명 없음)

제공 카테고리(안전/환경/공간)

PCC 발급: 조건 없는 공공기여 참여 인증서 다운로드

내부 감사용: 배송 완료율, 지역 분포(익명)


정세린이 이어서 말했다.


“기업이 얻는 것은 ‘칭찬’이 아니라 공식 보증입니다.
그래서 이 플랫폼은 기업을 유혹하지 않고, 기업을 증명시킵니다.”



6) 운영 사무국 콘솔 ┃ “인박스가 없으면 굴러가지 않는다”


운영 사무국 담당자가 말했다.


“저희가 실제로 쓰는 화면이 핵심입니다.
업무가 되려면 인박스 구조가 필요합니다.”


정세린이 화면을 넘기며 말했다.

Trigger Inbox: 발동 목록, 지역, 레벨

Auto-Match 결과: 추천 기업/물품 번들

물류 생성: 레이블/송장/상태 추적

원칙 위반 알림: 성과화 시도 탐지

Emergency Stop: 특정 지역/학교 일시 중지


보안 담당이 물었다.


“원칙 위반 탐지는 구체적으로 무엇을 탐지합니까?”


선지훈이 답했다.


“학교가 ‘우리 반이 몇 점’ 같은 게시를 시도하면 경고합니다.
기업이 ‘우리 회사가 어느 학교를 지원했다’는 정보를 요구하면 경고합니다.
정부 조직이 ‘개인 단위 성과 지표’를 넣으려 하면 경고합니다.
그리고 그 경고는 감사 로그에 남습니다.”



7) 증거 업로드 없이 부정 방지 ┃ “이상 징후만 잡는다”


개발사 대표가 다시 물었다.


“증거가 없으면, 조작을 어떻게 막습니까?”


정세린이 말했다.


“증거를 요구하면 시스템이 죽습니다.
그래서 우리는 ‘증거’가 아니라 이상 징후만 봅니다.”


동일 반이 매일 동일 시간에 클릭 → 자동화 의심

비정상 시간대 급증 → 스팸 의심

특정 지역이 갑자기 폭증 → 운영 확인 필요


운영 사무국 담당자가 덧붙였다.


“사무국은 분기당 1회 랜덤 샘플링 콜백을 합니다.
전화 또는 방문으로 ‘운영 확인’만 합니다.
그리고 학교 관리자가 **중지(0)**를 누르면 즉시 계산에서 제외합니다.”


호태가 말했다.

“현장 확인은 필요합니다.
그러나 현장 확인은 감사로만 합니다.
현장 확인은 평가로 하지 않습니다.”



8) UX(사용자 경험) 원칙 ┃ “버튼 수가 늘어나는 순간 망한다”


정세린이 말했다.


“UX 원칙은 하나입니다.
버튼이 늘어나는 순간, 현장은 떠납니다.”


학급 버튼 1개: ‘오늘도 유지’

학교 버튼 1개: ‘이번 주 확인’

기업 버튼 2개: ‘제공 승인 / PCC 보기’

운영 화면: 인박스 처리(업무처럼)


개발사 대표가 천천히 고개를 끄덕였다.


“이 정도면 개발이 가능합니다.
다만 하나만 더 확인하겠습니다.
권한과 감사 로그는 필수입니까?”


선지훈이 대답했다.


“필수입니다.
이 플랫폼은 ‘기능’이 아니라 ‘원칙’을 지키는 장치입니다.
원칙을 어기는 순간, 전국 확산은 구호로 끝납니다.”



9) 결론 ┃ “플랫폼의 이름은 기능이 아니라 태도다”


회의가 끝날 무렵, 위원장이 마지막으로 말했다.


“우리는 아이를 바꾸지 않습니다.
우리는 환경이 도착하게 합니다.
우리는 성과를 만들지 않습니다.
우리는 유지 상태만 확인합니다.”


호태가 덧붙였다.


“그리고 우리는 개인을 기록하지 않습니다.
개인을 기록하지 않는다는 사실이, 이 플랫폼의 존재 이유입니다.”


개발사 대표가 말했다.


“그럼 제품 정의는 이렇게 적겠습니다.
‘기록 앱’이 아니라 ‘트리거 플랫폼’.
저장하는 것은 0/1.
돌려주는 것은 ‘도착 신호’.
기업이 받는 것은 PCC.”


정세린이 짧게 고개를 끄덕였다.

“그 문장 그대로, 개발 시작하면 됩니다.”

작가의 이전글태극기가 바람에 펄럭입니다(3권 5장-3)