콘텐츠고객사 비공개앱·웹 플랫폼 개발관리자·백오피스

일기 보상 앱과 포인트 운영 관리자 웹 구축

일기 작성과 광고 시청 보상을 서버에서 검증해 적립하고 운영팀이 포인트·룰렛 정책을 직접 바꾸는 모바일 앱과 관리자 웹

일기 작성, 홈, 룰렛 세 개의 앱 화면을 나란히 놓은 대표 이미지

배경과 목표

어떤 문제에서 시작했나요?

매일 일기를 쓰면 포인트가 쌓이고, 그 포인트로 기프티콘을 교환하는 보상형 모바일 다이어리 서비스입니다. 포인트가 실제 상품권으로 바뀌는 구조여서, 적립의 근거와 잔액이 어긋나면 되돌리기 어렵다는 점이 설계의 출발점이었습니다. 보상의 상당 부분이 보상형 광고 시청에 연결돼 있어, 앱이 보내는 신호만으로 포인트를 지급하면 위변조를 막을 수 없었습니다. 또 일기 보상 포인트와 룰렛 당첨 확률처럼 운영 중 자주 손대는 값이 많아, 값 하나를 바꾸기 위해 앱을 다시 배포해야 하는 구조는 피해야 했습니다.

목표: iOS와 Android 앱을 동시에 출시하고, 운영팀 전용 관리자 웹과 이를 받치는 백엔드 API를 함께 납품하는 것이 합의된 범위였습니다. 완료 기준은 앱 빌드의 스토어 등록, 관리자 웹과 API 서버 배포, Swagger API 문서와 MySQL 스키마, 운영 매뉴얼·배포 스크립트까지 전달하는 것으로 두었습니다. 개발 완료 보고서에 기록된 범위는 여기까지이며, 가입자 수나 체류 시간 같은 운영 성과 목표는 별도로 확인되지 않았습니다.

네오렉트의 역할

어디까지 수행했나요?

네오렉트는 모바일 앱, 관리자 웹, 백엔드 API와 데이터베이스 설계, AWS 배포 구성까지 개발 전반을 담당했습니다. 광고·소셜 로그인·SMS·본인인증 등 외부 서비스 연동도 네오렉트가 구현했습니다. 기프티콘 상품 조달과 실제 운영은 고객사 운영팀의 몫이며, 네오렉트는 그 운영을 수행할 관리자 화면과 API를 제공하는 범위까지 수행했습니다.

주요 기능

무엇을 만들었나요?

  • 사용자가 하루에 한 번 일기를 작성하면 보상형 광고를 본 뒤 포인트가 적립되고, 작성일 기준 중복 지급은 데이터베이스 제약으로 막습니다.
  • 일기에는 사진 한 장을 붙일 수 있고, 앱이 자동 압축한 이미지를 S3 Pre-signed URL로 직접 올려 API 서버를 거치지 않습니다.
  • 달력 화면에서 자신이 쓴 일기를 날짜별로 되짚어 볼 수 있고, 연속 기록 일수를 함께 보여 줍니다.
  • 행운의 룰렛은 광고 시청 후 돌릴 수 있으며, 관리자가 설정한 칸별 가중치로 추첨해 포인트를 즉시 지급합니다.
  • 기프티콘 스토어에서 쌓인 포인트로 모바일 상품권을 교환하고, 요청·발송·실패·환불 상태로 처리 결과를 추적합니다.
  • 포인트 내역 화면은 적립과 사용을 한 줄씩 보여 주며, 각 건에 증감액과 이전·이후 잔액이 기록돼 있어 뒤늦게도 추적할 수 있습니다.
  • 운영자는 관리자 웹에서 회원을 조회·검색하고 탈퇴를 처리하며, 포인트를 직접 지급하거나 차감할 수 있습니다. 신고된 일기는 검토 후 삭제합니다.
  • 운영자가 룰렛 칸별 포인트·가중치·색상, 일기 작성 보상 포인트, 앱 버전과 강제 업데이트 정책을 관리자 화면에서 바꾸면 배포 없이 반영됩니다.

해결 과정

제약을 어떻게 풀었나요?

  1. 제약 1

    보상형 광고는 앱이 보내는 시청 완료 신호만으로 포인트를 지급하면 위변조를 막을 수 없습니다.

    의사결정: 보상 지급의 근거를 앱이 아니라 광고 플랫폼의 서버 콜백에 두기로 했습니다.

    구현: AdMob Server-Side Verification 콜백을 서버가 검증한 뒤에만 포인트 적립 트랜잭션을 실행하도록 구현했습니다.

  2. 제약 2

    포인트가 실제 상품권으로 교환되므로 잔액이 한 번 어긋나면 사후 정정이 어렵습니다.

    의사결정: 잔액 컬럼을 직접 고치는 경로를 없애고, 모든 증감이 포인트 이력 테이블을 거치게 했습니다.

    구현: 일기 보상·룰렛 보상·기프티콘 구매·관리자 조정을 유형으로 구분하고, 각 건에 증감액과 이전·이후 잔액을 함께 기록해 어느 시점의 잔액이든 되짚을 수 있게 했습니다.

  3. 제약 3

    일기 보상 포인트와 룰렛 당첨 확률은 운영 중 자주 바뀌는 값인데, 코드에 두면 수정할 때마다 앱을 다시 배포해야 합니다.

    의사결정: 자주 바뀌는 운영 값을 코드에서 분리해 설정 테이블과 관리자 화면으로 옮겼습니다.

    구현: 룰렛 칸별 포인트·가중치·색상과 보상 포인트, 강제 업데이트 정책을 키-값 설정으로 저장하고, 관리자 화면에서 바꾼 값이 곧바로 반영되도록 했습니다. 룰렛 설정 화면은 입력한 가중치로 계산된 당첨 확률을 함께 보여 줍니다.

  4. 제약 4

    일기 사진이 API 서버를 거쳐 올라가면 업로드가 느려지고 서버 부하도 커집니다.

    의사결정: 이미지 전송 경로를 API 서버에서 떼어 내 스토리지로 직접 보내기로 했습니다.

    구현: 서버는 S3 Pre-signed URL만 발급하고, 앱이 자동 압축한 이미지를 스토리지에 직접 업로드한 뒤 그 경로만 저장하도록 구현했습니다.

화면

실제 화면과 구조

최소 글자 수 안내와 사진 첨부 버튼, 하단에 일기 등록 버튼이 있는 일기 작성 화면
하루 한 번 일기를 쓰고 보상을 받는 작성 화면
포인트가 적힌 여덟 칸 룰렛과 광고 보고 돌리기 버튼이 있는 화면
광고 시청 후 돌려 보너스 포인트를 받는 룰렛
일기 보상·룰렛 보상·상품 구매가 날짜와 증감 포인트로 줄줄이 표시된 포인트 내역 화면
적립과 사용을 한 줄씩 남기는 포인트 내역
룰렛 확률 분포 원그래프와 칸별 포인트·가중치·확률·색상을 입력하는 표가 있는 관리자 화면
배포 없이 룰렛 포인트와 당첨 확률을 바꾸는 관리자 설정

사용 기술

FlutterNode.js · TypeScriptMySQL · RedisAWS (EC2 · S3 · RDS)Google AdMob SSV

발행 2026.10.06

비슷한 프로젝트를 준비 중이신가요?

배경과 제약 조건을 알려주시면 이 사례의 경험을 바탕으로 진행 방식과 예상 범위를 제안드립니다.