소프트웨어 경진대회에 리셋팀 프론트엔드 팀원으로 참여해 애플리케이션을 개발했다. 짧은 기간이었지만 복잡한 미션 플로우와 상태를 직접 설계하고 구현하며 많은 것을 배울 수 있었다. 이번 회고에서는 당시의 기술적 고민과 해결 과정을 중심으로 정리하려고 한다.
주요 담당 업무
주요 담당 업무는 앱의 핵심 기능인 방 선택, 감정 평가, 사진 업로드, 미션 리포트 개발과 상태 관리, API연동이었다.
기술적 도전과 해결 과정
프로젝트의 가장 큰 기술적 과제는 '미션'이라는 복잡한 생명주기를 가진 상태를 어떻게 안정적으로 관리하는가였다. 이를 해결하기 위해 다음과 같은 방법을 적용했다.
1. 하이브리드 상태 관리: Provider + Riverpod
초기에는 Provider를 사용했으나 기능이 복잡해지며 더 세분화된 상태 관리가 필요했다. 그래서 Riverpod를 추가로 도입하여 두 라이브러리를 함께 사용하는 하이브리드 아키텍처를 구축했다.
- Riverpod (StateNotifier): 미션 진행, 감정 평가, 사진 업로드처럼 동적이고 복잡한 상태 변화를 겪는 기능에 적용했다. StateNotifier를 통해 상태의 불변성을 유지하며 관리한 결과, 예측 불가능한 버그를 크게 줄일 수 있었다.
- Provider (ChangeNotifier): 인증(Auth)이나 앱 전역 설정처럼 상대적으로 단순하고 넓은 범위에 영향을 미치는 상태는 기존 Provider 구조를 유지해 마이그레이션 비용을 줄였다.
이러한 하이브리드 접근을 통해 기존 코드의 안정성을 해치지 않으면서 신규 기능의 복잡성을 효과적으로 제어할 수 있었다.
2. 사용자 경험 개선: 감정 연속성 시스템
미션을 연속해서 수행할 때마다 감정을 선택하는 과정이 번거로울 수 있다는 가설을 세웠다. 이를 해결하고자 이전 미션의 'After 감정'을 다음 미션의 'Before 감정'으로 이어주는 '감정 연속성 시스템'을 구현했다.
- 핵심 로직: 이전 미션이 끝나고 30분 이내에 새 미션을 시작하고, 감정 연속 사용 횟수가 3회를 넘지 않을 때 작동하도록 했다.
- 구현: EvaluationNotifier 내에 마지막 감정 설정 시간과 연속 횟수를 기록했고, 미션 시작 시 이 조건을 확인하여 감정 평가 단계를 건너뛰도록 처리했다. 이 기능으로 사용자의 불필요한 반복 입력을 줄여 더 나은 사용 흐름을 만들었다.
3. 안정적인 사진 업로드: 2단계 업로드 프로세스
미션 전후 사진을 기록하는 기능은 안정성을 확보하기 위해 2단계 업로드 프로세스로 설계했다.
- 1단계 (파일 업로드): 앱에서 촬영한 사진 파일을 먼저 Supabase Storage에 업로드했다. 파일 경로는 /{userId}/{missionUuid}/ 구조로 명확히 관리했다.
- 2단계 (URL 등록): Storage 업로드가 성공하면, 반환된 파일 URL을 커스텀 백엔드 API로 전송하여 미션 데이터와 최종적으로 연결했다.
물리적 파일과 메타데이터의 처리 과정을 분리함으로써, 한쪽에서 오류가 발생해도 다른 쪽에 영향을 최소화하고 재시도 로직을 구현하기 용이한 구조를 만들었다.
4. 복잡한 플로우 관리: GoRouter와 모달 시스템
미션 플로우는 감정 평가부터 결과 리포트까지 이어지는 긴 과정이었고, 사용자의 선택이나 업적 달성 여부에 따른 분기 처리가 필요했다.
- GoRouter: 선언적 라우팅 방식의 GoRouter를 사용해 복잡한 네비게이션 로직을 관리했다. 특히 업적 달성 시에만 특정 페이지를 보여주는 것과 같은 조건부 라우팅을 구현하는 데 효과적이었다.
- 모달 시스템: 온보딩, 피드백, 사진 촬영 여부 확인 등 주요 분기점에서 사용되는 UI를 공통 모달 컴포넌트로 만들어 코드 재사용성을 높이고 일관된 사용자 경험을 제공했다.
프로젝트를 마치며
이번 경진대회는 단순히 기능을 구현하는 것을 넘어, '왜 이 기술을 사용해야 하는가'에 대해 깊이 고민하는 계기가 되었다. 복잡한 상태를 제어하기 위해 Riverpod를 도입한 경험, 사용자 경험을 개선하기 위해 '감정 연속성' 같은 디테일을 고민했던 과정이 특히 기억에 남는다. 팀원들과 함께 치열하게 고민하며 하나의 결과물을 완성한 이 경험은 앞으로의 개발자 커리어에 중요한 자산이 될 것이라 생각한다.