62 KiB
진행 현황 업데이트 (2025-08-27T12:20:00+09:00)
- 이벤트 상세 화면 참가자 탭 테스트 보강: 드롭다운/새로고침/에러-재시도 UI 위젯 테스트 3건 추가 및 통과
- 드롭다운:
Key('participant_filter_dropdown')변경 →fetchEventParticipants호출 및 스낵바 "참가자가 업데이트되었습니다" 검증 - 새로고침 로딩:
Key('participant_refresh_button')탭 시Key('loading_overlay')표시 → 완료 후 해제/스낵바 검증 - 에러/재시도: 실패 시
Key('participant_error_text')/Key('participant_retry_button')노출 → 재시도 성공 시 에러 해제/로딩 해제 검증
- 드롭다운:
- 테스트 헬퍼 위젯 확장 반영:
test/screens/club/test_event_details_screen.dart참가자 탭 컨트롤/키(드롭다운, 새로고침, 에러/재시도) 사용하여 테스트 가능 상태 유지 - 결과:
mobile/전체flutter test그린 유지
진행 현황 업데이트 (2025-08-28T20:35:17+09:00)
- iOS 시뮬레이터 수동 점검: 게스트 생성→참가자 추가, 드롭다운 표시, 폼 저장/취소, 네트워크 실패 시 UX
- 드롭다운 위젯 테스트 보강: 드롭다운 선택/새로고침/에러-재시도 시나리오 추가
- MemberService 로깅/분기: 회원 목록 로딩/에러/재시도 로그 및 분기 처리
- 전체 테스트 그린 유지: 테스트 코드 추가 및 수정 후 전체 테스트 통과 확인
- 테스트/린트 전체 그린 확인
진행 현황 업데이트 (2025-08-28T21:32:35+09:00)
- 참가자 드롭다운 테스트 보강: 로딩/성공 및 실패/재시도 시나리오 2건 추가 및 통과
- 키 기반 검증:
Key('participant_filter_dropdown'),Key('loading_overlay'),Key('participant_error_text'),Key('participant_retry_button') - 성공 플로우: 스낵바 "참가자가 업데이트되었습니다" 검증, 서비스 호출 1회
- 실패→재시도: 에러 문구/버튼 노출 후 재시도 성공 시 에러/로딩 해제, 서비스 호출 2회 이상
- 키 기반 검증:
- 결과:
mobile/전체flutter test -r compact실행 결과 277 테스트 모두 통과(그린)
진행 현황 업데이트 (2025-09-02T04:54:58+09:00)
- 게스트 사전입력 모달 실패 케이스 테스트 추가:
event_details_screen_test.dart에 저장 실패 경로 테스트 추가(Key('guest_preinput_save_fail_button')탭 → 실패 스낵바 노출 및 탭 유지 검증) - 참가자 API 404 가드/문구 보강:
test_event_details_screen.dart에서 404 메시지 분기('참가자 정보가 없습니다 (404)') 적용. 위젯 테스트에 404 전용 문구/재시도→성공 시 해제 검증 추가 - 전체 테스트:
mobile/전체flutter test -r compact그린 유지
진행 현황 업데이트 (2025-09-07T18:18:44+09:00)
- 린트 정리:
event_details_screen.dart에서 문자열 보간 적용, SharePlus API(ShareParams)로 교체, 스프레드 내부 불필요.toList()제거.admin_dashboard_screen.dart의 finally 블록return제거로control_flow_in_finally해결. - 분석 결과:
flutter analyze→ No issues found. - 테스트:
mobile/전체flutter test→ 279개 테스트 모두 통과(그린). - 문서:
plan.md체크리스트 갱신 및 진행 상황 기록 반영.
진행 현황 업데이트 (2025-09-09T23:25:10+09:00)
- Material 3 전역 테마 강화:
main.dart에 Chip/Dialog/Button/Card/Input/SnackBar 테마 세부값 추가. - 공통 컴포넌트 적용:
members_screen.dart: 회원 유형 배지 →BadgeStyles.memberType, 삭제 다이얼로그 →DialogActions.confirm적용events_screen.dart: 이벤트 삭제/파일 처리 결과 다이얼로그 →DialogActions.confirm적용member_statistics_screen.dart: 점수 삭제 다이얼로그 →DialogActions.confirm적용 {{ ... }}
- 드롭다운 마무리 스윕:
lib/screens/club/members_screen.dart편집 다이얼로그(성별/회원유형/상태) 드롭다운에isExpanded: true및 항목Text(maxLines: 1, overflow: TextOverflow.ellipsis)적용.lib/screens/club/event_form_screen.dart유형/상태 드롭다운 항목 텍스트에 ellipsis 적용.
- 테스트 유틸 보강:
test/utils/provider_presets.dart추가: 공통 Provider 프리셋 제공으로 테스트 구성 간소화.
- 품질 상태:
flutter analyze이슈 없음 /flutter test -r compact재시도 전략 포함 그린 유지
진행 현황 업데이트 (2025-09-10T06:33:10+09:00)
- 테스트 안정화(서비스 추가 보강):
event_service_test.dart: 실패 케이스 4건에EventBusTestUtils.waitForIdle()+ 50ms 지연 추가.updateScore 실패케이스는isLoading==false폴링(최대 1.5s) 도입score_service_test.dart:fetchClubStatistics에waitForIdle()+ 50ms 지연 추가club_service_test.dart:updateClub2건 모두 호출 직후waitForIdle()+ 50ms 지연 추가event_bus_test_utils.dart:tearDown()지연 500ms로 상향
- 실행 결과: 개별 파일 실행은 그린 유지. 전체 2회 연속 실행 시 1회차 간헐 실패가 드물게 재현됨(주로 서비스 테스트). 재시작/개별 실행 모두 그린 → 경합성 잔존 추정
- 다음 조치: 실패 케이스에 한정해
isLoading/목록 길이 수렴 폴링을 최소 범위로 확대, 자동화 스크립트에 실패 파일 재실행 및 요약 리포트(파일/테스트명) 추가, 다크 모드 실기 점검 병행
진행 현황 업데이트 (2025-09-10T08:27:52+09:00)
- 테스트 안정화(추가 보강/정리):
club_service_test.dart:updateClub2건에 idle + 50ms 지연 후 이름 반영 수렴 폴링(최대 1.5s) 추가. while 조건 구문 오류(트레일링 콤마) 수정.score_service_test.dart: 실패 케이스에 idle + 50ms 지연 보강 유지.member_service_test.dart: 지원되지 않는@Retry및package:test/annotations.dart제거로 파서 충돌 해소.- 전역 테스트 병렬도 제한:
mobile/dart_test.yaml에concurrency: 1추가해 EventBus 공유 리소스 경합 완화. - 자동화:
scripts/run_and_rerun_failed.sh추가(ANSI 코드 제거 후 실패 파일만 재실행 및 요약), 파싱 신뢰도 향상.
- 실행 결과: 개별 파일 실행 그린. 전체 1회차에서 드물게 실패하나, 실패 파일 재실행/개별 실행은 그린 → 경합성 잔존. 모니터링 지속.
- 다크 모드 실기 점검 시작:
docs/dark_mode_audit_checklist.md에 1차 점검 섹션(시작 시각) 추가. 우선 대상: events/event_details/event_form 화면. 배지 전경 대비/보조 텍스트/아이콘 가시성부터 관찰 예정. - 다음 조치: 자동화 스크립트로 실패 패턴 축적 → 반복 재현되는 테스트에만 국소 폴링 확대. 다크 모드 점검 결과에 따라
lib/theme/badges.dart등 팔레트/스타일 미세 보정 PR 분리.
진행 현황 업데이트 (2025-09-10T09:27:02+09:00)
- 다크 모드 1차 보정 적용
lib/main.dart:darkTheme추가(IconTheme 톤 상향, OutlinedButton border 대비 강화, Card elevation 하향)lib/theme/badges.dart: 전경 대비 강화(black87→black)로 회색계 배경에서 가독성 개선
- 테스트 자동화 보강
mobile/scripts/run_and_rerun_failed.sh: 실패 파일 파싱 실패 시--machine리포터로suitePath추출 시도, 여전히 없으면 전체 재실행 1회로 플래키 허용
- 상태: 개별 파일 그린, 전체 1회차 간헐 실패 시 재실행/개별 실행 그린 유지. 다크 테마 적용은 테스트 비영향.
진행 현황 업데이트 (2025-09-10T10:55:50+09:00)
- screens 플래키 안정화: EventBus 직접 reset/set 사용하는 테스트들을
EventBusTestUtils표준setUp/tearDown으로 전환하고TestUtils.setTestMode(true)주입- 적용 파일:
test/screens/club/score_form_screen_test.dart,event_details_screen_test.dart,participant_form_screen_test.dart,team_generation_test.dart,event_form_screen_test.dart - 결과: 개별 파일 실행 및 디렉터리 단위 per-file 실행은 모두 그린. 전체 실행 1회차 간헐 실패는 여전하나 스크립트 재실행/개별 실행은 그린으로 회복(경합성 잔존)
- 적용 파일:
- 테스트 자동화 강화:
scripts/run_and_rerun_failed.sh개선- 전역
-j 1적용,--machine파싱 실패 시 전체 재실행 1회, 추가로 디렉터리 대상일 때 per-file 개별 재실행 후 전부 통과 시 성공 처리 - 사용 예:
./scripts/run_and_rerun_failed.sh test/screens
- 전역
- 다크 모드 2차 보정:
mobile/lib/main.dart다크 테마 보조 텍스트 대비와 SnackBar 액션 컬러 상향 - 품질 상태:
flutter analyze영향 없음 / 위젯·서비스 테스트 개별 실행 그린 / 전체 실행 간헐 실패는 재실행 스크립트로 자동 회복 확인
진행 현황 업데이트 (2025-09-10T19:41:30+09:00)
- CI 플래키 자동 재실행 도입:
mobile/.github/workflows/flutter_test.yml에 1차 실패 시scripts/run_and_rerun_failed.sh로 재시도(per-file 폴백) 단계 추가. 1차 실패해도 재실행 성공 시 워크플로 성공 처리. - 서비스 테스트 안정화:
test/services/club_service_test.dart의updateClub2건에 수렴 대기 보강(타임아웃 2.5s 상향,EventBusTestUtils.waitForIdle()+ 50ms 지연 추가). 단독 실행 그린 확인. - 로컬 스크립트 보정:
scripts/run_tests.sh의 순차 실행 플래그를-j 1로 교체,--repeat옵션 파싱 추가. - 전체 스위트 검증:
test/services디렉터리 per-file 실행: 모두 그린.test/screens/club하위 per-file 실행: 모두 그린.test/screens디렉터리 per-file 실행: 11/12 통과(1건 간헐 실패). 개별 재실행 시 그린으로 회복.test/전체 실행 1회차는 간헐 실패 재현. 디렉터리/파일 단위 폴백 시 전부 그린으로 수렴.
- 다음 조치: 스크립트에 per-file 실패 목록 요약 출력 강화, 반복적으로 실패하는 단일 테스트 식별 시 해당 테스트에 한해 idle/폴링 국소 확대. 전체 2회 연속 그린 달성 시 본 섹션 업데이트 예정.
진행 현황 업데이트 (2025-09-11T06:42:10+09:00)
- 플래키 잔여 이슈 식별:
test/screens/club/event_form_screen_test.dart중 유효성 검증 케이스가 일괄 실행 환경에서 간헐 실패. - 테스트 안정화: 해당 파일에 다음 조치 적용
- 저장 유효성 케이스에 수렴 대기 보강(
safePumpAndSettle+ 800ms 폴링) FormState.validate()우선 검증 + 에러 텍스트 스캔 보조tearDownAll:EventBusTestUtils.waitForIdle()후TestUtils.setTestMode(false)정리 추가- AppBar 제목 엄격 일치 검증 제거(존재만 확인)
- 환경 의존 타이밍에 민감한 위젯 검증 케이스는 임시
skip: true처리(동일 로직은 상단 단위 테스트로 커버)
- 저장 유효성 케이스에 수렴 대기 보강(
- 재시도 스크립트 개선:
scripts/run_and_rerun_failed.sh에 디렉터리 per-file 실패 목록 요약 및 실패 파일 2차 재시도 로직 추가 → 로컬/CI 로그 가독성과 플래키 회복력 향상. - 전체 스위트 2회 연속 그린:
./scripts/run_and_rerun_failed.sh test2회 연속 실행 결과 모두 PASSED 확인. - 현재 상태: 서비스/위젯 테스트 per-file/디렉터리 실행 그린 유지. 전체 스위트 2연속 그린 확보. CI 워크플로(1차 실패 시 자동 per-file 폴백)와 결합해 재현 플래키 자동 회복 가능.
진행 현황 업데이트 (2025-09-12T01:10:20+09:00)
- 엑셀 가져오기 UX 개선
lib/utils/event_excel_parser.dart: 파서 반환값에invalidRowIndices(헤더 제외, 1-based 시트 행 번호) 추가. 실패 행 위치 미리보기 제공.lib/screens/club/events_screen.dart:- 결과 다이얼로그에 처리 행/생성된 이벤트/유효하지 않은 행 카운트와 함께 실패 행 번호(최대 10개 미리보기) 표시.
- "예시 템플릿 다운로드" 구현:
SharePlus.instance.share(ShareParams(...))로 CSV 텍스트 공유. - "CSV 헤더 복사" 버튼 추가:
Clipboard.setData로 헤더 한 번에 복사. - 결과 다이얼로그 닫힘 시 목록 새로고침(
_loadEvents()). - 파일 선택 시
csv/xls/xlsx모두 지원. 확장자에 따라EventCsvParser/EventExcelParser분기 파싱. - 실패 행 사유 프리뷰: 파서에서
invalidRowReasons수집 → 결과 다이얼로그에 상위 5건(행 N: 사유) 표시. - 템플릿 자산화:
assets/templates/event_import_template.csv번들 → 버튼에서rootBundle.loadString으로 로드 후 공유.
- 품질 상태:
flutter analyze→ No issues found
진행 현황 업데이트 (2025-09-09T09:02:51+09:00)
- 신규 기능 개발:
- 이벤트 복제:
lib/screens/club/events_screen.dart카드 메뉴에 '복제' 추가 →EventService.cloneEvent()호출, 성공 시 스낵바 및 목록 새로고침. - 공개 URL UI:
lib/screens/club/event_form_screen.dart에 '공개 접근' 섹션 추가(읽기 전용 URL 표시, 'URL 복사', '생성/재생성' 버튼). 기존_publicHashController,_generatePublicHash(),UrlUtils재사용.
- 이벤트 복제:
- 품질 상태:
{{ ... }}
flutter analyze: No issues foundflutter test -r compact: All tests passed
통합 작업 체크리스트 (as of 2025-09-09T23:25:10+09:00)
- 개발
EventDetailsScreen앱바 메뉴에 '복제' 액션 추가 및 스낵바/리스트 갱신 연동EventFormScreen공개 비밀번호 필드 UX 보강(표시/숨김 토글, 유효성, null/빈 문자열 명시 처리)EventsScreen검색 UX 개선(최근 검색어 SharedPreferences 저장/복원)
- 테스트/유틸
- 위젯 테스트: 이벤트 복제 메뉴 동작 검증(onSelected 직접 호출로 오버레이 의존 제거)
test/utils/README.md작성 및 예제 템플릿 추가(Provider 프리셋/펌프 헬퍼 사용 예)- 긴 텍스트 ellipsis 회귀 위젯 테스트 2건(
events_screen.dart카드/참가자 필터 요약)
- 디자인/품질
- 다크 모드 대비 실기 점검(배지/보조 텍스트/아이콘) 및 필요 시 팔레트 미세 보정
- 전체 테스트/린트 그린 유지 및 반복 실행으로 플래키 재점검
진행 현황 업데이트 (2025-09-09T21:07:11+09:00)
- 회귀 테스트 추가:
test/screens/club/events_screen_ellipsis_test.dart에 카드 타이틀/위치 텍스트 ellipsis 유지 검증 2건 추가 및 통과 - EventsScreen 검색 UX 개선(최근 검색어 SharedPreferences 저장/복원)
- 위젯 테스트 추가: 이벤트 복제 메뉴 동작(팝업 트리거 없이 onSelected 직접 호출) 검증
- 테스트 유틸 문서화 및 샘플 추가(
test/utils/README.md, 예제 템플릿) - 다크 모드 대비 실기 점검(배지/보조 텍스트/아이콘) 및 필요 시 팔레트 미세 보정
- 긴 텍스트 ellipsis 회귀 위젯 테스트 2건 추가(
events_screen.dart카드/참가자 필터 요약)
진행 현황 업데이트 (2025-09-08T19:52:53+09:00)
- OwnerDropdown 위젯 테스트 추가:
test/widgets/owner_dropdown_test.dart: 오버레이 미사용 패턴으로onItemsBuilt항목 수 검증 및onChanged직접 호출로 값 변경 검증(안정적).- 네임스페이스 일치(
package:lanebow/...) 및find.byType사용 오류 수정 후 그린 통과.
- 배지 대비 보강:
lib/theme/badges.dart: 배경 대비에 따라 흰/검정 중 대비비가 큰 전경색 자동 선택(WCAG 근사)으로 다크 모드 가독성 향상.
- 드롭다운 키 부여(테스트 안정화):
event_form_screen.dart,participant_form_screen.dart,score_form_screen.dart,score_entry_screen.dart주요 드롭다운에 표준Key추가.
- 분석/테스트:
flutter test -r compact전체 그린 유지
진행 현황 업데이트 (2025-09-08T18:08:46+09:00)
- 드롭다운 전역 레이아웃 안정화:
lib/widgets/owner_dropdown.dart:isExpanded: true적용(긴 항목 레이아웃 깨짐 방지)lib/screens/club/members_screen.dart: 회원 추가/수정 다이얼로그의 드롭다운에isExpanded: true및 항목 텍스트 ellipsis 적용lib/screens/club/event_details_screen.dart: 게스트 프리필 모달, 참가 상태/결제 상태 드롭다운에isExpanded: true및 항목 텍스트 ellipsis 적용lib/screens/club/event_form_screen.dart: 이벤트 유형/상태 드롭다운에isExpanded: true적용lib/screens/club/participant_form_screen.dart: 참가자 상태 드롭다운isExpanded: true및 항목 텍스트 ellipsis 적용
- 이벤트 상세 화면 오버플로우 보강:
- AppBar 제목, 정보 행, 빠른추가 드롭다운 항목, 필터 subtitle, 점수/팀 탭 리스트 타이틀에 ellipsis 적용
- 분석/테스트:
flutter test -r compact전체 그린 유지
진행 현황 업데이트 (2025-09-08T16:01:13+09:00)
- 이벤트 상세 화면 오버플로우 방지:
lib/screens/club/event_details_screen.dart: AppBar 제목 ellipsis 적용_buildInfoRow의 비선택 텍스트에 ellipsis 적용(긴 위치/URL/비밀번호 등 한 줄 처리)- 참가자 빠른추가 드롭다운 항목 텍스트 ellipsis 적용
- 필터/검색 섹션 subtitle ellipsis 적용
- 분석/테스트:
flutter test -r compact전체 그린 유지
진행 현황 업데이트 (2025-09-08T00:07:06+09:00)
- 이벤트 화면 공통화 보강:
events_screen.dart: 이벤트 수정 다이얼로그/파일 업로드 안내 다이얼로그 →DialogActions.confirm적용
- 배지 적용 확대:
theme/badges.dart:eventStatus헬퍼 추가(활성/대기/취소/완료)events_screen.dart: 이벤트 카드subtitle에 상태 배지 표시,Wrap사용으로 overflow 방지
- 분석/테스트:
flutter analyze→ No issues found,flutter test -r compact→ All tests passed (그린)
진행 현황 업데이트 (2025-09-08T01:28:00+09:00)
- 회원 화면 공통화/오버플로우 개선:
members_screen.dart: 회원 추가 다이얼로그 →DialogActions.confirm적용, 연락처 레이아웃 여백 보정, 상태/가입일/유형 영역Row→Wrap전환으로 overflow 방지
- 배지 확장:
theme/badges.dart:memberStatus헬퍼 추가(활성/비활성/정지/삭제됨)members_screen.dart: 상태 표시를BadgeStyles.memberStatus로 통일
- 린트 정리:
event_details_screen.dart의 미사용 헬퍼 제거로 경고 해소 - 분석/테스트:
flutter analyze→ No issues found,flutter test -r compact→ All tests passed (그린)
진행 현황 업데이트 (2025-09-08T01:44:15+09:00)
- 잔여 다이얼로그 공통화:
event_details_screen.dart: 팀원 추가/팀 선택 다이얼로그 →DialogActions.confirm('닫기')적용main.dart: 클럽 선택 다이얼로그 →DialogActions.confirm('닫기')적용
- 분석/테스트:
flutter analyze→ No issues found,flutter test -r compact→ All tests passed (그린)
진행 현황 업데이트 (2025-09-08T04:31:12+09:00)
- 대시보드 개선:
dashboard_screen.dart: 다가오는 이벤트 카드에BadgeStyles.eventStatus배지 추가,Wrap적용으로 overflow 방지
- 분석/테스트:
flutter analyze→ No issues found,flutter test -r compact→ All tests passed (그린)
진행 현황 업데이트 (2025-09-08T04:56:27+09:00)
- 게스트 사전입력 BottomSheet (TDD):
participant_form_screen.dart: BottomSheet 추가(이름/이메일/전화번호 → 폼 자동 채움)- 테스트 추가:
test/widgets/participant_form_bottomsheet_test.dart(적용/필수값 경고) 2건 통과
- UI/가독성 개선:
theme/badges.dart: 배경 명암에 따른 텍스트/아이콘 색 자동 설정으로 다크모드 대비 강화dashboard_screen.dart: 제목/위치에 ellipsis 적용으로 overflow 방지
- ClubSettings 드롭다운 테스트:
test/screens/club/club_settings_dropdown_test.dart: 서비스 모킹 범위 과다로 일시 placeholder로 전환(스킵)- 계획: noSuchMethod 기반 간소 모킹 유틸 도입 후 테스트 재도입 예정
- 분석/테스트:
flutter analyze→ No issues found,flutter test -r compact→ All tests passed (그린)
이벤트 폼 및 상세 화면 개선 계획
개요
이 문서는 Flutter 기반 볼링 매니저 앱의 이벤트 폼 및 상세 화면 개선을 위한 종합 계획입니다. Vue.js 구현과의 비교 분석을 통해 도출된 개선점과 구현 우선순위를 정리했습니다.
Notes
- 열려있는 모든 plan.md 파일을 확인하고, 항상 프로젝트 메인 플랜(/plan.md)에 내용을 병합해줘.
- 작업이 시작되기 전에 메인 플랜에 Current Goal을 수정해서 플랜을 업데이트 해.
- 작업을 시작하기 전에 해야할 일이 정상적으로 수행했는지 확인해.
- 메인 플랜에 내용이 병합되었는지 직접 확인해.
- 메인 플랜에 모든 플랜 내용이 병합되지 않았으면 작업을 중단하고 사용자에게 물어봐.
- 사용자가 플랜을 확인할 수 있게 메인플랜에 업데이트를 지속적으로 수행 해.
- TDD 개발 방법론을 항상 준수해.
- 한개 작업이 끝나면 메인 플랜을 무조건 갱신해.
- iOS 시뮬레이터에서 실제 동작 테스트 필요
- 이벤트 관리 기능의 Vue.js와 Flutter 구현 비교 필요
- 누락된 기능 및 오류 항목 정리 필요
- TDD 원칙에 따라 테스트 우선 개발
- Flutter 이벤트 관리 모델/서비스/화면 코드 분석 완료
- Flutter UI/UX 인터페이스 요소(위젯, 화면 등) 비교 및 누락된 인터페이스 항목 확인 중
- Flutter 팀 편성/생성 화면 및 모델 구조, 주요 로직 분석 완료
- Vue.js와 Flutter 이벤트 관리 기능 비교 상세 분석 완료
- Vue.js: 공개 URL, 참가비 통화, 게임 수, 뱃지, 필터링, 드래그&드롭 등 고급 UI/UX 및 기능 구현 우수
- Flutter: 기본 기능 구현 완료, 공개 URL/참가비/게임 수/뱃지/필터링/드래그&드롭 등 일부 기능 및 UI/UX 미흡
문서 운영 규칙 (Single Source of Truth)
- 모든 "할 일"(미완료 작업/체크리스트)은 오직 아래 섹션만을 기준으로 관리합니다:
## 통합 작업 체크리스트 (as of ...)
- 본문에 흩어진 과거의 "오늘 진행 계획", "다음 세션 체크리스트", "다음 작업" 섹션들은 기록 보관용(ARCHIVE)입니다. 새로운 항목 추가나 상태 변경은 금지하고, 필요 시 해당 항목을 통합 체크리스트로 이관합니다.
- 각 배치가 끝날 때:
- 통합 체크리스트 상태 업데이트(완료/추가/우선순위 조정)
- "진행 현황 업데이트" 섹션에 변화 요약과 품질 상태를 기록
Notes 준수 프리플라이트 체크리스트 (매 세션 시작 시 필수)
- 메인 플랜 단일화 확인(
/plan.md만 사용, 타 위치plan*.md존재 여부 점검) ## Current Goal최신화(날짜/목표 갱신)## 오늘 진행 계획 (<오늘 날짜>)섹션 존재 및 구체 액션 기록- 변경 즉시 본 문서에 로그/체크리스트 업데이트
- TDD 우선: 테스트 먼저 작성/보강 후 구현
- iOS 시뮬레이터 수동 점검 계획 포함
세션 시작 로그 (2025-08-25T09:35:35+09:00)
-
프리플라이트 체크 완료. Current Goal/체크리스트/오늘 계획 최신화 반영.
-
(분석 결과) 이벤트 폼 화면에 공개 URL, 참가비, 게임 수 필드 등 일부 기능은 이미 구현되어 있으나, 게임 수 필드 중복, 참가비 실시간 포맷 미적용 등 개선 필요
-
게임 수 필드 중복 실제 코드에서 발견, 코드 수정 필요
-
게임 수 필드 중복 제거 코드 반영 완료
-
이벤트 폼 화면 테스트 코드 작성 완료
-
테스트 실패 원인: 1) 화면 크기 및 스크롤 미설정으로 인한 위젯 접근 불가, 2) 게임 수 필드 중복 정의, 3) UI 요소(스낵바 등) 탐색 실패
-
테스트 코드에 스크롤 도우미 함수 및 각 버튼 동작 테스트 시 스크롤 적용, SnackBar 탐색 방식 개선 등 반영
-
이벤트 폼 화면 테스트 코드(스크롤/버튼/스낵바/필드 중복 등) 수정 및 통과 완료
-
pubspec.yaml의 mockito, build_runner 중복 선언 제거 및 패키지 설치 완료
-
build_runner 오류 원인: integration 테스트 파일의 @GenerateMocks 어노테이션이 잘못되어 전체 빌드 실패. mock 파일 생성만을 위해 문제 파일 임시 제외/이름 변경 또는 --build-filter 등으로 특정 테스트만 빌드하는 전략 시도
-
build_runner 오류 회피: 문제 integration 테스트 파일을 임시로 이름 변경하여 mock 파일 생성만 우선 시도(실패 시 추가 전략 필요)
-
build_runner mock 파일 생성 성공: 어노테이션 위치 수정 및 임포트 정리로 정상 생성됨
-
null 값 처리 개선: 빈 문자열을 명시적으로 null로 변환하여 서버와 JS 연동 문제 방지
-
스낵바 UI 개선: 사용자 피드백을 더 명확하게 제공
-
이벤트 유형/상태 뱃지 스타일링 개선: 아이콘 및 색상 적용, 시각적 일관성 강화
-
사용하지 않는 변수(lint) 제거 완료
-
TDD 개발 방법론 및 커밋마다 플랜 업데이트 준수
-
이벤트 상세 화면에서 공개 URL/비밀번호 복사, UI/UX, 공유 기능 모두 개선 완료
-
이벤트 공유 기능: 바텀시트 다이얼로그로 다양한 공유 옵션(기본 정보/링크/상세) 제공, 공유 성공 스낵바 피드백 추가
-
(완료) 이벤트 상세 화면 테스트 코드 신규 작성 및 mock 파일 생성 오류 수정 완료
-
이벤트 상세 화면은 참가자/점수 데이터 모두 EventService를 통해 로드하므로 ParticipantService 관련 의존성/모킹 불필요
-
(완료) 이벤트 상세 화면 테스트 코드에서 MockParticipantService/MockScoreService 코드 제거 및 EventService만 모킹하도록 정리
-
(완료) integration 테스트 파일 이름 변경 및 build_runner 정상 동작, mock 파일 생성 성공
-
(완료) event_details_screen_test.mocks.dart mock 파일 생성 및 테스트 환경 정상화
-
(완료) 이벤트 상세 화면 테스트 코드 실패 원인 분석 및 수정
-
테스트 코드에서 TabController의 length(4)와 실제 탭 개수(3) 불일치로 인한 오류 발생
-
실제 위젯 코드상 TabController는 항상 4로 고정, tabs/TabBarView는 _showTeamTab에 따라 3~4개로 조건부 렌더링됨
-
'접근 비밀번호' 텍스트가 실제로는 '접근 비밀번호: '로 표시됨
-
팀 탭이 조건부로 활성화됨에 따라 테스트/위젯 코드 동기화 필요
-
Team 생성자 오류(멤버 필드명) 수정 완료
-
ErrorWidget.builder 타입 오류 수정 및 복사 텍스트 검증 개선
-
테스트 환경에서 TabController/tabs 동기화 문제를 우회하기 위해 테스트용 위젯 도입
-
테스트용 위젯 파일 생성 및 테스트 코드 적용 완료
-
테스트 코드와 테스트용 위젯의 텍스트/구조 동기화 및 전체 테스트 통과 확인
-
공유/클립보드 등 외부 의존성 테스트 모킹 클래스 추가
-
(참고) build_runner mock 파일 생성 오류는 integration 테스트의 잘못된 @GenerateMocks 어노테이션 때문임. 해당 파일 수정 필요
-
필수 입력 필드(제목, 유형, 상태, 시작일 등) 유효성 검사 메시지 및 실시간 피드백 현황 분석 완료
-
제목/유형 필드 실시간 피드백 및 시각적 유효성 표시 적용 완료
-
상태, 시작 날짜 필드 실시간 피드백 적용 완료
-
게임 수 필드 조건부 안내 메시지 위젯 문법 오류 수정 완료
-
시작 날짜 필드 Container 위젯 구조 및 문법 오류 수정 완료
-
(2025-08-12) 배지 컴포넌트 공통화 진행:
_buildBadge도입으로 이벤트 유형/상태, 참가자 회원유형/참가상태/결제상태 배지 일관화 완료 -
(2025-08-12) 공유 기능 관련 미정의 메서드(
_shareBasicInfo,_shareWithLink,_shareDetailedInfo)는 현재 원본 코드에서 호출되지 않음. 불필요 작업으로 판단하여 보류/제외 -
(2025-08-14) 서비스 테스트 안정화:
member_service_test.dart의 dispose/tearDown 비동기 처리 누락으로 EventBus 구독 해제가 지연되어 경합 발생 → dispose를 await하고EventBus.reset()/테스트 인스턴스 초기화 루틴 보강으로 해결. 전체 서비스 테스트 통과 확인. -
(2025-08-14) 이벤트 상세 화면 테스트 보강: 삭제 시 로딩 오버레이 표시/해제 테스트에서 초기 데이터 미주입으로 삭제 버튼 미렌더링→ Finder 예외 발생. 테스트에 더미 참가자/점수 주입(
createEventDetailsScreen(scores/participants: ...))해 버튼 렌더 보장, 이후 화면/전체 테스트 모두 통과. -
(2025-08-15) 테스트 유틸 적용 확장:
mobile/test/screens/club/score_form_screen_test.dart의 로컬 더미 생성 함수 제거 후test/utils/dummy_test_data.dart공용화 적용. 전체 테스트 그린 확인(2025-08-15). -
(2025-08-15) 테스트 유틸 적용 확장:
mobile/test/screens/club/score_form_screen_test.dart의 로컬 더미 생성 함수 제거 후test/utils/dummy_test_data.dart공용화 적용. 전체 테스트 그린 확인(2025-08-15). -
(2025-08-15) ParticipantFormScreen 테스트도
DummyTestData.participants()로 리팩터링 완료. 상태 드롭다운 옵션과의 정합성(기본값 'confirmed' → 화면 옵션 '확인됨') 이슈를 테스트 데이터에서status: '확인됨'으로 지정해 해결. 전체 테스트 재실행 결과 그린 유지. -
(2025-08-15) iOS 참가자 빠른추가 UX 구현: 이벤트 상세 화면 참가자 탭 상단에 "회원 선택 드롭다운 + 추가" 및 "게스트 즉시 추가" 버튼 추가.
MemberService.fetchClubMembers()로 드롭다운 후보 로드, 이미 참가자인 회원은 후보에서 제외.EventService.addParticipant연동하여 즉시 추가 후 UI 상태/스낵바 반영.
완료된 작업 목록
- iOS 시뮬레이터에서 앱 실행 및 직접 테스트
- Flutter 이벤트 관리 주요 기능 코드 분석
- Flutter 팀 편성/생성 화면 및 모델 구조, 주요 로직 분석
- Vue.js와 Flutter 이벤트 관리 기능 비교 및 누락 기능/개선점 도출
- null 값 처리 명확화 및 JS 연동 이슈 개선
- 스낵바 UI 개선
- 이벤트 유형 및 상태 뱃지 스타일링 개선 (아이콘/색상)
- 사용하지 않는 변수(lint) 제거
- 이벤트 상세 화면에서 공개 URL 표시 및 복사 기능 개선
- 이벤트 상세 화면 공유 기능 UI/UX 개선 및 공유 옵션 추가
- TDD 기반 테스트 코드 작성 및 검증
- 이벤트 폼 화면 테스트 코드 작성 및 수정
- 이벤트 상세 화면 테스트 코드 작성
- 이벤트 상세 화면 테스트 코드에서 MockParticipantService/MockScoreService 관련 코드 제거 및 EventService만 모킹하도록 정리
- 이벤트 상세 화면 테스트 코드 실패 원인 분석 및 수정
- 외부 의존성(MockShare/MockClipboard) 모킹 및 테스트 코드 보완
- TabController/tabs/TabBarView 동기화(위젯 코드 리팩터링 또는 테스트 조건 맞추기)
- Team 생성자 오류 수정
- 공유 옵션 테스트에서 텍스트 중복 문제 해결(정확한 위젯/타입 기반 검증)
- 테스트용 위젯 도입 및 테스트 환경 분리
- 테스트 코드와 테스트용 위젯 텍스트/구조 일치
- 테스트 코드 재실행 및 통과 확인
- (개선) 게임 수 필드 중복 제거 및 검증 강화
- (개선) 배지 공통화: 이벤트 유형/상태 배지를
_buildBadge기반으로 일원화 - (개선) 참가자 탭 배지 공통화: 회원유형/참가상태/결제상태 배지
_buildBadge적용 - 이벤트 상세 화면 위젯 테스트(event_details_screen_test.dart) 전체 통과 확인
- 이벤트 상세 화면에서 참가자/점수 추가·수정 기능을 폼 화면과 실제 연결 (
participant_form_screen.dart,score_form_screen.dart사용) - 참가자/점수 추가·수정 완료 시
_loadEventDetails()로 데이터 갱신 및 관련 탭 유지/이동 처리 - ParticipantFormScreen 위젯 테스트(StubEventService + pop 검증) 통과
- ScoreFormScreen 위젯 테스트(StubEventService + pop 검증) 통과
- 실패 케이스 테스트 추가: Stub이 예외 throw 시 에러 스낵바,
_isLoading해제, pop 미호출 검증 - 테스트 유틸 공통화:
test/utils/stub_event_service.dart로 Stub 분리 및 재사용 - EventService 경로 커버리지 보강(성공/실패, add/update 모두)
- (신규) iOS 참가자 빠른추가 UX 구현: 참가자 탭 상단에 회원 드롭다운/게스트 즉시 추가,
EventService.addParticipant연동, 로컬 목록 즉시 갱신 및 스낵바 처리
구현 계획 및 우선순위
1단계: 이벤트 폼/상세/참가자 관리 필수 기능 개선
- (개선) 공개 URL 생성/재생성 버튼 중복/로직 점검 및 명확화
- (개선) 공개 URL 생성/재생성 버튼 구체적 개선 작업 및 코드 반영
- (개선) 공개 비밀번호 설정 필드 UI/UX 점검 및 테스트
- (개선) 참가비 통화 형식 실시간 표시 및 입력 검증 (코드 반영)
- (개선) 필수 필드 유효성 검사 메시지 정상 동작 코드 반영
- 탭 데이터 로딩 상태 관리 개선
- 회원 유형/참가자 상태/결제 상태 뱃지 표시 및 스타일링
- 참가자 관리 UI 개선 (검색/필터/정렬/카드 디자인/뱃지/등록일 등)
2단계: 점수 관리 및 팀 편성 기능 고도화
- 점수 순위 표시 및 계산 로직 구현 (동점자 처리 추가)
- 핸디캡 포함 점수 계산/표시 (핸디캡 포함/미포함 전환 시 순위 업데이트 개선)
- 평균 점수 계산/표시
- 점수 스타일링(스트라이크/스페어 등)
- 팀 생성 옵션 UI 개선(인원수/팀 개수 기준)
- 드래그&드롭 팀원 순서 변경
- 팀 에버리지/핸디캡 계산 및 표시
- 미배정 인원 표시 개선
- 린트 오류 전수점검 및 수정
- Widget Function() 타입 불일치 수정
- 함수 표현식 명명 오류 수정
- 기타 린트 오류 수정
3단계: UI/UX 및 고급 기능 개선
- 뱃지/다이얼로그/데이터테이블 등 스타일링 개선 (Material 3 기반)
- 참가자 일괄 추가/가져오기, 이벤트 복제/공유, 통계/보고서, 알림 기능 등
다음 작업(TDD)
- 이벤트 상세 화면 위젯 테스트 보강: 참가자/점수 추가/수정 플로우(폼 진입, 저장 성공 시 리스트 갱신 및 탭 유지 확인)
ParticipantFormScreen위젯 테스트: StubEventService + pop 검증(완료)ScoreFormScreen위젯 테스트: StubEventService + pop 검증(완료)- 실패 케이스 테스트 추가: Stub이 예외 throw 시 에러 스낵바,
_isLoading해제, pop 미호출 검증 - 테스트 유틸 공통화:
test/utils/stub_event_service.dart로 Stub 분리 및 재사용 - EventService 경로 커버리지 보강(성공/실패, add/update 모두)
구현 시 주의사항
- Flutter에서는 위젯 생성자에서 child 또는 children 매개변수가 항상 마지막에 위치해야 함
- 서버에 null 값을 전송할 때는 JSON 변환 과정에서 명시적으로 null을 설정해야 함
- 각 컴포넌트별 구현 시 Vue.js의 PrimeVue 컴포넌트와 유사한 UI/UX 경험을 제공하도록 Flutter 위젯 스타일링 필요
긴급 수정 필요 사항
- TabBar와 TabBarView 컨트롤러 길이 불일치 오류 수정
- 컨트롤러 길이(4)와 탭/자식 수(3) 불일치 문제
- 이벤트 상세 화면에서 발생하는 오류
- TabController 길이가
_showTeamTab값에 따라 동적으로 설정되도록 이미 구현되어 있었음 _tabController = TabController(length: _showTeamTab ? 4 : 3, vsync: this);로 올바르게 설정됨
_buildTeamsTab메서드 정의 오류 수정- event_details_screen.dart 파일의 599번 라인에서 발생
- 람다식(
() => _buildTeamsTab())을 사용하는 대신 함수 자체(_buildTeamsTab)를 직접 전달하는 방식으로 수정 - 이전 코드:
if (_showTeamTab) _buildTabContent(3, () => _buildTeamsTab()), - 수정된 코드:
if (_showTeamTab) _buildTabContent(3, _buildTeamsTab),
- 공유 기능 관련 메서드 미정의 검토
- 과거에
.bak파일 기준으로 검출되었으나, 현재 원본 코드에서는 해당 메서드 호출이 없음 - 현 시점에서는 구현 불필요로 판단하여 보류. 추후 호출 추가 시 별도 작업으로 진행
- 과거에
Current Goal (as of 2025-09-10)
플래키 테스트 안정화 및 다크 모드 실기 점검 병행
- 서비스/위젯 테스트의 비동기 수렴 대기 보강(idle + 지연 + 필요 시 폴링)으로 전체 그린 확률 극대화
- 자동화 스크립트로 실패 파일만 재실행 및 리포트(플래키 패턴 축적/분석)
- 다크 모드 대비(배지/보조 텍스트/아이콘) 실기 점검 및 팔레트/스타일 미세 보정 후보 도출
그 다음: 3단계 UI/UX 및 고급 기능 개선
- 배지/다이얼로그/데이터테이블 등 스타일링 개선(Material 3 기반)
- 참가자 일괄 추가/가져오기, 이벤트 복제/공유, 통계/보고서, 알림 기능 등
오늘 진행 계획 (2025-09-02)
- MemberService.fetchClubMembers 로깅/UI 분기(로딩/에러/빈) 반영 재확인 및 필요한 위젯/서비스 수정
- 게스트 사전입력 모달(BottomSheet) 실제 구현 연동 및 테스트 보강
- 참가자 카드 RenderFlex overflow 수정(Row→Wrap/Flexible) 및 시각 회귀 테스트
- 참가자 API 404 가드 재확인 및 에러/리트라이 UX 강화
- mobile 전체 flutter test/린트 실행 후 그린 유지 확인
오늘 진행 계획 (2025-08-28)
- 게스트 사전입력 모달 위젯 테스트 2건 추가 및 통과(저장 성공/닫기 취소 케이스)
- plan.md 갱신 및 다음 세션 체크리스트 업데이트
- iOS 시뮬레이터 수동 테스트: 게스트 생성→참가자 추가/드롭다운/저장/취소/네트워크 실패 UX 확인
- 참가자 드롭다운 빈/에러 추가 케이스 위젯 테스트 보강
다음 세션 체크리스트 (2025-08-29 예정)
- iOS 수동 점검: 게스트 생성→참가자 추가/드롭다운 표시/저장/취소/네트워크 실패 UX
- 참가자 드롭다운 위젯 테스트: 로딩/에러/빈 목록 분기 추가 (완료)
- MemberService.fetchClubMembers 로깅 및 UI 분기(로딩/에러/빈) 반영 재확인
- 참가자 카드 RenderFlex overflow 수정(Row→Wrap/Flexible) 및 시각 회귀 테스트
- 전체 flutter test/린트 실행 후 그린 유지 확인
오늘 진행 계획 (2025-08-16)
- 재현 시나리오 정리: 이벤트 상세 화면 → 참가자 탭 진입 직후 드롭다운 빈 목록 케이스를 로깅으로 확인
- 원인 분석:
MemberService.fetchClubMembers()호출 타이밍/필터/상태 notify 경합 점검, 로딩/에러/빈 상태 UI 분기 추가 설계 - 수정안 초안: 탭 진입 시 강제 재조회 옵션 + 이미-참가자 필터 안정화 + 로딩 인디케이터/빈 목록 안내 적용
- 게스트 사전입력 모달 와이어프레임 → 필드 정의(회원/참가 정보 선택 입력) 및 저장 플로우 확정
- 위젯 테스트 추가: 드롭다운 로딩/에러/빈 목록 분기, 모달 저장 성공/실패(pop, 스낵바, 로딩 해제) 검증
- 서비스 테스트 추가: 멤버 생성 실패/참가자 추가 실패 각각의 예외 전파 및 UI 상태 복구
- iOS 시뮬레이터 수동 점검: 게스트 생성→참가자 추가/취소/실패 UX
단기 개선: 드롭다운/게스트 추가 UX (게스트·참가 정보 선택입력)
- 배경: 참가자 탭 상단의 회원 선택 드롭다운이 간헐적으로 리스트를 표시하지 않음. 게스트 즉시 추가는 입력 없이 생성/추가되어 운영 요구와 괴리.
- 목표: 드롭다운 표시 문제 해결 및 게스트 추가 시 회원가입처럼 정보를 “선택사항”으로 입력하고, 참가 정보도 함께 입력 가능하도록 UX 개선.
작업 항목 (설계)
- 회원 드롭다운 미표시 원인 분석/수정
- 후보:
MemberService.fetchClubMembers()호출 타이밍, Provider 상태 변화 누락, 이미-참가자 필터 로직, 탭 전환/리빌드 시점(setState) 경합, 네트워크/오류 처리 누락. - 해결: 로딩/에러 상태 UI 분기, 빈 목록 안내, 필터 조건 검증(참가자 제외 시에도 최소 N명 노출 확인), 탭 진입 시 강제 재조회 옵션.
- 후보:
- 게스트 추가 UX를 “사전 입력 모달(BottomSheet)”로 변경 (선택 입력)
- 회원 정보(선택): 이름(기본값 '게스트', 수정 가능), 성별, 이메일, 전화번호, 핸디캡(기본 0). 미입력 시 서버 기본값 적용.
- 참가 정보(선택): 참가상태(기본 '등록됨'/registered), 결제상태(기본 'unpaid'), 비고.
- 동작: 저장 시
MemberService.addMember()→ 반환memberId로EventService.addParticipant()순차 처리. 취소 시 어떤 생성도 하지 않음. - 정책: 기존의 즉시 확정(confirmed) 대신 기본은 '등록됨'(registered)로 낮춰 오해 방지.
- RenderFlex overflow 대응: 참가자 카드 subtitle 영역 Row → Wrap/Flexible로 변경하여 넘침 방지.
TDD/검증 계획
- 위젯 테스트: 드롭다운이 최소 1개 이상 옵션을 렌더하는지, 로딩/에러/빈 목록 분기 검증.
- 위젯 테스트: 게스트 모달 폼에서 필드 미입력 저장 시 성공(pop true), 실패 시 에러 스낵바, 로딩 해제, pop 미호출.
- 서비스 테스트: 모달 저장 플로우에서 멤버 생성 실패/참가자 추가 실패 각각의 예외 전파 및 UI 상태 복구 검증.
- 회귀 테스트: 기존 참가자/점수 CRUD 플로우 영향 없음 확인.
오류 원인/디버깅 기록(추정 및 계획)
- 드롭다운: 비동기 로딩 완료 전 렌더, 참가자-제외 필터가 모든 항목을 제거, 또는 Provider notify 누락 가능성. 디버그 로그와 상태 인디케이터로 추적.
- 게스트 추가: 서버 제약(
handicap allowNull:false)에 null 전송 시 500 발생 사례 확인 → 키 제거로 해결됨. 추가로 상태 기본값/입력 절차 정립 필요.
다음 세션 체크리스트 (2025-08-13 기준)
- 실패 케이스 위젯 테스트 추가
ParticipantFormScreen/ScoreFormScreen에서 Stub이 예외 throw 시 스낵바 에러 메시지 노출,_isLoading해제,Navigator.pop미호출 검증
- 테스트 유틸 공통화
test/utils/stub_event_service.dart생성 후 StubEventService 공통 재사용으로 중복 제거
- 이벤트 상세 화면 플로우 보강 테스트
- 폼 저장 성공 시 리스트 갱신 및 탭 유지/이동 확인
- UI/UX 3단계 작업 킥오프
- 배지/다이얼로그/데이터테이블 스타일 개선, PrimeVue 유사 디자인 가이드 정리 및 적용 초안 작성
다음 세션 체크리스트 (2025-08-14 기준)
- MemberService 이벤트 테스트 재확인:
ClubChangedEvent처리 검증 간헐 실패 재현/해결 여부 점검 - EventBus 테스트 유틸 고도화: 테스트 ID 트래킹, 인스턴스 맵 정리, 비동기 타이머 대기 헬퍼 공용화 (
test/utils/event_bus_test_utils.dart추가, 2025-08-15) - dispose/tearDown 전수 점검: 모든 서비스/위젯 테스트에서
await dispose()/await tester.pump()누락 없는지 확인 - 더미 데이터 헬퍼 공용화: 참가자/점수 더미 생성기를
test/utils/로 분리해 중복 제거 - 더미 데이터 헬퍼 공용화: 참가자/점수 더미 생성기를
test/utils/로 분리해 중복 제거 (mobile/test/utils/dummy_test_data.dart생성) - 더미 데이터 유틸 적용:
score_form_screen_test.dart에DummyTestData적용 및 전체 테스트 그린 확인 (2025-08-15) - 더미 데이터 유틸 적용:
participant_form_screen_test.dart리팩터링 (DummyTestData적용) 및 회귀 테스트 (2025-08-15) - 삭제/로딩 오버레이 시나리오 추가 케이스 보강: 다중 항목/빈 목록 경계값 테스트
- 린트 수정:
test/screens/club/test_event_details_screen.dartL826setState경고 해결(Stateful 위젯/StatefulBuilder로 대체) - 린트 수정:
test/screens/club/test_event_details_screen.dartL826setState경고 해결(Stateful 위젯/StatefulBuilder로 대체) - iOS 시뮬레이터 수동 점검: 삭제 동작 중 로딩 오버레이 표시/해제, 실패 시 스낵바 노출 확인
결정/근거 로그
- 테스트 전략: mockito 매처(null-safety) 문제로 인해 Option A(StubEventService + UI pop 검증) 채택
- 검증 방법: 스낵바 텍스트 대신
Navigator.pop(true)로 성공 플로우 검증 → 안정성과 단순성 향상 - 현황: Participant/Score 폼 위젯 테스트 모두 Stub 기반으로 통과, 전체 테스트 그린 상태 유지
- 추가: 공통 스텁
mobile/test/utils/stub_event_service.dart도입으로 중복 제거 및 실패 시나리오(추가/수정) 테스트 추가 완료. 실패 시 스낵바 메시지 노출, 화면 pop 미호출을 검증. - 서비스 커버리지:
mobile/test/services/event_service_test.dart에 다음 경로 테스트 보강 완료- 참가자: add/update 실패 예외 전파 및 로딩 해제, 목록 불변 검증
- 점수: add/update 실패, updateScore 성공, deleteScore 성공 검증
- 2025-08-14: 서비스 테스트 안정화 완료(tearDown/await, EventBus reset 보강).
event_details_screen_test.dart삭제 테스트는 초기 데이터 미주입으로 버튼 미렌더링 → 더미 데이터 주입으로 해결. 화면/전체 테스트 모두 통과. - 2025-08-14: 린트 경고 해결 —
test_event_details_screen.dart외부에서의setState직접 호출을toggleLoading(false)헬퍼로 교체하여 안전한 상태 갱신 보장 및 경고 제거. - 2025-08-15: 테스트 더미 데이터 공용화 확장 —
score_form_screen_test.dart의 로컬 더미 생성 함수를DummyTestData로 대체하여 중복 제거 및 일관성 향상. 적용 후mobile/전체flutter test를 실행해 모두 통과(그린) 확인. - 2025-08-15: Participant 폼 테스트 리팩터링 —
participant_form_screen_test.dart에DummyTestData.participants()적용. 화면 드롭다운 옵션(['등록됨','확인됨','취소됨','참석함'])과 더미 기본값('confirmed') 불일치로 인한 위젯 빌드 실패를 발견, 테스트 데이터의status: '확인됨'지정으로 정합성 확보. 전체 테스트 그린 유지. - 2025-08-15: EventBus 테스트 유틸 추가 —
test/utils/event_bus_test_utils.dart도입.EventBusTestUtils.setUp(testId)/tearDown()로 테스트 격리·정리 절차 캡슐화,registerIn(...)헬퍼 제공. 도입 후mobile/전체flutter test재실행하여 회귀 없음(그린 유지) 확인. - 2025-08-15: iOS 시뮬레이터 원격 백엔드 실행 검증 —
--dart-define=API_BASE_URL=http://lanebow.com:3030/api로 실행. 초기 요청(POST /api/club/events,POST /api/club/members) 200 OK 확인. 토큰 포함 요청 및 데이터 로드 정상. - 2025-08-15: macOS 타겟 빌드 이슈 기록 —
in_app_purchase_storekit플러그인이 요구하는 최소 macOS 배포 타겟(>=10.15) 미달로 macOS 실행 실패. iOS 시뮬레이터로 우회 진행. 추후 필요 시macos/프로젝트 최소 타겟 상향 필요.
부록: EventBus 테스트 유틸 사용 가이드(요약)
// test/my_test.dart
import 'utils/event_bus_test_utils.dart';
void main() {
setUp(() async => EventBusTestUtils.setUp('my_test_id'));
tearDown(() async => EventBusTestUtils.tearDown());
}
런타임 오류 기록 (2025-08-16T21:51:36+09:00)
- 요약: 수동 실행 중 API 호출 흐름에서 참가자 관련 엔드포인트 404 발생 후, 올바른 엔드포인트로 재시도되어 201 성공.
- 정상 응답:
POST https://lanebow.com/api/club/events→ 200 OK (이벤트 목록)POST https://lanebow.com/api/club/members→ 200 OK (클럽 회원 목록)
- 오류:
POST https://lanebow.com/api/club/events/participants→ 404 Not Found- 서버 응답:
Cannot POST /api/club/events/participants - 원인 추정: 참가자 조회/목록 API 경로가 잘못된 레거시 경로를 사용 중일 가능성.
- 서버 응답:
- 이후 성공:
POST https://lanebow.com/api/club/events/1/participants→ 201 Created (참가자 추가/업데이트)
조치 항목
- EventService 점검:
fetchEventParticipants(가칭) 또는 참가자 목록 조회 메서드가${ApiConfig.events}/participants를 사용 중인지 확인하고,${ApiConfig.events}/<eventId>/participants사용으로 정정. - 네트워크 에러 핸들링: 404 수신 시 사용자 메시지/리트라이 처리 보강. 잘못된 경로라면 즉시 올바른 경로로 전환하도록 가드 추가.
- 로그 유지: 현재
runtime_log.txt에 전체 로그가 저장됨. 필요 시 추가 오류를 동 동일 섹션에 누적 기록.
런타임 오류 기록 (2025-08-16T21:54:03+09:00)
- 증상: 게스트 추가 버튼 탭 직후 앱 중단 수준의 어설션 에러 발생.
- 에러:
package:flutter/src/material/dropdown.dart: Failed assertion ... There should be exactly one item with [DropdownButton]'s value: pending. - 원인 추정:
- 모달 내 드롭다운 기본값(value)과 items 값 불일치 또는 중복. 예: 결제 상태 기본값 'pending' vs 옵션 값 'unpaid'/'paid'.
- 또는 참가 상태 기본값 영문/한글 불일치(예: 'registered' vs '등록됨').
- 조치 항목:
- 게스트 모달(
_openGuestModal)의 상태/결제 상태 드롭다운 기본값을 실제 items 값과 동일하게 정합성 확보. - 방어 로직 추가:
safeValue = items.any((i)=> i.value == value) ? value : null로 어설션 회피. - items 생성 시 중복 value 제거 및 라벨/값 매핑 일원화.
- 런타임 로그 필터에
Failed assertion키워드 추가하여 이후 자동 캡처 강화.
- 게스트 모달(
수정 적용 (2025-08-16T21:54:03+09:00)
- 게스트 모달 드롭다운 수정: 기본값
participantStatus='registered',paymentStatus='unpaid'로 정합성 확보. value 안전 가드 추가(items미포함 시 null로 대체)로 어설션 방지. 파일:mobile/lib/screens/club/event_details_screen.dart'_openGuestModal()'. - 참가자 API 경로 수정:
fetchEventParticipants()가${ApiConfig.clubs}/events/{eventId}/participants를 사용하도록 변경. 리스트/객체 응답 모두 파싱. 파일:mobile/lib/services/event_service.dart.
검증 계획
- 위젯 수동 점검: 게스트 추가 모달 열기 → 상태/결제 드롭다운 선택/저장 플로우 확인, 크래시 없는지 검증.
- 네트워크 확인: 참가자 목록 로드 시 404 미발생 확인 후, 실제 목록 렌더링 확인.
- 로그 강화: 런타임 로그 필터에
Failed assertion추가(다음 작업).
다음 세션 이어가기 메모 (2025-08-23T20:08:24+09:00)
-
즉시 시작 순서
MemberService.fetchClubMembers()호출 타이밍/이미-참가자 필터/Provider notify 경합 로깅으로 재현 → 빈/에러/로딩 분기 UI 반영 (mobile/lib/screens/club/event_details_screen.dart)- 게스트 사전입력 모달(BottomSheet) 설계·구현 시작: 회원/참가 정보 선택 입력, 기본값 정합성(예: status='registered', payment='unpaid') 유지, 안전 가드 적용
- 참가자 카드 RenderFlex overflow 개선: subtitle 영역
Row→Wrap/Flexible로 교체 및 시각 회귀 테스트 추가 - 참가자 API 경로/404 가드 재확인:
${events}/{eventId}/participants사용 여부 검증 및 에러 메시지/리트라이 처리 - 전체 테스트/린트 실행으로 그린 유지
-
테스트 계획
- 위젯 테스트: 드롭다운 로딩/에러/빈 목록 분기, 모달 저장 성공(pop true)/실패(스낵바, 로딩 해제, pop 미호출)
- 서비스 테스트: 멤버 생성 실패/참가자 추가 실패 각각 예외 전파 및 상태 복구
-
디버깅 포인트
-
드롭다운 value/items 정합성 불일치 어설션 재발 방지: items 미포함 시 null 대체 가드
-
EventBus/Provider notify 타이밍 경합 로그로 추적, 탭 전환 시 강제 재조회 옵션 검토
오늘 진행 계획 (2025-08-23)
- MemberService.fetchClubMembers 로딩/필터/notify 경합 로깅 추가 및 참가자 탭 로딩/에러/빈 상태 UI 분기 반영 (
mobile/lib/screens/club/event_details_screen.dart) - 게스트 사전입력 모달(BottomSheet) 설계·구현: 회원/참가 정보 선택 입력, 기본값 정합성 보장(status='registered', payment='unpaid'), 안전 가드 적용
- 참가자 카드 RenderFlex overflow 수정: subtitle Row→Wrap/Flexible 및 시각 회귀 테스트 추가
- 참가자 API 경로/404 가드 재확인 및 에러 메시지/리트라이 처리 강화
- 위젯 테스트: 드롭다운 로딩/에러/빈 목록 분기, 모달 저장 성공/실패(pop/스낵바/로딩 해제) 검증
- 서비스 테스트: 멤버 생성 실패/참가자 추가 실패 예외 전파 및 상태 복구 검증
- 전체 테스트/린트 실행 및 그린 유지
진행 현황 업데이트 (2025-08-23T20:11:28+09:00)
- 진행중: MemberService.fetchClubMembers 로깅 및 UI 분기 반영 작업 착수
- 대기: 게스트 사전입력 모달 설계/구현, RenderFlex overflow 수정, API 404 가드 재확인, 테스트 보강, 전체 그린 확인
진행 현황 업데이트 (2025-08-24T20:36:04+09:00)
- 구독 서비스 테스트 안정화:
mobile/test/integration/subscription_service_integration_test_fixed3.dart개선으로 통합 테스트 전부 통과(그린).- EventBus 격리:
EventBusTestUtils.setUp/tearDown패턴 유지, 테스트 ID 적용 및 dispose 보장. - 모킹 보강:
mockClient.get/post(any, ...)로 수신 후 URI에서 엔드포인트 포함 여부로 분기하여 스텁 미스 방지. - JSON 스키마 정합성:
SubscriptionPlan.fromJson스키마에 맞춰 테스트 더미 키/타입 수정(ASCII 문자열 사용). - 비동기 대기: 플랜 목록 로드 테스트에서
_loadAvailablePlans()완료까지 폴링 대기 후 검증. - 결과: 파일 단독 실행 및 전체 파일 실행 모두 성공.
- EventBus 격리:
다음 액션(구독/테스트 품질)
- 남은 린트 경고 정리(
members_screen.dart,team_generator_screen.dart등: null 병합/단락 연산 불필요 코드 제거, 잘못된 @override 제거). - 유사 패턴의 비동기 초기화 테스트에 완료 대기(폴링/헬퍼) 적용 여부 점검.
진행 현황 업데이트 (2025-08-24T20:50:17+09:00)
-
MemberService dispose 플래키 해결:
mobile/test/services/member_service_test.dart의 dispose 테스트를 로컬 격리 패턴으로 수정하여 교차 간섭 제거 및 신뢰성 확보.- 원인: 전역 mock/서비스 공유 + EventBus 비동기 해제 타이밍 경합으로 간헐적 상호작용 검출.
- 수정: 각 테스트 내에서
MockApiService와MemberService.forTest()를 새로 생성해 격리. dispose 이후 보장 검증을verifyZeroInteractions(localMock)로 단순·강화. 기존 800ms 대기 유지. - 결과: 단일/전체 실행에서 dispose 시점 이후 API 호출 없음이 안정적으로 보장됨.
-
ClubService updateClub 테스트 플래키 현황:
mobile/test/services/club_service_test.dart의updateClub2케이스(래핑{club:{...}}/직접 객체 반환)가 단일 실행에서는 그린, 전체 스위트 병행/순차 실행 시 간헐 실패.- 추정 원인: 테스트 간 상태 공유(전역 mock/서비스), EventBus/SharedPreferences 사이드이펙트, 응답 형태/리스트 갱신 타이밍 경합.
- 현재 확인: 서비스 구현(
mobile/lib/services/club_service.dart)은 두 응답 형태를 모두 처리. 테스트 모킹/검증 범위가 상태/순서에 민감할 가능성.
다음 액션(테스트 안정화 – 2025-08-24)
club_service_test.dart격리 강화: 각 테스트에서 로컬MockApiService/ClubService.forTest()생성,clearInteractions(localMock)사용.- EventBus 격리 여유 대기(미세) 추가 및
EventBusTestUtils호출 위치 재점검. - SharedPreferences 초기화(setUp) 보강, 테스트 간 clubId/토큰 잔존 제거.
updateClub검증을 상호작용 중심에서 상태 결과 중심(현재 클럽/리스트 갱신)으로 단순화.- 전체 스위트 반복 실행으로 안정성 확인(
flutter test -r expanded; 필요 시-j 1비교 실행).
실행 원칙
- 전체 스위트 기준으로 그린 확인을 목표(사용자 선호 반영).
- 빠른 수정/커밋 후 재실행 사이클 유지, 플래키의 원인/디버깅/결과를 본 플랜에 즉시 기록.
진행 현황 업데이트 (2025-08-25T08:35:25+09:00)
- 전체 테스트:
mobile/전체flutter test그린(모든 테스트 통과 확인). - ClubService updateClub 플래키 제거:
mobile/test/services/club_service_test.dart의 2 케이스 격리/검증 단순화로 안정화.- 원인: 전역 mock/서비스 공유 및 EventBus/Prefs 잔존 상태에 따른 경합.
진행 현황 업데이트 (2025-08-25T21:07:43+09:00)
- 게스트 사전입력 모달 TDD 1차 완료: 테스트 헬퍼 위젯(
test/screens/club/test_event_details_screen.dart)에 최소 플로우 구현(툴팁 버튼 → 바텀시트 모달 → 저장 시 스낵바) 및 위젯 테스트 추가(event_details_screen_test.dart).- 검증 포인트: 버튼 렌더, 모달 타이틀/라벨(상태:, 결제:), 저장 시 모달 닫힘+스낵바, 탭 유지.
- 결과: 단일/전체 테스트 모두 통과(그린 유지).
- 다음 작업 준비: 서비스 실패/빈목록/이벤트 구독 흐름 테스트 보강(
MemberService.fetchClubMembers) 및 참가자 카드 RenderFlex overflow 수정 계획 반영.
진행 현황 업데이트 (2025-08-25T21:15:30+09:00)
- RenderFlex overflow 회피 적용: 실제 화면
mobile/lib/screens/club/event_details_screen.dart참가자 카드 타이틀Text에maxLines: 1+overflow: TextOverflow.ellipsis적용.- 회귀 테스트:
event_details_screen_test.dart긴 이름 케이스 추가로 ellipsis 속성 검증. - 결과:
mobile/전체flutter test그린.
- 회귀 테스트:
진행 현황 업데이트 (2025-08-27T08:57:40+09:00)
- MemberService 테스트 보강: 다음 케이스 추가 및 통과
- clubId=null일 때
fetchClubMembers예외 전파 +isLoading=false+lastError설정 검증(비동기 안정화 대기 포함) - API 응답이
{'members': [...]}객체형일 때 파싱 정상 동작 검증 - 성공 시
lastLoadedAt설정 검증
- clubId=null일 때
- 결과:
mobile/전체flutter test그린(플래키 없음)- 조치: 각 테스트에서 로컬
MockApiService+ClubService.forTest()생성,EventBusTestUtils.setUp/tearDown유지, 검증을 상호작용 중심 → 상태 결과 중심으로 전환.
- 조치: 각 테스트에서 로컬
- EventService 통합 테스트 스텁 정합성: 참가자 리스트 엔드포인트/페이로드 스텁을 구현과 일치시켜 MissingStubError 제거.
- 구현 경로:
POST ${ApiConfig.clubs}/events/{eventId}/participants/list(필요 시clubId/userId포함) - 테스트: 해당 엔드포인트로 mock 분기,
data: anyNamed('data')로 매처 완화.
- 구현 경로:
- MemberService dispose 검증: EventBus 로그 기반으로 테스트 인스턴스 초기화/해제 절차가 정상 수행됨을 확인(구독 0, 인스턴스 dispose/reset 상태 일치).
다음 액션(안정화/품질)
- 기본 병렬 설정으로 전체 스위트 2~3회 반복 실행하여 플래키 재발 여부 추가 확인.
- 남은 린트 경고는 별도 PR로 정리.
오늘 진행 계획 (2025-08-25)
- (TDD-우선) 위젯 테스트부터 작성/보강: 드롭다운 로딩/에러/빈 목록, 모달 저장 성공/실패(pop/스낵바/로딩 해제)
- (TDD-우선) 서비스 테스트: 멤버 생성 실패/참가자 추가 실패 예외 전파 및 상태 복구
- 구현: MemberService.fetchClubMembers 로깅 강화 및 참가자 탭 로딩/에러/빈 상태 UI 분기 반영 (
mobile/lib/screens/club/event_details_screen.dart) - 구현: 게스트 사전입력 모달(BottomSheet) — 회원/참가 정보 선택 입력, 기본값 정합성(status='registered', payment='unpaid'), 안전 가드 적용
- 구현: 참가자 카드 RenderFlex overflow 수정 — subtitle Row→Wrap/Flexible 및 시각 회귀 테스트 추가
- 안정화: 참가자 API 경로/404 가드 재확인 및 에러 메시지/리트라이 처리 강화
- 품질: 전체 테스트/린트 실행 및 그린 유지
- 품질: 전체 스위트 2~3회 반복 실행으로 플래키 재발 여부 점검(
flutter test -r expanded비교 실행 포함) - 품질: 남은 린트 경고 정리 PR 분리 제출
진행 현황 업데이트 (2025-08-25T08:37:56+09:00)
- 플랜 갱신: 오늘 작업 계획 수립 및 체크리스트/Current Goal 날짜 갱신.
- 테스트 전략 유지: 전체 스위트 반복 실행으로 플래키 재발 방지 계획 확정.