이벤트 필터링 아키텍처 및 필터 시트 동작 원리
이 문서는 앱 내 excluded-keywords(제외 키워드)가 실제 이벤트 목록 필터링에 어떻게 적용되는지, 그리고 UI(필터 시트) 동작이 왜 현재와 같이 설계되었는지 설명합니다. 클라이언트와 서버 간의 필터링 주체 차이로 인해 발생한 제약과 UX/UI 설계 철학을 반드시 이해해야 합니다.
1. 상태별 필터링 주체와 동작 방식
제외 키워드가 실제 이벤트 데이터에 반영되는 방식은 사용자의 로그인 여부에 따라 완전히 달라집니다.
A. 비로그인 상태: 클라이언트 주도 필터링
- 앱이
excluded-keywords를 로컬 DataStore에서 직접 읽어와 이벤트 목록을 필터링합니다.
- 클라이언트가 모든 데이터를 가지고 계산하므로 실시간 미리보기 개수 계산이 가능합니다.
- 따라서 필터 시트의 적용 버튼에
n개의 행사 보기와 같이 정확한 숫자를 표시할 수 있습니다.
B. 로그인 상태: 서버 주도 자동 필터링 (주의 구간)
- 로그인 상태에서는 이벤트 API(예:
/month, /day) 요청 시 Authorization 토큰이 포함되며, 서버가 사용자의 제외 키워드를 자동으로 적용한 결과를 내려줍니다.
- 이벤트 제외 결과는 오직 서버 재조회 결과로만 반영됩니다.
2. "nnn개 행사 보기" 기능의 현실적 제약 (로그인 상태)
로그인 상태에서 키워드를 추가/제거할 때마다 실시간으로 nnn개의 행사 보기를 구현하려면 다음과 같은 치명적인 문제가 발생합니다.
예시 상황: 이미 키워드 A, B가 적용되어 필터링된 이벤트를 보고 있는 상태에서, 필터 시트를 열어 A를 제거하는 경우.
- 이벤트를 다시 로드해서 개수를 파악하려면, 스위치를 끄는 순간 백그라운드에서
DELETE api로 키워드를 제거하고 GET /month (또는 /day)를 즉시 호출해야 합니다.
- 성능 및 UX 저하: 키워드를 하나 조작할 때마다 위 API 통신(서버 소통에 따른 불가피한 지연 시간 및 랙)이 발생합니다. 실제 구현 및 테스트 결과, 사용성이 심각하게 떨어지는 문제가 확인되었습니다.
- 상태 불일치 부담: 유저가 아직 최종적으로 "행사 보기(Apply)" 버튼을 누르지도 않았는데, 내부적으로는 이미 서버에 필터가 적용되었다고 판단하고 로직을 돌리는 것 자체가 시스템에 큰 부담이고, 필터 UI 및 철학과 맞지 않습니다.
3. 필터 시트 UI/UX 설계
위의 제약을 해결하기 위해 필터 시트는 다음과 같은 방법으로 설계되었습니다.
- Draft 상태 수정: 필터 시트에서 키워드를 켜고 끄는 행위는 즉시 서버나 로컬 상태를 영구적으로 바꾸지 않고, 우선
Draft(임시) 상태만 변경합니다.
- Apply(적용) 버튼 중심 동작: 실제 필터의 적용과 동기화는 반드시 하단의 적용 버튼을 눌렀을 때만 일어납니다.
로그인 여부에 따른 버튼 문구 차이
- 비로그인 상태:
n개의 행사 보기 (로컬에서 즉시 계산된 미리보기 개수 제공)
- 로그인 상태:
행사 보기 (정확한 개수를 클라이언트가 알 수 없으므로 개수 표기 생략)
- 참고: 로그인 상태에서 이 버튼은 "정확한 개수 보여주기"가 아니라 **"변경된 키워드를 서버에 반영하고 새로운 기준의 결과를 서버로부터 다시 불러오기"**를 트리거하는 역할입니다.
⚠️ 다음 작업자를 위한 메인테이너 코멘트
추후 로그인 환경에서도 사용자 경험 개선을 명목으로 nnn개 행사 보기를 복원하려는 시도가 있을 수 있습니다.
만약 키워드 조작 시 1. DELETE API 호출 -> 2. GET API(이벤트) 호출 흐름을 매번 태우는 방식으로 이 기능을 구현하고자 한다면, 반드시 이로 인한 네트워크 지연과 UX 저하를 인지하고 충분한 사용성 평가를 진행한 뒤 수정하시기 바랍니다.
이벤트 필터링 아키텍처 및 필터 시트 동작 원리
이 문서는 앱 내
excluded-keywords(제외 키워드)가 실제 이벤트 목록 필터링에 어떻게 적용되는지, 그리고 UI(필터 시트) 동작이 왜 현재와 같이 설계되었는지 설명합니다. 클라이언트와 서버 간의 필터링 주체 차이로 인해 발생한 제약과 UX/UI 설계 철학을 반드시 이해해야 합니다.1. 상태별 필터링 주체와 동작 방식
제외 키워드가 실제 이벤트 데이터에 반영되는 방식은 사용자의 로그인 여부에 따라 완전히 달라집니다.
A. 비로그인 상태: 클라이언트 주도 필터링
excluded-keywords를 로컬 DataStore에서 직접 읽어와 이벤트 목록을 필터링합니다.n개의 행사 보기와 같이 정확한 숫자를 표시할 수 있습니다.B. 로그인 상태: 서버 주도 자동 필터링 (주의 구간)
/month,/day) 요청 시 Authorization 토큰이 포함되며, 서버가 사용자의 제외 키워드를 자동으로 적용한 결과를 내려줍니다.2. "nnn개 행사 보기" 기능의 현실적 제약 (로그인 상태)
로그인 상태에서 키워드를 추가/제거할 때마다 실시간으로
nnn개의 행사 보기를 구현하려면 다음과 같은 치명적인 문제가 발생합니다.DELETE api로 키워드를 제거하고GET /month(또는/day)를 즉시 호출해야 합니다.3. 필터 시트 UI/UX 설계
위의 제약을 해결하기 위해 필터 시트는 다음과 같은 방법으로 설계되었습니다.
Draft(임시)상태만 변경합니다.로그인 여부에 따른 버튼 문구 차이
n개의 행사 보기(로컬에서 즉시 계산된 미리보기 개수 제공)행사 보기(정확한 개수를 클라이언트가 알 수 없으므로 개수 표기 생략)추후 로그인 환경에서도 사용자 경험 개선을 명목으로
nnn개 행사 보기를 복원하려는 시도가 있을 수 있습니다.만약 키워드 조작 시
1. DELETE API 호출 -> 2. GET API(이벤트) 호출흐름을 매번 태우는 방식으로 이 기능을 구현하고자 한다면, 반드시 이로 인한 네트워크 지연과 UX 저하를 인지하고 충분한 사용성 평가를 진행한 뒤 수정하시기 바랍니다.