← 포트폴리오 목록

청소년 창작 공모전 접수 플랫폼

국제 창작 공모전 참가자를 위한 접수·결제·마이페이지 플랫폼을 React와 Node.js 기반으로 설계합니다.

동적 제출폼 렌더러 설계JSON 스키마 기반 공모전별 필드 구성으로 신규 공모전 추가 시 코드 변경 없이 폼을 생성하는 구조 구현
이어작성 가능한 단계별 임시저장 구조 구현위저드 각 단계 이탈 시 서버 자동저장, 재로그인 시 마지막 단계로 복귀하는 세션 복구 로직 설계
다중 파일 유형 미리보기 컴포넌트 구축이미지·PDF·음원·영상 URL 등 5개 유형별 미리보기 컴포넌트 설계, Compound Component 패턴 적용
서비스 타입Web
업종교육 플랫폼
기술 스택
ReactTypeScriptTailwind CSSNode.jsExpressPostgreSQLPrismaAWS S3
주요 기능
  • 공모전 탐색
  • 작품 접수
  • 결제·해외본선
  • 마이페이지
Overview

프로젝트 개요

범위: 개발, 디자인, 기획

국제 창작 공모전 참가자를 위한 접수·결제·마이페이지 플랫폼을 React와 Node.js 기반으로 설계합니다. 공모전별로 달라지는 제출 항목을 JSON 스키마 기반 동적 폼으로 구현하고, 5단계 위저드와 파일 업로드 미리보기, PG 결제 연동까지 하나의 흐름으로 통합합니다. 다국어(영/한) 처리와 미성년자 보호자 동의 절차도 함께 반영하여 국제 공모전 운영 요건을 충족하는 데모로 구현합니다.

작업 범위

  • 공모전 탐색: 국가·도시·분야·상태로 필터링 가능한 공모전 카드 갤러리에서 참가자가 관심 공모전을 탐색하고 상세 요강을 확인합니다
  • 작품 접수: 01 참가자정보 → 02 작품정보 → 03 파일업로드 → 04 확인/결제 → 05 접수완료로 이어지는 5단계 위저드로 참가자가 작품을 제출합니다
  • 결제·해외본선: 참가비 결제와 해외 본선 참가비 별도 결제를 분리 처리하며, 결제 성공/실패에 따라 다른 안내 화면으로 분기합니다
  • 마이페이지: 내 접수 현황, 심사 결과, 결제 내역, 인증서(영/국문), 해외 본선 신청을 5개 탭으로 확인·관리합니다

주요 업무

  • 공모전 탐색 화면: filter-rail(국가/분야/상태 필터 chips) + gallery(카드 그리드, 마감임박 배지) + quick-view(카드 클릭 시 드로어로 참가연령·참가비·심사방식 요약 노출) 3분할 컴포지션으로 구현합니다
  • 작품 접수 화면: 공모전·분야별로 필드 구성이 달라지는 JSON 스키마 기반 동적 폼 렌더러를 구현하고, 각 단계 이동 시 서버에 자동 임시저장하여 이탈 후 재로그인 시 마지막 단계로 이어작성할 수 있도록 설계합니다
  • 결제·해외본선 화면: 참가비와 해외본선 참가비를 각각 독립된 결제 트랜잭션으로 분리하고, 환불규정 동의 체크와 실패 사유별 재시도/문의 안내 UI를 구현합니다
  • 마이페이지 화면: 탭별로 독립된 데이터 패칭을 구현하고, 인증서 탭에서는 영문/국문 PDF를 각각 다운로드할 수 있는 다국어 발급 구조를 구현합니다
청소년 창작 공모전 접수 플랫폼
요구사항 정의

프로젝트 핵심 과제

프로젝트 진행 시 해결한 핵심 기술 과제입니다.

공모전·분야별로 달라지는 제출 항목을 코드 수정 없이 반영하는 동적 폼 스키마 설계

미성년자 참가자의 보호자 동의 절차와 개인정보 공개 범위를 관리하는 구조 설계

위저드 이탈 후 재접속 시 정확한 단계로 복귀시키는 세션·임시저장 정합성 관리

참가비와 해외 본선 참가비를 별도 트랜잭션으로 처리하면서 결제 실패를 안전하게 분기하는 로직

구현 내용

핵심 기능 상세

핵심 기능 1

공모전 탐색

국가·도시·분야·상태로 필터링 가능한 공모전 카드 갤러리에서 참가자가 관심 공모전을 탐색하고 상세 요강을 확인합니다.

  • React Query로 공모전 목록/필터 서버 상태를 캐싱하고 staleTime을 분리 관리
  • URL 쿼리 파라미터와 필터 상태를 동기화하여 공유 가능한 탐색 결과 링크 구현
  • Intersection Observer 기반 무한 스크롤과 Skeleton UI로 카드 그리드 점진 로딩 구현

국가·도시·분야·상태 4축 필터를 조합 가능한 동적 쿼리 빌더로 구현하고, quick-view 드로어에서 상세 페이지 이동 없이 공모전 요강을 즉시 확인할 수 있는 구조를 설계합니다.

