260227 TIL

TIL - 2026-02-27
오늘 새롭게 알게 된 것
Flutter 웹페이지 다국어 라우팅 구조:
public/ko/,public/en/,public/ja/디렉토리 분리 방식으로 정적 HTML 다국어를 구현하고,AppConstants의 정책 URL을locale파라미터를 받는 메서드로 변경하면 앱 내에서 사용자 언어에 맞는 정책 페이지를 자연스럽게 열 수 있다.Firestore
arrayContains쿼리와contentIds배열 설계: 장소(Place)에 단일contentId대신contentIds배열을 두고, Cloud Function에서 중복 장소를 검사해 기존 장소에 contentId를 추가하는 방식으로 변경하면 1:N 관계를 깔끔하게 처리할 수 있다. Firestore의arrayContains는 배열 필드 검색에 매우 효율적이다.Flutter Slidable 패키지 활용: 기존 스와이프-삭제 제스처를
flutter_slidable버튼 방식으로 교체하면 사용자가 실수로 삭제하는 것을 방지하면서도 직관적인 UX를 유지할 수 있다. "다시 묻지 않기" 토글과 함께 삭제 확인 다이얼로그 인프라를 구축했다.태그 유틸리티 방어적 필터링: 삭제된 태그가 UI에 계속 노출되는 버그는 태그 ID 불일치에서 비롯되었다.
tag_utils.dart에 중앙 집중식 유틸 함수를 만들고 ID 통일 + 방어적 필터링을 적용하면 이런 유형의 버그를 근본적으로 차단할 수 있다.
오늘 해결한 문제나 고민
설정/동의 화면 정책 링크 무반응 버그:
ai_consent_screen과settings_screen에서 정책 링크 클릭 시 아무 반응이 없던 문제를 수정했다. 하드코딩된 URL을AppConstants참조로 통일하고, locale 기반 동적 URL 생성으로 전환했다.탭 간 카테고리 필터 공유 문제: 홈 화면 탭 간에 카테고리 필터 상태가 공유되어 다른 탭의 콘텐츠 목록까지 필터링되는 오류를 수정했다. 각 탭이 독립적인 필터 상태를 가지도록 분리했다.
폐기 문서 대량 정리:
docs/8개 +docs_olds/11개, 총 19개 폐기 문서와 불필요한 이미지 22개를 삭제했다. 프로젝트 히스토리가 길어질수록 문서 부채가 쌓이는데, 주기적 정리가 중요하다는 것을 체감했다.콘텐츠 삭제 시 장소 참조 정합성:
contentIds배열 전환 후, 콘텐츠 삭제 시 해당 장소의contentIds에서 해당 ID를 제거하고, 빈 배열이 되면 장소도 삭제할지 사용자에게 확인하는 다이얼로그를 추가했다.이용약관/개인정보처리방침 실제 코드 불일치: 기술명세에 구체적 API명이 남아 있거나 보유기간이 실제 코드와 다른 부분을 발견하여 일반화 및 정합성 수정을 진행했다.
내일의 핵심 목표
Phase 82 계획 수립 및 신규 피처 개발 착수
다국어 웹페이지 실제 배포 후 각 언어별 정상 동작 검증
contentIds배열 기반 마이그레이션 완료 여부 최종 확인 및 엣지 케이스 테스트