Skip to main content
← 블로그

3월 업데이트: 심사 대응, 캘린더 크래시, 그리고 Desktop 개선

VauDium ·

애플 심사 거절 대응부터 Hermes GC 크래시 디버깅, Desktop UI 대폭 개선까지. 이틀간의 기록.

3월 업데이트: 심사 대응, 캘린더 크래시, 그리고 Desktop 개선

이틀간 꽤 많은 것들이 바뀌었습니다.

애플 심사 대응

앱스토어 심사에서 거절을 받았습니다. 몇 가지를 수정했습니다.

Apple 로그인 개선

Apple로 로그인할 때 받는 이름과 이메일 정보를 서버에서 바로 설정하도록 변경했습니다. 이전에는 로그인 후 클라이언트에서 별도 API를 호출해서 닉네임과 이메일을 세팅했는데, Apple이 최초 로그인 시에만 이 정보를 제공하기 때문에 서버에서 바로 처리하는 게 맞습니다.

서베이 화면에서도 서버에 이미 닉네임이 있으면 미리 채워두도록 했습니다.

회원탈퇴 간소화

회원탈퇴에서 비밀번호 입력 과정을 없앴습니다. Apple/Google 소셜 로그인 사용자는 비밀번호가 없을 수도 있으니까요. 대신 확인/취소 버튼으로 간단하게 바꿨습니다.

탈퇴 시에는 계정 정보를 soft delete합니다. document 자체는 유지하되 개인정보(이름, 이메일, 소셜 계정 등)를 모두 제거합니다.

캘린더 크래시

가장 골치 아팠던 문제입니다. 캘린더 탭으로 이동하면 앱이 죽었습니다.

크래시 리포트를 분석하니 Hermes VM의 GC(가비지 컬렉터)에서 발생한 문제였습니다. 캘린더가 마운트될 때 너무 많은 객체가 한꺼번에 생성되면서 GC가 처리를 못 한 겁니다.

적용한 수정들

  1. weekTasksMap 배열 참조 안정화 — 이전 배열과 내용이 같으면 새 배열 대신 이전 참조를 재사용. WeekCalendarRow의 memo가 실제로 작동하도록.

  2. extraData 변경extraData={weekTasksMap} (Map 객체)을 extraData={taskDataVersion} (숫자)으로 교체. Map은 매번 새 객체라서 FlatList가 모든 셀을 re-render했는데, 숫자로 바꾸고 InteractionManager로 defer.

  3. FlatList 최적화 — windowSize 5→3, removeClippedSubviews=true.

  4. Holiday fetch defer — InteractionManager.runAfterInteractions로 감싸서 마운트 직후 promise 폭주 방지.

재현이 어려운 크래시라 확신할 수는 없지만, GC 압박을 여러 경로로 줄였습니다. Sentry도 추가해서 이후 크래시를 더 정확히 추적할 수 있게 했습니다.

기능 개선

알림 탭 시 유형별 이동

알림을 탭했을 때 task 유형에 따라 다른 탭으로 이동합니다.

  • 날짜가 있는 task → 캘린더 탭으로 이동하고 해당 날짜로 스크롤
  • 날짜가 없는 task → 목록 탭으로 이동

dismissTo("/(tabs)")로 Stack을 정리한 뒤 탭을 전환해서, login 화면이 노출되는 것을 방지합니다.

버킷리스트 이동

버킷리스트를 Tasks 탭에서 Achiever 탭으로 옮겼습니다. showBucketlist 설정 토글도 제거하고, 스와이프로 버킷리스트에 추가하는 기능은 항상 활성화됩니다.

Venue 주소 입력 개선

Venue 아이템 생성 시 단순 TextInput 대신 AddressInput(주소 검색 화면)을 사용하도록 변경했습니다. 생성 API에도 좌표(latitude/longitude) 파라미터를 추가했습니다.

주소 검색 화면의 버그도 수정했습니다. 이전 검색 결과가 남아있거나, 주소를 지워도 지도 프리뷰가 안 사라지는 문제.

Daily Routine

요일 순서를 월→일에서 일→토로 변경하고, ALL 뷰에서 드래그 드랍 시 optimistic update를 적용했습니다. 일/토 요일 탭에는 빨간색을 적용했습니다.

Desktop 대폭 개선

Preparation 아이템

Desktop의 preparation 아이템 UI를 모바일과 맞췄습니다.

  • 생성: + 버튼 클릭 시 카테고리별 모달이 열립니다. 모바일처럼 이름, 수량, 단위, 링크, 설명을 입력하고 생성.
  • 편집: 아이템 클릭 시 browse 모달이 열립니다. 각 필드 변경 시 체크/취소 버튼이 나타나고, Cmd+Enter로도 저장 가능.
  • 체크마크: checked/unchecked SVG로 교체. Optimistic update 적용.
  • 인라인 편집과 +Photo 버튼 제거: 모바일처럼 모달에서만 편집.

섹션 설정

  • 섹션 표시 설정 드롭다운 추가 (Details, Intention, Preparation, Retrospect, Attachments)
  • Preparation 서브섹션 설정 (Materials, Tools, Venue, Personnel, Qualification)
  • 섹션에 내용이 있으면 파란점 표시
  • 모두 optimistic update 적용

기타

  • 캘린더 키보드 단축키 (N: 생성, G: 템플릿 생성, T: 오늘)
  • CreateTaskRecordModal 크래시 수정 (handleSubmit 초기화 순서)
  • RichDescriptionEditor에 Cmd+Enter 저장 지원
  • 탭바 아이콘 바운스 애니메이션

코드 정리

  • showBucketlist 관련 미사용 코드 전면 삭제 (모바일 + Desktop)
  • QuantityInput 컴포넌트 추출
  • Preparation item description 번역 키 분리 (Tactics와 구분)

이틀치 작업이라고 하기엔 양이 많은데, Claude Code 덕분에 가능했습니다. 물론 중간중간 삽질도 있었지만요.