[소개]
인터넷 연결이 불가능한 격오지(산속) 군인 교회에서 병사들의 예배 집중도와 참여율을 높이기 위해 '오프라인 인트라넷 기반 참여형 플랫폼' 구축을 시도했습니다. 단순히 출석 체크와 간식 제공에 그치지 않고, 스마트폰으로 접속해 실시간으로 주보를 확인하고 설교 퀴즈를 풀수 있는 환경을 만들어 성경 에 대한 관심을 유도하고자 했습니다.
[진행 방법]
어떤 도구를 사용했고, 어떻게 활용하셨나요?
하드웨어: Minix 미니 PC를 서버로, Wi-Fi 공유기를 AP로 활용했습니다.
소프트웨어 스택: Ubuntu Server, Nginx, PHP 8.3, SQLite 3를 사용하여 가볍고 빠른 오프라인 환경을 설계하려고 합니다. (사실은 이게 뭔소린지도 모르겠는데... Gemini는 아니까 기대해 봅니다)
AI 도구 활용: Google AI Studio를 통해 시스템 아키텍처와 상세 PRD(제품 요구사항 정의서)를 기획하고, Antigravity 에이전트를 사용하여 실제 코드 구현과 서버 설정을 자동화하는 전략을 세웠습니다.
Tip: 사용한 PRD 전문
PRD: Military Church Offline Engagement Platform (Updated for Minix N42C-4 Plus)
1. Project Overview 본 프로젝트는 인터넷 연결이 불가능한 전방 부대 교회의 환경에서, 병사들이 개인 스마트폰으로 교회 Wi-Fi에 접속하여 디지털 주보 확인, 퀴즈 참여, 출석 관리를 할 수 있는 오프라인 인트라넷 시스템을 구축하는 것을 목표로 한다.
2. Target Environment & Hardware Specs Server PC: Minix N42C-4 Plus CPU: Intel Pentium N4200 (Quad-core) RAM: 4GB DDR3L (동시 접속 100명 처리에 충분함) Storage: 내부 eMMC (또는 M.2 SSD) OS: Ubuntu Server 24.04 LTS Networking: Wi-Fi 6 공유기 (AX3000급 이상 권장) Users: 동시 접속자 60~100명 (병사).
3. Core Functional Requirements
3.1. Captive Portal & DNS Setup Automated Landing: 사용자가 Wi-Fi 접속 시 별도의 주소 입력 없이 서비스 페이지(index.php)가 즉시 팝업됨. DNS Redirection: iOS(captivetest.com), Android(connectivitycheck.gstatic.com) 등의 감지 URL을 서버 IP(10.0.0.1)로 강제 리다이렉트.
3.2. Hardware-Specific USB Auto-Sync I/O Utilization: Minix N42C-4 Plus의 USB 3.0 포트를 활용한 빠른 동기화. Sync Logic: USB 삽입 시 udev 규칙이 작동하여 content/ 폴더 내 주보 이미지와 quiz.json을 웹 루트로 자동 복사. Data Integrity: 복사 완료 전까지 웹 페이지에 '업데이트 중' 메시지 노출 가능.
3.3. 동적 퀴즈 및 치팅 방지 (Anti-Cheating) Type: 객관식(Multiple Choice) 및 주관식(Short Answer) 혼합. Shuffling: 사용자 세션마다 문제 순서와 객관식 보기 순서를 무작위로 섞음. Validation: 군번 기반 1회 제출 제한 및 주관식 답안 공백 제거 비교 로직.
3.4. 출석 마일리지 시스템 군번 입력 시 출석 횟수 누적 및 휴가증까지 남은 횟수 시각화. 데이터는 SQLite 3를 사용하여 가볍게 관리.
4. Technical Optimization (Minix N42C-4 Plus 전용) Nginx Configuration: N4200 쿼드코어에 맞춰 worker_processes auto; 설정 및 worker_connections 1024; 확보. PHP-FPM: 동시 요청 처리를 위해 pm.max_children 값을 50 이상으로 최적화. Storage: eMMC 수명 보호를 위해 로그 파일 등은 가급적 RAM 디스크(tmpfs)를 활용하도록 구성.
5. Data Structure (USB quiz.json)
JSON [ { "id": 1, "type": "choice", "question": "오늘 설교의 주제가 된 인물은?", "options": ["베드로", "바울", "요한", "