[소개]
인터넷 연결이 불가능한 격오지(산속) 군인 교회에서 병사들의 예배 집중도와 참여율을 높이기 위해 '오프라인 인트라넷 기반 참여형 플랫폼' 구축을 시도했습니다. 단순히 출석 체크와 간식 제공에 그치지 않고, 스마트폰으로 접속해 실시간으로 주보를 확인하고 설교 퀴즈를 풀수 있는 환경을 만들어 성경에 대한 관심을 유도하고자 했습니다.
[진행 방법]
어떤 도구를 사용했고, 어떻게 활용하셨나요?
하드웨어: 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": ["베드로", "바울", "요한", "스데반"], "answer": "바울" }, { "id": 2, "type": "short_answer", "question": "오늘 주보 3페이지에 나온 성경 암송 구절의 첫 단어는?", "answer": "태초에" } ]
Tip: 핵심 데이터 구조 (USB 업데이트용 quiz.json)
JSON
[
{
"id": 1,
"type": "choice",
"question": "오늘 설교의 핵심 키워드는 무엇입니까?",
"options": ["믿음", "소망", "사랑", "인내"],
"answer": "사랑"
},
{
"id": 2,
"type": "short_answer",
"question": "오늘 본문 말씀의 배경이 된 도시 이름은?",
"answer": "예루살렘"
}
]
[결과와 배운 점]
PRD의 중요성: 코딩을 시작하기 전, 구체적인 하드웨어 사양 과 제약 사항을 반영한 PRD를 먼저 정의하는 것이 시행착오를 줄이는 지름길임을 배웠습니다.
환경 최적화: 60~100명의 동시 접속을 처리하기 위해 서버 성능보다 공유기의 Wi-Fi 6(OFDMA) 기술과 이미지 용량 최적화가 더 중요하다는 엔지니어링 포인트를 짚었습니다.
과정 중에 어떤 시행착오를 겪었나요? 인터넷이 없는 환경에서 스마트폰이 자동으로 주보 페이지를 띄우게 하는 '캡티브 포털' 설정의 복잡성을 AI를 통해 해결할 수 있었습니다.
도움이 필요한 부분이 있나요? 현재 Antigravity 인터페이스를 파악 중이며, 생성된 코드를 실제 Ubuntu Server에 배포하고 USB 자동 인식(udev rule)이 정상 작동하는지 현장 테스트가 필요합니다.