공모전 탐색
핵심 기능 2

작품 접수

01 참가자정보 → 02 작품정보 → 03 파일업로드 → 04 확인/결제 → 05 접수완료로 이어지는 5단계 위저드로 참가자가 작품을 제출합니다.

  • JSON 스키마 기반 동적 폼 렌더러를 구현하여 공모전별 제출 항목을 코드 변경 없이 구성
  • React Hook Form + Zod로 단계별 유효성 검증과 에러 포커스 이동 구현
  • 각 단계 전환 시 Debounced 자동저장 API 호출로 임시저장 상태 관리

위저드 이탈 후 재접속 시 서버에 저장된 마지막 단계로 자동 복귀시키는 세션 복구 로직을 구현하여, 미성년자 참가자가 보호자와 나눠 작성해도 작업이 유실되지 않는 흐름을 설계합니다.

작품 접수
핵심 기능 3

결제·해외본선

참가비 결제와 해외 본선 참가비 별도 결제를 분리 처리하며, 결제 성공/실패에 따라 다른 안내 화면으로 분기합니다.

  • PG SDK(토스페이먼츠/포트원) 연동으로 참가비·해외본선 참가비를 독립 트랜잭션으로 분리 처리
  • 결제 웹훅 수신 후 서버에서 결제 상태를 재검증하는 이중 확인 로직 구현
  • 결제 실패 사유(한도초과/카드오류/네트워크)별 재시도 및 문의 안내 분기 UI 구현

참가비와 해외 본선 참가비를 별도 트랜잭션으로 분리하면서도 하나의 접수 흐름 안에서 자연스럽게 이어지도록 상태 머신 기반 결제 단계 관리 구조를 설계합니다.

결제·해외본선
핵심 기능 4

마이페이지

내 접수 현황, 심사 결과, 결제 내역, 인증서(영/국문), 해외 본선 신청을 5개 탭으로 확인·관리합니다.

  • 탭 전환 시 React Query 캐시를 유지하여 재조회 없이 즉시 탭 전환 구현
  • jsPDF 기반 인증서 미리보기 및 영/국문 템플릿 선택 다운로드 구현
  • 상태별(접수완료/심사중/수상) 배지 컴포넌트를 재사용 가능하게 설계

접수·심사·결제·인증서·해외본선 5개 도메인의 데이터를 하나의 마이페이지 셸에서 탭 단위로 독립 로딩하는 구조를 설계하여, 미성년자 참가자의 보호자도 필요한 정보만 빠르게 확인할 수 있도록 구현합니다.

마이페이지
구현 과정

프로젝트 진행 단계

STEP 1

요구사항 분석 및 RBAC·다국어 스키마 설계 · 2026.09

5개 역할 권한 모델, 공모전별 동적 폼 스키마, PostgreSQL 테이블 22개 설계

STEP 2

접수 위저드 및 결제 API 개발 · 2026.09

Express 기반 5단계 위저드 API, 임시저장/이어작성 로직, PG 연동 API 18개 구현

STEP 3

참가자 화면 및 갤러리 UI 개발 · 2026.09

React 기반 공모전 탐색·마이페이지 등 10개 화면 구현, 파일 업로드 미리보기 적용

STEP 4

다국어 처리 및 통합 테스트 · 2026.09

영/한 i18n 전면 적용, 결제·업로드 흐름 E2E 테스트 40개 케이스 작성

프로젝트 성과

주요 성과

동적 제출폼 렌더러 설계JSON 스키마 기반 공모전별 필드 구성으로 신규 공모전 추가 시 코드 변경 없이 폼을 생성하는 구조 구현
이어작성 가능한 단계별 임시저장 구조 구현위저드 각 단계 이탈 시 서버 자동저장, 재로그인 시 마지막 단계로 복귀하는 세션 복구 로직 설계
다중 파일 유형 미리보기 컴포넌트 구축이미지·PDF·음원·영상 URL 등 5개 유형별 미리보기 컴포넌트 설계, Compound Component 패턴 적용
결제 실패 분기 및 재시도 흐름 설계참가비·해외본선 참가비를 별도 트랜잭션으로 분리하고 실패 사유별 재시도/문의 안내 로직 구현
Highlights

기술적 주안점

  • 국가·도시·분야·상태 4축 필터를 조합 가능한 동적 쿼리 빌더로 구현하고, quick-view 드로어에서 상세 페이지 이동 없이 공모전 요강을 즉시 확인할 수 있는 구조를 설계합니다
  • 위저드 이탈 후 재접속 시 서버에 저장된 마지막 단계로 자동 복귀시키는 세션 복구 로직을 구현하여, 미성년자 참가자가 보호자와 나눠 작성해도 작업이 유실되지 않는 흐름을 설계합니다
  • 참가비와 해외 본선 참가비를 별도 트랜잭션으로 분리하면서도 하나의 접수 흐름 안에서 자연스럽게 이어지도록 상태 머신 기반 결제 단계 관리 구조를 설계합니다

유사한 프로젝트를 기획하고 계신가요?

FIRSTPIP이 개발 범위와 로드맵을 함께 정리해드립니다

무료 상담 시작하기