You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
파싱 알림의 라우팅과 문구가 이벤트 단위로 한 번 해석돼 전 수신자에게 그대로 복사된다.NotificationDispatcher.dispatch 가 resolveRouting(event) 과 title/body 렌더를 수신자 루프 밖에서 부르기 때문이다.
한 snapshot 에 서로 다른 출처의 수신자가 함께 붙을 수 있어서 이게 문제가 된다. 공유 정체성(#825)의 "진행 중 합류" 경로다.
A 가 URL 을 위시에 등록 → wish(A, snapshot S = PENDING)
파싱이 도는 중에 B 가 같은 URL 을 토너먼트에 등록
TournamentItemPersistenceService → ItemSharingService.resolveAttachment → attachOrNull 의 findLatestInProgressByItemId 가 같은 S 를 물려준다 → tournament_item(B, S)
파싱 완료 → 수신자 {A, B}, 라우팅은 firstOrNull 로 고른 토너먼트 하나
결과: 위시에만 담은 A 가 B 의 토너먼트로 가는 딥링크를 받는다. ItemParsingRecipientResolver.resolveRouting 주석이 이 선택을 "결정성만 있으면 된다" 로 적어 두었지만, 결정적인 것과 수신자에게 맞는 것은 다르다.
wishId 딥링크 — 클라가 요청한 필드. 위시 상세는 GET /api/v1/wishlists/{wishId} 라 현재 payload 의 refId(itemId)로는 갈 수 없어 목록에서 역추적하고 있다. wishId 는 수신자마다 다르므로 이벤트 단위 라우팅에 실으면 남의 위시 id 가 박힌다. 없는 것보다 나쁘다(403/404).
무엇을
파싱 알림의 라우팅과 문구를 수신자별로 해석한다. 그 위에 위 두 가지를 얹는다.
1. 수신자별 라우팅
위시 주인 → Wish, 토너먼트 등록자 → 자기 Tournament(tournamentId, tournamentItemId)
한 유저가 양쪽에 다 있으면 어느 쪽을 쓸지 규칙을 정해 못 박는다
조회는 배치 1회로 — 수신자 수만큼 쿼리가 늘지 않게 한다. ItemParsingRecipientResolver.resolve 가 이미 wish·tournament_item 을 읽고 있어 그 쿼리가 식별자를 함께 반환하면 된다
상위 Epic
없음
왜
파싱 알림의 라우팅과 문구가 이벤트 단위로 한 번 해석돼 전 수신자에게 그대로 복사된다.
NotificationDispatcher.dispatch가resolveRouting(event)과 title/body 렌더를 수신자 루프 밖에서 부르기 때문이다.한 snapshot 에 서로 다른 출처의 수신자가 함께 붙을 수 있어서 이게 문제가 된다. 공유 정체성(#825)의 "진행 중 합류" 경로다.
wish(A, snapshot S = PENDING)TournamentItemPersistenceService→ItemSharingService.resolveAttachment→attachOrNull의findLatestInProgressByItemId가 같은 S 를 물려준다 →tournament_item(B, S){A, B}, 라우팅은firstOrNull로 고른 토너먼트 하나결과: 위시에만 담은 A 가 B 의 토너먼트로 가는 딥링크를 받는다.
ItemParsingRecipientResolver.resolveRouting주석이 이 선택을 "결정성만 있으면 된다" 로 적어 두었지만, 결정적인 것과 수신자에게 맞는 것은 다르다.같은 구조 때문에 두 가지가 막혀 있다.
wishId딥링크 — 클라가 요청한 필드. 위시 상세는GET /api/v1/wishlists/{wishId}라 현재 payload 의refId(itemId)로는 갈 수 없어 목록에서 역추적하고 있다.wishId는 수신자마다 다르므로 이벤트 단위 라우팅에 실으면 남의 위시 id 가 박힌다. 없는 것보다 나쁘다(403/404).무엇을
파싱 알림의 라우팅과 문구를 수신자별로 해석한다. 그 위에 위 두 가지를 얹는다.
1. 수신자별 라우팅
Wish, 토너먼트 등록자 → 자기Tournament(tournamentId, tournamentItemId)ItemParsingRecipientResolver.resolve가 이미 wish·tournament_item 을 읽고 있어 그 쿼리가 식별자를 함께 반환하면 된다2. 수신자별 문구
name이 빔) 현행 단일 문구 유지3.
wishIdpayload 필드notifications에wish_id컬럼 (FK 없음)NotificationRouting.Wish를 object → 식별자를 든 형태로WishParsing셰입과 FCM data 양쪽에 노출wishes ⋈ item_snapshots를(user_id, ref_id)로 이어 backfill 가능. 안 해도 보존기간 30일이면 빠진다refId의미는 그대로 둔다 (클라 요청도 그렇다)검증
body·routing·wishId를 각각 단언한다참고
wishId추가 (SSE·푸시 양쪽)