Skip to content

fix(search): 현재 시간표 복원 전 초기화 크래시 방지 - #640

Closed
qdrptd wants to merge 2 commits into
developfrom
fix/search-viewmodel-missing-state
Closed

fix(search): 현재 시간표 복원 전 초기화 크래시 방지#640
qdrptd wants to merge 2 commits into
developfrom
fix/search-viewmodel-missing-state

Conversation

@qdrptd

@qdrptd qdrptd commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

변경 배경

앱 프로세스 복원 또는 초기 데이터 갱신 중 TableRepository.currentTable이 아직 비어 있을 수 있습니다. 기존 SearchViewModel은 생성 시 currentTable.valuecheckNotNull로 즉시 사용했기 때문에, 현재 시간표가 emit되기 전에 Search 탭이 구성되면 Required value was null. 예외로 앱이 종료될 수 있었습니다.

변경 사항

  • SearchUiState에 현재 시간표 준비 상태를 나타내는 TableState를 추가했습니다.
    • Loading: 저장된 현재 시간표가 없거나, Repository가 아직 첫 시간표를 emit하기 전 상태
    • Loaded: 검색 화면의 시간표 식별·표시에 필요한 courseBook, 강의 목록, 표시 범위, 표시 옵션, 테마가 모두 준비된 상태
  • SearchViewModel의 초기 상태를 TableState.Loading으로 변경하고, currentTable을 동기적으로 강제 검증하던 checkNotNull을 제거했습니다.
  • 기존 combine은 첫 현재 시간표를 수신하면 TableState.Loaded를 구성하도록 변경했습니다.
    • 같은 학기의 시간표 데이터 갱신에서는 기존 검색어, 선택 태그, 선택 강의를 유지합니다.
    • 학기가 바뀌면 이전 학기에 종속된 선택 강의, 검색 조건, 결과 상태, 바텀시트·다이얼로그 상태를 초기화합니다.
  • SearchScreen과 검색 바텀시트는 TableState.Loading일 때 시간표 의존 UI를 그리지 않습니다.
    • 화면은 로딩 indicator를 표시합니다.
    • 바텀시트는 placeholder를 표시합니다.
  • 검색어·태그·선택 강의·다이얼로그·바텀시트처럼 유효한 기본값을 가지며 시간표 로딩과 독립적으로 유지할 수 있는 UI 상태는 최상위 SearchUiState에 유지했습니다.

@qdrptd
qdrptd requested a review from a team as a code owner August 26, 2026 10:10
Copilot AI lite review requested due to automatic review settings August 26, 2026 10:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

이 PR은 앱 프로세스 복원/초기 갱신 타이밍에 TableRepository.currentTable이 아직 준비되지 않았을 때 SearchViewModelcheckNotNull로 즉시 접근하며 발생하던 크래시를 방지하기 위해, 검색 화면을 “현재 시간표 로딩” 상태를 포함하도록 구조를 변경합니다.

Changes:

  • SearchUiStateTableState(Loading/Loaded)를 도입하고, SearchViewModel 초기 상태에서 currentTable을 강제 검증하지 않도록 변경
  • SearchScreen/검색 바텀시트에서 Loading 동안 시간표 의존 UI를 그리지 않도록 처리(로딩 인디케이터/플레이스홀더)
  • DayTimePickerSheetContent의 요일 표시를 locale 기반으로 변경하고, 스크린샷 테스트에 영어 프리뷰를 추가

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
app/src/main/java/com/wafflestudio/snutt2/feature/search/SearchViewModel.kt 초기 currentTable null 가능성을 수용하도록 UI 상태 구조 변경 및 combine 로직 갱신
app/src/main/java/com/wafflestudio/snutt2/feature/search/SearchScreen.kt TableState.Loading 시 로딩 UI만 노출하고 시간표 의존 UI 렌더링 차단
app/src/main/java/com/wafflestudio/snutt2/feature/search/SearchDialogs.kt 다이얼로그 렌더링 API를 dialogState 중심으로 단순화
app/src/main/java/com/wafflestudio/snutt2/feature/search/SearchBottomSheetLayout.kt TableState에 따라 바텀시트 콘텐츠/플레이스홀더를 분기
app/src/main/java/com/wafflestudio/snutt2/feature/lecturedetail/DayTimePickerSheetContent.kt 요일 문자열 생성 로직을 locale 기반(DayOfWeek.getDisplayName)으로 변경
app/src/screenshotTest/java/com/wafflestudio/snutt2/feature/lecturedetail/DayTimePickerSheetContentScreenshotTest.kt 영어 locale 스크린샷 프리뷰 케이스 추가

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines 102 to +107
combine(
tableRepository.currentTable.filterNotNull(),
uiState,
::Pair,
).take(1).flatMapLatest { (table, state) ->
if (state.tableState !is SearchUiState.TableState.Loaded) return@flatMapLatest emptyFlow()
@qdrptd
qdrptd force-pushed the fix/search-viewmodel-missing-state branch from 56c251e to 3459651 Compare August 26, 2026 10:31
@JuTaK97

JuTaK97 commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

하 결국은 이렇게 갈수밖에 없는건가
크래시 안날거라고 기대했는데

@JuTaK97

JuTaK97 commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

이거 근데, Loading Indicator 가 어울리는지는 잘 모르겠어
홈 화면의 한가운데에 있는 메인 시간표인데..

차라리 로드될 때까지 splash screen 을 지연시키는 게 맞을 것 같음

@qdrptd

qdrptd commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

이거 이렇게 하는 거 좀 별론데
splash 지연으로 할까??

@JuTaK97

JuTaK97 commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

ㅇㅇㅇ 한번 splash 지연했을 때 초기값 null 문제 해소되는지 해보자 (TableRepository 이 사용하는 Date Source 의 초기값 설정 속도를 의도적으로 크게 늘려보는 형태로 테스트 가능할듯)

@qdrptd

qdrptd commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

#643 으로!

@qdrptd qdrptd closed this Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants