๐ :: (#72) - ์๋ฆผ ๋ชฉ๋ก API ์ฐ๋ - #73
leesengjun wants to merge 1 commit into
Conversation
| .toList(growable: false), | ||
| }; | ||
| } | ||
| List<NotificationItem> get visibleNotifications => notifications; |
There was a problem hiding this comment.
Correctness: "์ฝ์ง ์์" ํญ์์ ์๋ฆผ์ ์ฝ์ ์ฒ๋ฆฌํด๋ ๋ ์ด์ ๋ชฉ๋ก์์ ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
๊ธฐ์กด์๋ NotificationFilter.unread๊ฐ ์ ํ๋์์ ๋ visibleNotifications๊ฐ !isRead๋ก ํํฐ๋งํ์ง๋ง, ์ง๊ธ์ ์๋ฒ์ unreadOnly ์ฟผ๋ฆฌ์ ์์กดํ๋ฉฐ notifications๋ฅผ ํํฐ๋ง ์์ด ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ markAsRead / markAllAsRead๋ ์ด๋ฏธ ๋ก๋๋ ๋ชฉ๋ก์ isRead ํ๋๊ทธ๋ง ๋ก์ปฌ์์ ๋ฐ๊ฟ ๋ฟ, ํญ๋ชฉ์ ์ ๊ฑฐํ๊ฑฐ๋ ๋ค์ ๋ถ๋ฌ์ค์ง ์์ต๋๋ค.
์คํจ ์๋๋ฆฌ์ค: ์ฌ์ฉ์๊ฐ ์ฝ์ง ์์ ํญ(unreadOnly=true๋ก ์กฐํ)์ ์ฐ ์ํ์์ NotificationCard๋ฅผ ํญํฉ๋๋ค. handleNotificationTap์ด markAsRead(id)๋ฅผ ํธ์ถํด ๋ก์ปฌ์์ isRead=true๋ก ๋ฐ๊พธ๊ณ unreadCount๋ฅผ ์ค์ด์ง๋ง, ์นด๋๋ (์ฝ์ ์ํ๋ก ์คํ์ผ๋ง ๋ฐ๋ ์ฑ) ์ฌ์ฉ์๊ฐ ํญ์ ์ ํํด ์๋ก fetch๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ ๊น์ง ์ฝ์ง ์์ ํญ ๋ชฉ๋ก์ ๊ทธ๋๋ก ๋จ์์์ต๋๋ค. ์ด PR ์ด์ ์๋(์ visibleNotifications getter์ ํด๋ผ์ด์ธํธ ์ธก ํํฐ๋ง) ํญ๋ชฉ์ด ์ฆ์ ์ฌ๋ผ์ก์ต๋๋ค. PR ์ค๋ช
์์ ์๋์ ์ผ๋ก ์ ์ธํ PATCH ์์์ฑ ๋ฌธ์ ์๋ ๋ณ๊ฐ๋ก, ์ด PR๋ก ์ธํ ์ค์ UX ํ๊ท๋ก ๋ณด์
๋๋ค.
| var unreadCount = 0; | ||
| var page = 0; | ||
|
|
||
| while (true) { |
There was a problem hiding this comment.
Efficiency / Altitude: getNotifications๊ฐ ๋ฐํ ์ ์ ์๋ฒ์ ๋ชจ๋ ํ์ด์ง๋ฅผ ์์ฐจ์ ์ผ๋ก, ์ํ ์์ด ๋์ด๋ชจ์๋๋ค.
while (true) ๋ฃจํ๊ฐ last๊ฐ true๊ฐ ๋๊ฑฐ๋ nextPage >= totalPages๊ฐ ๋ ๋๊น์ง _client.getNotifications(page: page, ...)๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ํธ์ถํ๊ณ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์๋ฆผ์ด ์๋ฐฑ ๊ฐ์ธ ์ฌ์ฉ์๋ผ๋ฉด ํ๋ฉด์ด ๋ก๋ฉ ์ํ๋ฅผ ๋ฒ์ด๋๊ธฐ ์ ๊น์ง ์์ญ ๋ฒ์ ์์ฐจ์ ์๋ณต์ด ๋ฐ์ํฉ๋๋ค(์ฒซ ์๋ต ์ดํ totalPages๋ฅผ ์ ์ ์์ด ๋๋จธ์ง๋ฅผ Future.wait๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌํ ์ ์์์๋ ๊ทธ๋ ๊ฒ ํ์ง ์์). ์ด๋ ์ต์ด ๋ก๋, ํญ ์ ํ(selectFilter), ์ฌ์๋ ์๋ง๋ค ๋งค๋ฒ ๋ฐ์ํฉ๋๋ค. ๋ํ ๊ฐ์ ธ์ค๋ ํ์ด์ง ์์ ์ํ์ด ์์ด์, ์๋ฒ์ last/totalPages ๊ฐ์ด ์์ฒญ ๊ฐ์ ์๋ชป๋๊ฑฐ๋ ์ผ๊ด์ฑ์ด ๊นจ์ง๋ ๊ฒฝ์ฐ ๋ฃจํ์ ์์ ์ฅ์น๊ฐ ์์ด ์๋ํฌ์ธํธ๋ฅผ ๊ณ์ ํธ์ถํ๊ฒ ๋ฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ด์ง๋ค์ด์ API์ ๋ชฉ์ ์ด ๋ฌด์ํด์ง๊ณ , ํ๋ฉด์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค "์ ๋ถ ๋ค ๊ฐ์ ธ์ค๊ธฐ" ๋จ์ผ ํธ์ถ์ฒ๋ผ ๋์ํ๊ฒ ๋ฉ๋๋ค.
| final targetAvailable = dto.targetAvailable; | ||
| final isRead = dto.isRead; | ||
| final createdAt = dto.createdAt; | ||
| if (notificationId == null || |
There was a problem hiding this comment.
Correctness / robustness: (์ฌ๋ฌ ํ์ด์ง์ ๊ฑธ์น) ๊ฒฐ๊ณผ ์ค ์๋ฆผ ํ๋๋ผ๋ ํ์์ด ์๋ชป๋๋ฉด ์ ์ฒด fetch๊ฐ ํ๊ธฐ๋๊ณ ์ผ๋ฐ์ ์ธ "๋คํธ์ํฌ ์ค๋ฅ"๊ฐ ํ์๋ฉ๋๋ค.
notificationId, title, content, targetAvailable, isRead, createdAt ์ค ํ๋๋ผ๋ null์ด๋ฉด _toDomain์ด FormatException์ ๋์ง๋๋ฐ, ์ด ํ๋๋ค์ ๋ชจ๋ NotificationSummaryResponseDto์์ nullable๋ก ๋ชจ๋ธ๋ง๋์ด ์์ต๋๋ค(PR ์ค๋ช
์๋ "nullable ํ๋๋ Swagger ๊ธฐ์ค์ผ๋ก ์์ ํ๊ฒ ์ฒ๋ฆฌํ์ต๋๋ค"๋ผ๊ณ ๋ช
์). ์ด ๋ก์ง์ด getNotifications์ ํ์ด์ง๋ค์ด์
๋ฃจํ ์์์ ์คํ๋๊ธฐ ๋๋ฌธ์, ๊ฐ์ ธ์จ ๋ชจ๋ ํ์ด์ง ์ค ์ด๋๊ฐ์ ์๋ ์๋ฆผ ํ๋๊ฐ ์ด ํ๋ ์ค ํ๋๋ผ๋ ๋๋ฝ๋๋ฉด(์: title/content๊ฐ ์๋ SYSTEM ์๋ฆผ, ํน์ Swagger ๊ณ์ฝ์ ์ค์ ๋ก ์ต์
๋ํ ํ๋) ์์ธ๊ฐ ๋ฐ์ํด ์ด๋ฏธ ๊ฐ์ ธ์จ ๋ชจ๋ ํ์ด์ง๊ฐ ํ๊ธฐ๋ฉ๋๋ค. ์ดํ view model์ ํฌ๊ด์ ์ธ on Object catch๊ฐ NotificationScreenStatus.networkError๋ฅผ ํ์ํ๋๋ฐ, ์ด๋ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค -- ์ค์ ๋ก๋ ๋คํธ์ํฌ ์ฅ์ ๊ฐ ์๋๋ผ ๋ฐ์ดํฐ/๊ณ์ฝ ๋ฌธ์ ์ด๋ฉฐ, ์ฌ์ฉ์๋ ๋ฌธ์ ๊ฐ ๋ ํญ๋ชฉ ํ๋๊ฐ ์๋๋ผ ์ ์ฒด ์๋ฆผ ๋ชฉ๋ก์ ์๊ฒ ๋ฉ๋๋ค.
๊ฐ์
Student App์ ์๋ฆผ ๋ชฉ๋ก ํ๋ฉด์ ์ค์ ์๋ฆผ ๋ชฉ๋ก API๋ฅผ ์ฐ๋ํ์ต๋๋ค.
๊ธฐ์กด Mock/๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ Swagger ๊ธฐ์ค ์ค์ API ์๋ต์ผ๋ก ๊ต์ฒดํ๊ณ ,
๊ธฐ์กด Figma ์๋ฆผ UI ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ์ ์ฒด / ์ฝ์ง ์์ ํญ์ด ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์ํ๋๋ก ์ฐ๊ฒฐํ์ต๋๋ค.
๊ด๋ จ ์ด์
์์ ๋ด์ฉ
์๋ฆผ ๋ชฉ๋ก API ์ฐ๋
GET /api/v1/notificationsAPI ์ฐ๋์ ์ฒด / ์ฝ์ง ์์ ํญ
unreadOnly=falseunreadOnly=trueํ์ฌ ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์์ ์์๋ก ํํฐ๋งํ์ง ์๊ณ ,
์๋ฒ์
unreadOnlyQuery๋ฅผ ์ฌ์ฉํ๋๋ก ์ฐ๊ฒฐํ์ต๋๋ค.์๋ฆผ ์๋ต ์ฒ๋ฆฌ
๋ค์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์กด ์๋ฆผ UI ๋ชจ๋ธ์ ์ฐ๊ฒฐํ์ต๋๋ค.
notificationIdnotificationTypetitlecontenttargetTypetargetIdtargetAvailabletargetUnavailableReasondeepLinkreadreadAtcreatedAtnullable ํ๋๋ Swagger ๊ธฐ์ค์ผ๋ก ์์ ํ๊ฒ ์ฒ๋ฆฌํ์ต๋๋ค.
Pagination / unreadCount
์๋ฆผ ๋ชฉ๋ก ์๋ต์ Pagination ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
pagesizetotalElementstotalPagesfirstlastunreadCountunreadCount๋ ํ์ฌ ํ์ด์ง๋ ํ์ฌ ํํฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค์ผ๋กํด๋ผ์ด์ธํธ์์ ๋ค์ ๊ณ์ฐํ์ง ์๊ณ ์๋ฒ ์๋ต ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
๋์ ์ ๊ทผ ์ํ
์๋ฒ์์ ๊ณ์ฐํด ๋ด๋ ค์ฃผ๋ ๋ค์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
targetAvailabletargetUnavailableReasondeepLink์๋ฆผ ๋์ ๊ณต๊ณ /ํ๋ก๊ทธ๋จ ๋ฑ์ ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํด
ํด๋ผ์ด์ธํธ์์ ๋ณ๋์ API๋ฅผ ์ถ๊ฐ ํธ์ถํ๊ฑฐ๋ ์ํ๋ฅผ ์ฌ๊ณ์ฐํ์ง ์์ต๋๋ค.
๊ธฐ์กด Figma์ ์กด์ฌํ๋ ๋์ ์ญ์ / ์ ๊ทผ ๋ถ๊ฐ ์ํ UI๋ฅผ ์ ์งํ์ต๋๋ค.
๊ธฐ์กด UI ์ํ ์ ์ง
๊ธฐ์กด Figma ์๋ฆผ UI๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
์๋ก์ด ํ๋ฉด์ด๋ UI๋ ์ถ๊ฐํ์ง ์์์ต๋๋ค.
์ด๋ฒ PR์์ ์ ์ธํ ์์
์ด๋ฒ PR์ ์๋ฆผ ๋ชฉ๋ก ์กฐํ๋ง ๋ด๋นํฉ๋๋ค.
์๋ ๊ธฐ๋ฅ์ ํฌํจํ์ง ์์ต๋๋ค.
PATCH /api/v1/notifications/readGET /api/v1/notifications/unread-countDELETE /api/v1/notifications/{notificationId}ํ ์คํธ
unreadCountParsingunreadOnly=falseQuery ์ ๋ฌunreadOnly=trueQuery ์ ๋ฌflutter analyzeflutter testgit diff --checkํ์ธ ํ์ ์ฌํญ
ํ์ฌ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด ์๋ฃ๋์ง ์์ ์ ํจํ Access Token์ ์ฌ์ฉํ
GET /api/v1/notifications์ค์ ์๋ฒ 200 ์๋ต ํตํฉ ํ ์คํธ๋ ์งํํ์ง ๋ชปํ์ต๋๋ค.Swagger ๊ธฐ์ค API Contract์ Fake Repository / DTO / ViewModel / UI ํ ์คํธ๋ฅผ ํตํด
๊ตฌํ์ ๊ฒ์ฆํ์ผ๋ฉฐ, ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด
develop์ ๋ณํฉ๋ ์ดํ ์ค์ ๊ณ์ ์ผ๋ก ๋ค์ ํญ๋ชฉ์ ํ์ธํ ์์ ์ ๋๋ค.notificationTypeunreadCount