사연 제출과 선정
기간·동행인·사연을 제출하고 운영자가 선정하면 보상 쿠폰과 후속 후기 흐름을 연결했습니다.
기획과 디자인을 제외하고 공개 웹, 상점 스태프 화면, API와 데이터 모델, PASS·OAuth 인증, 영수증 OCR, 쿠폰·정산 백오피스, 배포와 행사 운영 대응까지 애플리케이션 개발 전반을 혼자 담당한 지역 상권 이벤트 서비스입니다.
2025 상봉 먹자골목 페스티벌 실제 모바일 화면
사용자는 사연 제출, 영수증 인증, 당첨 후기와 성향 테스트로 행사에 참여했습니다. 상점은 쿠폰을 현장에서 사용 처리하고 정산 자료를 확인했으며, 운영자는 당첨·영수증·쿠폰·정산 상태를 추적해야 했습니다.
사용자, OAuth 계정, PASS 거래 이력, 상점·상점그룹, 스태프, 사연, 후기, 영수증, 쿠폰, 정산 회차와 정산 상태를 별도 모델로 관리했습니다. 각 참여 방식의 자격과 보상을 사용자·상점·쿠폰 모델에 연결했습니다.
참여 자격 확인부터 증빙 검증, 보상 지급, 현장 사용과 정산까지 상태를 연결했습니다.
사연 이벤트에서는 사용자가 기간, 동행인과 사연을 제출하고 운영자가 선정 시각을 기록했습니다. 선정된 사연에는 쿠폰이 연결되고, 이후 후기 작성 가능 여부는 해당 쿠폰 보유 여부와 기존 후기 존재 여부를 서버에서 다시 확인했습니다.
후기는 10~200자의 텍스트와 이미지가 필요했고 선정 사연마다 한 번만 작성할 수 있었습니다. 늦게 쿠폰을 받은 당첨자를 위한 추가 기간도 별도로 고려됐습니다. 이런 규칙을 화면에서만 숨기거나 보여주는 대신 서버가 “현재 이 사용자가 실제로 참여 가능한가”를 판단하도록 구성했습니다.
기간·동행인·사연을 제출하고 운영자가 선정하면 보상 쿠폰과 후속 후기 흐름을 연결했습니다.
쿠폰 보유와 기존 작성 여부를 서버에서 확인해 선정된 사용자의 1회 후기 흐름을 관리했습니다.
선택지 순서를 섞고 점수 유형에 따라 결과를 만들며 공유와 이미지 저장까지 별도 콘텐츠 경험으로 구성했습니다.
소유권·사용 가능 기간·중복 사용 여부를 서버가 확인한 뒤 현장에서 쿠폰을 사용 처리했습니다.
영수증 이벤트에서는 사용자가 행사 기간의 영수증을 업로드하면 OCR로 상점, 일시와 금액을 추출했습니다. 서버는 행사 기간인지, 참여 상점인지, 금액이 3만 원 이상인지 확인한 뒤 조건을 충족한 참여를 보상 대상으로 다뤘습니다.
영수증은 원본 파일을 다시 올리거나 재저장·캡처한 이미지로 제출할 수 있었습니다. 파일 자체의 SHA-256과 날짜·시간·상점·금액으로 만든 내용 기반 지문을 함께 사용해 파일과 영수증 내용 두 단계로 중복을 검사했습니다.
OCR로 추출한 상점·일시·금액을 행사 기간, 참여 상점과 최소 결제 금액 조건에 다시 대조한 뒤 보상 대상을 판정했습니다.
상점 스태프는 휴대전화 인증과 비밀번호 재설정을 거쳐 연결된 상점의 쿠폰 매출과 일별 사용액을 확인했습니다. 운영자 측에서는 영수증 OCR 결과, 중복 여부, 쿠폰 발급·사용 상태, 정산 회차와 증빙 이미지, 정산 상태와 메모 이력을 추적할 수 있게 했습니다.
공개 화면에서 “참여 완료”라고 보여주는 것과 실제 운영 상태가 다르면 행사 CS가 급격히 어려워집니다. 그래서 참여 결과와 리뷰 가능 상태를 서버 기준으로 제공하고, 백오피스에는 그 판단의 근거가 되는 데이터를 남기는 방향으로 구성했습니다.
사연·영수증·후기·테스트처럼 서로 다른 참여 흐름을 하나의 계정으로 연결
쿠폰 사용과 매출 확인을 실제 상점 스태프 업무로 연결
OCR·쿠폰·정산 상태를 추적해 행사 운영자가 문제의 위치를 확인
가입 시 사용자에게 무작위 기본 닉네임을 부여하고 DB에는 중복을 허용하지 않는 제약을 두었습니다. 겉으로 보면 안전해 보였지만 고유값을 만드는 규칙에는 빈틈이 있었습니다. 같은 기본 이름이 다시 뽑혔을 때 이미 접미사가 붙은 기존 닉네임까지 제대로 세지 못해 동일한 후보를 다시 생성할 수 있었습니다.
DB는 이를 중복 오류로 정확히 거부했습니다. 문제는 애플리케이션이 그 충돌을 복구하지 못했다는 점입니다. 가입 예외 처리에는 다른 사용자명 충돌만 사용자 오류로 변환돼 있었고, 닉네임 중복은 재시도 없이 그대로 전파됐습니다. 결과적으로 PASS와 OAuth를 이미 거친 사용자가 마지막 가입 단계에서 실패했고, 실제 가입자 저하의 가장 큰 원인이 됐습니다.
DB의 중복 제약은 잘못된 저장을 차단했지만, 닉네임 충돌을 복구하는 경로가 없어 가입이 실패했습니다.
닉네임의 두 번째·세 번째 중복 발급, DB unique 충돌과 동시 가입 재시도를 다루는 테스트가 없어 이 오류를 사전에 확인하지 못했습니다. 고유값 생성과 충돌 복구는 추가 검증이 필요한 범위로 남아 있습니다.
가입 오류가 행사 참여에 미친 영향을 파악하려면 PASS·OAuth·최종 가입 단계별 성공·실패율과 오류 코드를 함께 봐야 합니다. 이 관측 체계와 닉네임 충돌 복구의 적용 결과는 아직 확인되지 않았습니다.
공개 웹, 인증, 영수증 OCR, 쿠폰과 정산 백오피스를 혼자 구현했습니다. 운영 중에는 닉네임 충돌이 최종 가입을 막는 문제가 발생했으며, 복구 경로와 충돌 테스트의 공백을 확인했습니다.
아카이브 결과물 보기 ↗