Skip to content

v1.0.0

Compare
Choose a tag to compare
@moonheekim0118 moonheekim0118 released this 22 Sep 12:21
· 225 commits to develop since this release
f34cd15
v1.0.0 ๋ฐฐํฌ (#480)

* refactor: ์ฑ„๋„ ๊ตฌ๋… ์˜ˆ์™ธ ์ผ€์ด์Šค ๋ฆฌ๋ทฐ ๋ฐ˜์˜ (#278)

* style: ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ด€๋ จ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: Exception ๋ฐ Method ์ด๋ฆ„ ์ˆ˜์ •

* style: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ํ†ต์ผ (#344)

* style: ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ปจ๋ฒค์…˜ ํ†ต์ผ

- given, when, then ์ฃผ์„ ์ถ”๊ฐ€
- API URL ๋ณ€์ˆ˜๋ช… ํ†ต์ผ
- ํŒŒ๋ผ๋ฏธํ„ฐ์— final ํ‚ค์›Œ๋“œ ์ถ”๊ฐ€
- ๋ฉ”์„œ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ
- ๋„๋ฉ”์ธ ์šฉ์–ด ํ†ต์ผ (์œ ์ € -> ๋ฉค๋ฒ„)
- ์ƒํƒœ์ฝ”๋“œ ๊ฒ€์ฆ ๋ฉ”์„œ๋“œ ํ†ต์ผ

* style: ํ…Œ์ŠคํŠธ ์ปจ๋ฒค์…˜ ํ†ต์ผ

- ํŒŒ๋ผ๋ฏธํ„ฐ์— final ํ‚ค์›Œ๋“œ ์ถ”๊ฐ€
- ๋ฉ”์„œ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ
- ์ค„๋ฐ”๊ฟˆ ์ถ”๊ฐ€
- ์ฃผ์ž… ๋ฐฉ์‹ ๋ณ€๊ฒฝ (์ƒ์„ฑ์ž->ํ•„๋“œ)
- ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* style: ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ์œ„์น˜ main๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ด๋™

* feat: local, dev ํ™˜๊ฒฝ์—์„œ๋งŒ CORS ํ—ˆ์šฉ (#319)

* refactor: Exception ๋ฐ ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ (#354)

* refactor: Exception ํ•˜์œ„ ํŒจํ‚ค์ง€ ์ถ”๊ฐ€

Co-authored-by: hyewoncc <[email protected]>
Co-authored-by: JangBomi <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

* refactor: Test ํ•˜์œ„ ํŒจํ‚ค์ง€ ์ถ”๊ฐ€

Co-authored-by: hyewoncc <[email protected]>
Co-authored-by: JangBomi <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

Co-authored-by: hyewoncc <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ (#297)

* feat: Slack ์„ค์ • ์ •๋ณด ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ณ€๊ฒฝ (#321)

* refactor: ๋ถ๋งˆํฌ ์กฐํšŒ, ์‚ญ์ œ api ๋ณ€๊ฒฝ (#355)

* refactor: ๋ถ๋งˆํฌ๋œ ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก ์กฐํšŒ ์‹œ id ํ•„๋“œ๊ฐ’์„ messageId๋กœ ๋ณ€๊ฒฝ

* refactor: ๋ถ๋งˆํฌ ์‚ญ์ œ ์‹œ ๋ฉ”์„ธ์ง€ PK๋กœ ์กฐํšŒ ํ›„ ์‚ญ์ œ

* feat: ๋ถ๋งˆํฌ ์ƒ์„ฑ,์กฐํšŒ,์‚ญ์ œ API RESTdocs์— ์ถ”๊ฐ€ (#356)

* feat: ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋Œ€์ฒด ์ด๋ฏธ์ง€ ์ ์šฉ  (#361)

* feat: ProfileImage ์—†์„ ๊ฒฝ์šฐ ๋””ํดํŠธ ์ด๋ฏธ์ง€ ๋ณด์—ฌ์ฃผ๋„๋ก ๊ตฌํ˜„

* refactor: ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ ๋ ˆ์ด์ง€๋กœ๋”ฉ ์ ์šฉ

* fix: eslint ignore ์ œ๊ฑฐํ•˜๊ณ , prop interface ์ •์˜

* refactor: ProfileImage ์ปดํฌ๋„ŒํŠธ props ์ ์šฉ ์ˆœ์„œ ๋ณ€๊ฒฝ

* fix: ๋ณ€๊ฒฝ๋œ ๋ถ๋งˆํฌ ์‚ญ์ œ api ๋ฐ˜์˜ (#360)

* feat: ๋ฐ์ดํ„ฐ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ (#357)

* feat: ๋ผ์šฐํ„ฐ ๋’ค๋กœ๊ฐ€๊ธฐ hook ์ž‘์„ฑ

* feat: EmptyStatus ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ

* feat: EmptyStatus ์ปดํฌ๋„ŒํŠธ ํŽ˜์ด์ง€์— ์ ์šฉ

* refactor: ๋ถˆํ•„์š”ํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ œ๊ฑฐ

* fix: isFirstLogin ์ด ํ•ญ์ƒ true๋กœ ๋ฐ˜ํ™˜๋˜๋˜ ์˜ค๋ฅ˜ ์ˆ˜์ • (#339)

* feat: TEAM_JOIN ์ด๋ฒคํŠธ ๊ตฌํ˜„ (#358)

* feat: TEAM_JOIN ์ด๋ฒคํŠธ ๊ตฌํ˜„

* refactor: ์—ฐ๋กœ๊ทธ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* feat: ๊ฒ€์ƒ‰ ํ•„ํ„ฐ UI ๊ตฌํ˜„ (#368)

* refactor: SearchInput component children ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ ๋ฐ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ

* feat: useChannelIds custom hook ๊ฐœ๋ฐœ

* feat: SearchOptions component ๊ฐœ๋ฐœ

* style: SearchInput style ์ˆ˜์ •

* refactor: Button component style, props ์ˆ˜์ •

* refactor: SubscribedChannel type ์ˆ˜์ •

- id: string -> number๋กœ ๋ณ€๊ฒฝ

* feat: Feed, SpecificDateFeed component์— SearchOptions component ์ ์šฉ

* refactor: Button component small type ์ถ”๊ฐ€

* refactor: Bookmark page component SearchInput Component ์ œ๊ฑฐ

* refactor: SearchInput Component์— button tag ์ถ”๊ฐ€ ๋ฐ ์Šคํƒ€์ผ๋ง

* refactor: Feed, SpecificDateFeed Component SearchInputComponent์— ๋‚ด๋ ค์ฃผ๋Š” props ์ œ๊ฑฐ

- isSearchInputFocused ์ œ๊ฑฐ

* style: SearchOptions Component style ์ถ”๊ฐ€

* refactor: Button component ๋ถˆํ•„์š”ํ•œ props ์ œ๊ฑฐ

* refactor: ์ค‘๋ณต๋˜๋Š” ๊ฐ์ฒด ์ ‘๊ทผ ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์œผ๋กœ ๋ณ€

* refactor: useChannelIds Props ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ ๋ฐ ์ ์šฉ

* refactor: useChannelIds์— ์žˆ๋˜ useModal Feed, SpecificDateFeed component๋กœ ๋ถ„๋ฆฌ

* feat: ์˜ˆ์™ธ ํด๋ž˜์Šค๋ณ„ ํด๋ผ์ด์–ธํŠธ ๋ฉ”์‹œ์ง€ ๋ฐ ํ•ด๋‹น ๋ฉ”์‹œ์ง€ ์กฐํšŒ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ (#367)

* refactor: ์˜ˆ์™ธ ํด๋ž˜์Šค๋ณ„ ํด๋ผ์ด์–ธํŠธ ๋ฉ”์‹œ์ง€ ๋ฐ ํ•ด๋‹น ๋ฉ”์‹œ์ง€ ์กฐํšŒ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€

* refactor: ์˜ˆ์™ธ ํด๋ž˜์Šค ์ƒ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์ด ์™ธ๋ž˜ํ‚ค์ผ ๊ฒฝ์šฐ ์—ฐ๊ด€๊ด€๊ณ„ ๋„๋ฉ”์ธ๋ช…์„ ๋ถ™์—ฌ ๊ตฌ์ฒด์  ํ‘œ๊ธฐ

* feat: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ API ์—ฐ๋™ ๋ฐ SearchResult Page ๊ฐœ๋ฐœ (#371)

* refactor: useChannelIds hook ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ -> useSelectChannels

* feat: SearchForm component ๊ฐœ๋ฐœ

* refactor: SearchInput, SearchOptions button type ์„ค์ • ๋ฐ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ

* refactor: SearchForm component Feed, SpecificDateFeed page component์— ์ ์šฉ

* style: Drawer component z-index ์†์„ฑ ์ถ”๊ฐ€

* feat: SearchResult component Routes ์—ฐ๊ฒฐ ๋ฐ PATH_NAME ์ƒ์ˆ˜ํ™”

* feat: SearchForm component form, input tag eventHandler ์ž‘์„ฑ

* refactor: getMessages API ๋ช…์„ธ์— ๋งž๊ฒŒ keyword ์ถ”๊ฐ€

* feat: convertSeparatorToKey util ํ•จ์ˆ˜ ์ž‘์„ฑ

* feat: SearchResult page component ๊ฐœ๋ฐœ

* refactor: useModal hook useEffect clean up callback ํ•จ์ˆ˜ ์ž‘์„ฑ

- scroll hidden -> auto ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” clean up callback ํ•จ์ˆ˜ ์ž‘์„ฑ

* refactor: SearchForm component ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„๋ฆฌ

- useSearchKeywordForm custom hook ์œผ๋กœ form ๊ด€๋ จ ๋กœ์ง ๋ถ„๋ฆฌ

* refactor: useSelecChannels custom hook Return type ์„ค์ •

* refactor: SearchResult component PrivateRouter๋กœ ๊ฐ์‹ธ์ฃผ๊ธฐ

* refactor: SearchResult page component Error ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ œ๊ฑฐ

* refactor: API ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฆฌํŒฉํ„ฐ๋ง (#372)

* feat: ์—๋Ÿฌ ์ฝ”๋“œ ๊ด€๋ จ ์ƒํƒœ ์ƒ์ˆ˜ ๋ฐ ํƒ€์ž… ์ •์˜
- ERROR_CODE ๊ฐ์ฒด ์ƒ์ˆ˜ ์ •์˜
- ERROR_MESSAGE_BY_CODE ๊ฐ์ฒด ์ƒ์ˆ˜ ์ •์˜
- ์—๋Ÿฌ ๊ฐ์ฒด ํƒ€์ž… ์ •์˜

* feat: useApiError ํ›… ์ž‘์„ฑ
- error handler ํ•จ์ˆ˜ ์ž‘์„ฑ
- ๋“ค์–ด์˜ค๋Š” error ๊ฐ์ฒด์˜ code ์— ๋”ฐ๋ผ์„œ ์Šค๋‚ต๋ฐ” ๋ณด์—ฌ์ฃผ๋„๋ก ์ž‘์„ฑ

* refactor: ์ „์—ญ onError ์ •์˜๋ฅผ ์œ„ํ•ด queryClient ๋ถ„๋ฆฌ
- ์ „์—ญ onError ์ •์˜๋ฅผ ์œ„ํ•ด์„œ queryClient Provider ๋ฅผ App.tsx ๋‚ด๋ถ€๋กœ ์ •์˜
- queryClient์— ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ ์‹ฌ์–ด์ค„ ์ˆ˜ ์žˆ๋„๋ก, queryClient ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ •์˜

* refactor: ๊ธฐ์กด์˜ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์ œ๊ฑฐ

* fix: RecoilRoot ๋Ž์Šค ์›์ƒ๋ณต๊ตฌ

* refactor: QueryClient ๊ฐ์ฒด ๋งค๋ฒˆ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •
- ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„, useEffect ๋กœ ์ดˆ๊ธฐ ๋ Œ๋”๋ง์‹œ์—๋งŒ ๋””ํดํŠธ ์˜ต์…˜ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝ

* refactor: ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ๋‚ด ์ด๋ชจ์ง€ ์ œ๊ฑฐ

* refactor: ๋ถˆํ•„์š”ํ•œ ์—๋Ÿฌ ์ฝ”๋“œ ์ƒ์ˆ˜ ๊ฐ์ฒด ์ œ๊ฑฐ ๋ฐ ํƒ€์ž… ์ˆ˜์ •

* refactor: ํ† ํฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์—์„œ ํ† ํฐ ์‹œ๊ฐ„ ๋งŒ๋ฃŒ ์ผ€์ด์Šค ๋ถ„๋ฆฌ (#370)

* refactor: Dropdown ๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ๋ฐ ๋ฆฌํŒฉํ„ฐ๋ง (#376)

* feat: useDropdown hook ๊ฐœ๋ฐœ

Co-authored-by: moonheekim0118 <[email protected]>

* feat: Dropdown component ๊ฐœ๋ฐœ

Co-authored-by: moonheekim0118 <[email protected]>

* refactor: DateDropdown component์—  Dropdown component ์ ์šฉ

Co-authored-by: moonheekim0118 <[email protected]>

* refactor: SearchForm component์—  Dropdown component ์ ์šฉ

Co-authored-by: moonheekim0118 <[email protected]>

* refactor: SearchForm component์—  Dropdown component ์ ์šฉ

Co-authored-by: moonheekim0118 <[email protected]>

* refactor: Dropdown component props ์ˆ˜์ •

Co-authored-by: moonheekim0118 <[email protected]>

* refactor: Navigation, Dimmer, Drawer z-index ์ˆ˜์ •

- DateDropdown - position relative
- Dimmer - position fixed  z-index: 1;
- Navigation - position fixed & z-index 999
- Drawer - position fixed z-index: 2
- SearchForm - position: fixed z-index:1

Co-authored-by: moonheekim0118 <[email protected]>

* refactor: SearchForm component position fixed๋กœ ๋ณ€๊ฒฝ

Co-authored-by: moonheekim0118 <[email protected]>

Co-authored-by: moonheekim0118 <[email protected]>

* feat: react-query-devtools ์„ค์ • (#378)

Co-authored-by: moonheekim0118 <[email protected]>

Co-authored-by: moonheekim0118 <[email protected]>

* fix: ๋กœ๊ทธ์ธ ๋˜๊ธฐ ์ „, ๊ตฌ๋… ์ฑ„๋„ ์กฐํšŒ API ์š”์ฒญํ•˜๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ ๋ฐ SearchResult lazy loading ์ ์šฉ (#380)

Co-authored-by: moonheekim0118 <[email protected]>

Co-authored-by: moonheekim0118 <[email protected]>

* feat: ๋ฉ”์‹œ์ง€ ๋ฆฌ๋งˆ์ธ๋” ์กฐํšŒ api ๊ตฌํ˜„ (#366)

* feat: ๋ฉ”์‹œ์ง€ ๋ฆฌ๋งˆ์ธ๋” ์กฐํšŒ api ๊ตฌํ˜„

* refactor: ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: ์ ‘๊ทผ์ œ์–ด์ž ๋ณ€๊ฒฝ

* test: @SpringBootTest -> @DataJpaTest ๋กœ ๋ณ€๊ฒฝ

* test: ReminderServiceTest ์ถ”๊ฐ€

* test: ์˜ค๋Š˜ ๋‚ ์งœ๋ณด๋‹ค ์˜ค๋ž˜๋œ ๋‚ ์งœ ๋ฆฌ๋งˆ์ธ๋”์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€

* test: BeforeAll, AfterAll๋กœ ๋ณ€๊ฒฝ

Co-authored-by: JangBomi <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

* fix: z-index ์ˆ˜์ • ๋ฐ ๊ฒ€์ƒ‰ ์ฑ„๋„ ์„ ํƒ ์˜ต์…˜ ๋ฒ„๊ทธ ์ˆ˜์ • (#385)

* fix: LogoutButtonContainer, Calendar, DateDropdownMenu z-index ์ˆ˜์ •

Co-authored-by: moonheekim0118 <[email protected]>

* fix: defaultChannel ์„ ํƒ์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

- useEffect ์ถ”๊ฐ€ ๋ฐ dependency array ์ถ”๊ฐ€

Co-authored-by: moonheekim0118 <[email protected]>

* fix: Certification component early return ์ถ”๊ฐ€

Co-authored-by: moonheekim0118 <[email protected]>

Co-authored-by: moonheekim0118 <[email protected]>

* feat: ๋ฉ”์‹œ์ง€ ๋ฆฌ๋งˆ์ธ๋” ์‚ญ์ œ API ๊ตฌํ˜„ (#384)

Co-authored-by: JangBomi <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

* refactor: ๋ฉ”์„ธ์ง€ ์กฐํšŒ ์‹œ ๋ถ๋งˆํฌ join์œผ๋กœ ํ•จ๊ป˜ ์กฐํšŒ (#379)

* feat: ๋ฉ”์‹œ์ง€ ๋ฆฌ๋งˆ์ธ๋” ๋“ฑ๋ก ๋ฐ ์ˆ˜์ • API ๊ตฌํ˜„ (#390)

* feat: ๋ฉ”์‹œ์ง€ ๋ฆฌ๋งˆ์ธ๋” ๋“ฑ๋ก API ๊ตฌํ˜„

* feat: ๋ฉ”์‹œ์ง€ ๋ฆฌ๋งˆ์ธ๋” ์ˆ˜์ • API ๊ตฌํ˜„

Co-authored-by: JangBomi <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

* feat: ๋ฆฌ๋งˆ์ธ๋“œ ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#395)

Co-authored-by: JangBomi <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

* feat: ํ”„๋ก ํŠธ์—”๋“œ lighthouse-ci ์ ์šฉ (#400)

* docs: lighthouse-ci ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ
- github action ์„ ์œ„ํ•œ yml ํŒŒ์ผ ์ž‘์„ฑ
- lighthouse ci ๊ธฐ๋ณธ ์„ธํŒ… ํŒŒ์ผ ์ž‘์„ฑ

* docs: github action name ์ˆ˜์ •

* fix: PR ์ฝ”๋ฉ˜ํŠธ ๊ถŒํ•œ์„ ์œ„ํ•ด Github token ๋Œ€์ฒด

* fix: ์˜คํƒ€ ์ˆ˜์ •

* fix: github token ์œผ๋กœ ์ˆ˜์ •

* feat: ๋ฉ”์‹œ์ง€ ๋Œ“๊ธ€ ์ด๋ฒคํŠธ ์ „๋‹ฌ ์‹œ ์ €์žฅ ์ œ์™ธ (#401)

* refactor: LocalDateTime.now()์—์„œ Clock์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ • (#398)

* refactor: LocalDateTime.now()์—์„œ Clock์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ •

Co-authored-by: JangBomi <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

* refactor: TimeZoneConfig์™€ ClockConfig๋ฅผ TimeConfig๋กœ ํ†ต์ผ

Co-authored-by: JangBomi <[email protected]>
Co-authored-by: yeon-06 <[email protected]>

Co-authored-by: yeon-06 <[email protected]>

* refactor: getMessages API ์š”์ฒญ์‹œ query params ๋ฆฌํŒฉํ„ฐ๋ง (#404)

Co-authored-by: moonheekim0118 <[email protected]>

Co-authored-by: moonheekim0118 <[email protected]>

* refactor: Channel, Member ๋„๋ฉ”์ธ ํ•˜์œ„ ๋ ˆํฌ์ง€ํ† ๋ฆฌ save() ๋ฐ˜ํ™˜ํ˜• ์ˆ˜์ •   (#406)

* refactor: Channel ๋„๋ฉ”์ธ ํ•˜์œ„ Repository์˜ save() ๋ฐ˜ํ™˜ํ˜•์„ ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ

* refactor: Member ๋„๋ฉ”์ธ ํ•˜์œ„ Repository์˜ save() ๋ฐ˜ํ™˜ํ˜•์„ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ

* refactor: ์„œ๋น„์Šค์—์„œ Channel ๋ฆฌํ„ด ์‹œ save ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ”๋กœ ๋ฆฌํ„ด

* feat: ๋ฉ”์‹œ์ง€ ์กฐํšŒ ์‹œ isSetReminded ํ•„๋“œ ์ถ”๊ฐ€ (#407)

* feat: ๋ฉ”์‹œ์ง€ ์กฐํšŒ ์‹œ isSetReminded ์ถ”๊ฐ€

* test: ๋ฉ”์‹œ์ง€ ์กฐํšŒ ์‹œ isSetReminded ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€

* test: OS๋ณ„๋กœ LocalDateTime์˜ nano ๋‹จ์œ„๊ฐ€ ๋‹ฌ๋ผ ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์ง€๋Š” ํ˜„์ƒ ์ˆ˜์ •

* test: ๊ธฐ์กด์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„์žˆ์–ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ๊นจ์ง€๋Š” ํ˜„์ƒ ์ˆ˜์ •

* style: ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝ

* refactor: !ObjectsNull() ๋Œ€์‹  Objects.nonNull() ์‚ฌ์šฉ

* feat: ๋ฆฌ๋งˆ์ธ๋” ์š”์ฒญ ๋ชจ๋‹ฌ์ฐฝ UI ๊ตฌํ˜„ (#409)

* refactor: getTimeStandard util ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ ๋ฐ ๋ฆฌํ„ด ๋ฒจ๋ฅ˜ ๋ณ€๊ฒฝ

- test ์ฝ”๋“œ ์ˆ˜์ • ํ›„ ์ ์šฉ

* chore: Calendar svg ์ด๋ฏธ์ง€ assets์— ์ถ”๊ฐ€

* feat: ReminderModal component ๊ฐœ๋ฐœ

* feat: useReminderModal custom hook ๊ฐœ๋ฐœ

* chore: SearchResult component ๋ถˆํ•„์š”ํ•œ query return ๊ฐ’ ์ œ๊ฑฐ

* feat: Feed, SpecificDateFeed component์— ReminderModal Component ์ ์šฉ

* refactor: ReminderModalOptions, ReminderModalToggleDropdown component ๋ถ„๋ฆฌ

* refactor: useReminderModal checkedValue suffix ์ƒ์„ฑ ๋ฐ ์ ์šฉ

* refactor: ๋‹ค์ค‘ ์กฐ๊ฑด ๋ฌธ isInvalidateDateTime ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ

* refactor: ์ด์ค‘ ๋ถ„๊ธฐ๋ฌธ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋กœ ๋ณ€๊ฒฝ

* refactor: isDropdownOpened ๋กœ์ง useDropdown custom hook์œผ๋กœ ๋Œ€์ฒด

* refactor: ReminderModalToggleDropdown component border color theme ์ ์šฉ

* refactor: ReminderModalOptions component Radio display: none; ์„ค์ •

* refactor: ReminderModalToggleDropdown component IconComponent children props๋กœ ๋ณ€๊ฒฝ ๋ฐ ์ ์šฉ

* refactor: lastDate ๊ตฌํ•˜๋Š” ๋กœ์ง getDateInformation util ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ

* refactor: ๋ถˆํ•„์š”ํ•œ .toString() ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* refactor: props type ๋ณ€๊ฒฝ ChangeEvent -> ChangeEventHandler

* refactor: isPadStart -> needZeroPaddingStart ๋กœ Props ๋ช… ๋ณ€๊ฒฝ

* refactor: ReminderModalOptions, ReminderModalDropdownToggle component ๋ช… ๋ณ€๊ฒฝ

- ReminderModalOptions -> DateTimePickerOptions
- ReminderModalDropdownToggle -> DateTimePickerToggle

* refactor: useReminderModal custom hook ๋ช… ๋ณ€๊ฒฝ

- useSetReminder๋กœ ๋ณ€๊ฒฝ

* refactor: parsedOptionText utils ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ

* feat: ๋ฆฌ๋งˆ์ธ๋” ์‹œ๊ฐ„์ด ํ˜„์žฌ์‹œ๊ฐ„๋ณด๋‹ค ๊ณผ๊ฑฐ์ผ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์Šค๋„ฅ๋ฐ”๋กœ ๋„์›Œ์ฃผ๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* hotfix: MessageCard component Props ์„ค์ • (#416)

* feat: ๋‹คํฌ๋ชจ๋“œ ๊ตฌํ˜„  (#411)

* feat: ThemeToggler ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ

* refactor: ThemeToggler ์ปดํฌ๋„ŒํŠธ Props type ์ถ”๊ฐ€

* feat: ์›น์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ์„ ์œ„ํ•œ ํ›… ์ž‘์„ฑ
- ์ œ๋„ค๋ฆญ์œผ๋กœ return type ๋ฐ›์•„์˜ค๋„๋ก ๊ตฌํ˜„
- ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€/์„ธ์…˜์Šคํ† ๋ฆฌ์ง€ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌํ˜„

* feat: useTheme ํ›… ์ž‘์„ฑ
- Theme ํ† ๊ธ€ ๊ด€๋ จ ๋กœ์ง์„ ๋‹ด์€ useTheme ํ›… ์ž‘์„ฑ
- MacOS ์˜ ๊ฒฝ์šฐ OS setting ๋ฐ›์•„์˜ค๋„๋ก ์„ค์ •

* refactor: useTheme, useWebStorage์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜ ์ƒ์ˆ˜ํ˜ธ ใ…๋ฐ ํƒ€์ž… ์ •์˜

* refactor: msw ์‹คํ–‰ ๊ตฌ๋ฌธ ๋ถ„๋ฆฌ

* feat: ํ…Œ๋งˆ ๋ณ€๊ฒฝ ๋กœ์ง ์ ์šฉ

* feat: ๋‹คํฌ๋ชจ๋“œ ์ž„์‹œ ์ƒ‰์ƒ ์ถ”๊ฐ€ ๋ฐ ์ ์šฉ

* style: theme toggler ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* refactor: ์ผ๋ฐ˜ํ•จ์ˆ˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ ๋ฐ ํ›… ๋ฆฌํ„ดํƒ€์ž… ๋ฐฐ์—ด์—์„œ ๊ฐ์ฒด๋กœ ์ˆ˜์ •

* refactor: ํ…Œ๋งˆ ์•„์ด์ฝ˜ svg ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฐ css ์ˆ˜์ •

* fix: ์•„์ด์ฝ˜ ์ƒ‰์ƒ ํ…Œ๋งˆ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜๋„๋ก ์ˆ˜์ •

* refactor: useTheme -> useModeTheme ์œผ๋กœ ๋„ค์ด๋ฐ ์ˆ˜์ •
- ๊ธฐ์กด์˜ styled-component ์— useTheme ํ›…์ด ์žˆ๋Š”๊ฒƒ์„ ๊ฐ์•ˆํ•˜์—ฌ useModeTheme ์œผ๋กœ ์ˆ˜์ •

* fix: ๋กœ๊ทธ์ธ ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋žœ๋”ฉํŽ˜์ด์ง€์—์„œ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ๋„์šฐ๋Š” ๋ฒ„๊ทธ  (#419)

* fix: PublicRouter์—์„œ ์ „์—ญ onError Overrides ํ•˜๋„๋ก ์ˆ˜์ •

* fix: OS ํ™˜๊ฒฝ ์ƒ๊ด€ ์—†์ด ์‚ฌ์šฉ์ž๊ฐ€ light ๋ชจ๋“œ๋กœ ์ง€์ • ํ–ˆ์„ ์‹œ, light ๋ชจ๋“œ ์ ์šฉ๋˜๋„๋ก ์ˆ˜์ •

* fix: ๋‹คํฌ๋ชจ๋“œ/๋ผ์ดํŠธ๋ชจ๋“œ ํ† ๊ธ€๋Ÿฌ ๋ฒ„ํŠผ UI ๋ฐ ์œ„์น˜ ์ˆ˜์ • (#420)

* chore: storybook RecoilRoot ์ถ”๊ฐ€
- ์Šคํ† ๋ฆฌ๋ถ์—์„œ Recoil ์„ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŒ… ํ•  ์ˆ˜ ์žˆ๋„๋ก, ์Šคํ† ๋ฆฌ๋ถ preview.js ์— RecoilRoot ๋ฅผ ์ถ”๊ฐ€ํ•ด์คฌ์Œ

* feat: Theme ๊ด€๋ จ Recoil ๋กœ์ง ์ž‘์„ฑ
- App.tsx ์—์„œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ Theme ์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ Theme ๊ด€๋ จ value ๋ฅผ Recoil ๋กœ ์ด๊ด€

* feat: useModeTheme์ด Recoil ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •
- Toggle ์‹œ ๋ฆฌ์ฝ”์ผ ์ƒํƒœ ์ˆ˜์ •
- ๋ฆฌํ„ด๋˜๋Š” Theme ์€ ๋ฆฌ์ฝ”์ผ์— ์ €์žฅ๋œ value

* fix: ThemeToggler UI ์ˆ˜์ •

* refactor: ThemeToggler ๋‚ด๋ถ€์—์„œ Theme ์ƒํƒœ ๋ฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ฐ–๋„๋ก ์ˆ˜์ •
- ๊ธฐ์กด์˜ Props ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ๋ฒ• ๋Œ€์‹ , ThemeToggler ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ํ•ด๋‹น ์ƒํƒœ ๋ฐ ํ•ธ๋“ค๋Ÿฌ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •
- ์žฌ์‚ฌ์šฉ์„ฑ์„ ํฌ๊ธฐํ•˜๋Š” ๋Œ€์‹ , ThemeToggler ๋ฅผ ์›ํ•˜๋Š”๋ฐ์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„

* feat: Drawer ์ตœํ•˜๋‹จ์— ThemeToggler ์ถ”๊ฐ€

* chore: ๋ถˆํ•„์š”ํ•œ icon ์ œ๊ฑฐ

* refactor: ์ค‘๋ณต๋˜๋Š” ํƒ€์ž… ๋ฐ ์ƒ์ˆ˜ ์ œ๊ฑฐ

* fix: ๋นŒ๋“œ ์—๋Ÿฌ ์ˆ˜์ •- ๋ˆ„๋ฝ๋œ import ์‚ฝ์ž…

* refactor: ์ž‘์—…ํ•œ ํŒŒ์ผ ๋‚ด ๋ˆ„๋ฝ๋œ ์ ˆ๋Œ€๊ฒฝ๋กœ ์ˆ˜์ •

* refactor: ์ž‘์—…ํ•œ ํŒŒ์ผ ๋‚ด ๋ˆ„๋ฝ๋œ ์ ˆ๋Œ€๊ฒฝ๋กœ ์ˆ˜์ •

* feat: message ๋„๋ฉ”์ธ ํ•˜์œ„ repository์—์„œ save์‹œ ํ•ด๋‹น ๋„๋ฉ”์ธ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝ (#414)

* refactor: BookmarkRepository์˜ save ๋ฐ˜ํ™˜ํ˜•์„ Bookmark๋กœ ๋ณ€๊ฒฝ

* refactor: MessageRepository์˜ save ๋ฐ˜ํ™˜ํ˜• Message๋กœ ๋ณ€๊ฒฝ

* refactor: ReminderRepository์˜ save ๋ฐ˜ํ™˜ํ˜•์„ reminder๋กœ ๋ณ€๊ฒฝ

* fix: ๋ฉ”์‹œ์ง€ ์กฐํšŒ ์‹œ ํ•ด๋‹น ํšŒ์›์˜ ๋ถ๋งˆํฌ๋งŒ join (#413)

* feat: ๋ฆฌ๋งˆ์ธ๋”๋ฅผ ๋‹จ๊ฑด ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#430)

* fix: ๋ฆฌ๋งˆ์ธ๋” ์กฐํšŒ ์‹œ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์ž์˜ ์ •๋ณด ์ „๋‹ฌ (#432)

* fix: ๋ฆฌ๋งˆ์ธ๋” ์‚ญ์ œ api ๋ช…์„ธ๊ฐ€ ๋ถ๋งˆํฌ ์‚ญ์ œ api ๋ช…์„ธ๋กœ ๋ณด์˜€๋˜ ์—๋Ÿฌ ์ˆ˜์ • (#436)

* feat: file_share ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#427)

* feat: ํŒŒ์ผ ๊ณต์œ  ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* refactor: ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* test: ๋ฆฌ๋งˆ์ธ๋” ๋‹จ๊ฑด ์กฐํšŒ ๊ด€๋ จ service ๋ฐ acceptance test ์ถ”๊ฐ€ (#435)

* test: ๋ฆฌ๋งˆ์ธ๋” ๋‹จ๊ฑด ์กฐํšŒ ๊ด€๋ จ service ๋ฐ acceptance test ์ถ”๊ฐ€

* refactor: ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* feat: ๋ฉ”์‹œ์ง€ ์กฐํšŒ ์‹œ remindDate ํ•„๋“œ ์ถ”๊ฐ€ (#440)

* feat: ๋ฉ”์‹œ์ง€ ์กฐํšŒ ์‹œ remindDate ํ•จ๊ป˜ ์ „๋‹ฌ

* test: ์กด์žฌํ•˜๋Š” remindDate ๊ฒ€์ฆ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

* feat: Reminder์™€ Bookmark ์กฐํšŒ ์‹œ count ์ถ”๊ฐ€ (#423)

* feat: ๋ถ๋งˆํฌ ์กฐํšŒ API ์š”์ฒญ๊ฐ’์— count ์ถ”๊ฐ€

* feat: ๋ฆฌ๋งˆ์ธ๋” ์กฐํšŒ API ์š”์ฒญ๊ฐ’์— count ์ถ”๊ฐ€

* hotfix: ์ปค๋ฐ‹ ๋ˆ„๋ฝ๋œ BookmarkSelectRequest ์ถ”๊ฐ€

* test: ๋ฆฌ๋งˆ์ธ๋” ์กฐํšŒ ์‹œ count ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€

* style: DTO ์ด๋ฆ„ ๋ณ€๊ฒฝ (select -> find)

* test: ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋ช… ๋ณ€๊ฒฝ

* style: ReminderRequest -> ReminderSaveRequest DTO๋ช… ๋ณ€๊ฒฝ

* feat: ๋ฆฌ๋งˆ์ธ๋” ์š”์ฒญ API ์—ฐ๊ฒฐ (#439)

* feat: reminders post API ์ƒ์„ฑ ๋ฐ API_ENDPOINT ์ถ”๊ฐ€

* refactor: ISOConverter util ํ•จ์ˆ˜ return ๊ฐ’ ์ˆ˜์ •

* feat: MessageCard isSetReminded option ์ถ”๊ฐ€

- type ์ถ”๊ฐ€
- testResponseData isSetReminded ์ถ”๊ฐ€
- Bookmark, SearchResult, MessageCard component Props ์ถ”๊ฐ€

* feat: ReminderModal component targetMessageId, refetchFeed Props ์ถ”๊ฐ€

- Feed, SpecificDateFeed component์— props ์ถ”๊ฐ€ ๋ฐ targetMessageId ์ƒํƒœ๊ด€๋ฆฌ ์ถ”๊ฐ€

* feat: useSetReminder custom hook ์— post reminder ๋กœ์ง ์ถ”๊ฐ€

- mutate ๋กœ์ง ์ถ”๊ฐ€
- isInvalidateDateTime ์˜ค๋ฅ˜ ์ˆ˜์ •

* feat: Reminder page component ์ƒ์„ฑ ๋ฐ Alarm page component ์ œ๊ฑฐ

* feat: reminder type ์„ค์ •

* feat: extractResponseReminders util ํ•จ์ˆ˜ ์ž‘์„ฑ

* refactor: Navigation component Alarm -> Reminder๋กœ ๋ณ€๊ฒฝ

* feat: reminder QUERY_KEY ์ถ”๊ฐ€ ๋ฐ ResponseReminder type ์„ค์ •

* feat: reminders API fetcher ์ถ”๊ฐ€

- getReminder, getReminders, putReminder, deleteReminder API fetcher ์ถ”๊ฐ€

* feat: Reminder Page component infiniteQuery nextReminderCallback ํ•จ์ˆ˜ ์ถ”๊ฐ€

* refactor: ReminderModal component Props ์ˆ˜์ • ๋ฐ ๋””์ž์ธ ์ˆ˜์ •

* refactor: Feed, SpecificDateFeed component targetMessage ๋กœ์ง ์ถ”๊ฐ€

- targetMessageId ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ ์ž‘์„ฑ
- isTargetMessageSetReminder ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ ์ž‘์„ฑ

* refactor: MessageCard component Props ์ˆ˜์ •

- toggleBookmark ์˜ต์…”๋„๋กœ ๋ณ€๊ฒฝ

* feat: useSetReminder custom hook ์ˆ˜์ •, ์‚ญ์ œ ๋กœ์ง ์ถ”๊ฐ€

- handleRemoveSubmit, handleModifySubmit handler ์ถ”๊ฐ€
- targetMessage๊ฐ€ isSetReminder์ธ ๊ฒฝ์šฐ remindDate ๊ฐ€์ ธ์™€์„œ ์ ์šฉํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€
- ์ˆ˜์ • ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” useMutation ๋กœ์ง ์ถ”๊ฐ€

* refactor: Bookmark, Reminder page component ์— ๊ฐ์ž ๋งž๋Š” ๋ฒ„ํŠผ ๋ณด์—ฌ์ง€๊ฒŒ UI ๋ณ€๊ฒฝ

- ๊ฐ ํŽ˜์ด์ง€์—์„œ pathname์„ MessageCard component Props๋กœ ๋‚ด๋ ค์ค˜ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

* refactor: Reminder type ResponseReminder๋กœ ๋ณ€๊ฒฝ ํ›„ ์ ์šฉ

* feat: Reminder page component ์— ReminderModal Portal ์ ์šฉ

* refactor: ์ค‘๋ณต๋˜๋Š” ๋กœ์ง useSetTargetMessage custom hook ์œผ๋กœ ๋ถ„๋ฆฌํ›„ ์ ์šฉ

* refactor: useSetReminder custom hook ์ค‘๋ณต ์ œ๊ฑฐ

- handleModifySubmit, handleCreateSubmit -> handleReminderSubmit์œผ๋กœ ํ†ตํ•ฉ

* refactor: handleRemoveSubmit ๋ฒ„ํŠผ confirm ๋กœ์ง ์ถ”๊ฐ€

- ์‚ญ์ œ ์—ฌ๋ถ€ ํ™•์ธ ํ›„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ

* refactor: ReminderModal component์—์„œ ReminderModalButtons component ๋ถ„๋ฆฌ

* refactor: TEXT COLOR LIGHT_BLUE ์ถ”๊ฐ€

* feat: Reminder page ์—์„œ remindDate ํ‘œ์‹œํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€ ๋ฐ ์Šคํƒ€์ผ๋ง

* refactor: MessageCard component IconButton component ํ•ฉ์„ฑํ•˜๋Š” ๋กœ์ง์œผ๋กœ ์ˆ˜์ •

Co-authored-by: moonheekim0118 <[email protected]>

* refactor: reminder ๋‹จ๊ฑด ์กฐํšŒ ๋กœ์ง ์ œ๊ฑฐ ํ›„ ๋ณ€๊ฒฝ ๋œ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ ์ ์šฉ

* refactor: useSetReminder ์ค‘๋ณต๋˜๋Š” ์ƒํƒœ๊ฐ’ ๊ด€๋ฆฌ useInput custom hook์œผ๋กœ ๋ถ„๋ฆฌ

* refactor: useSetReminder์—  mutation ๋กœ์ง ๋ถ„๋ฆฌ ๋ฐ ReminderModalButtons component ์ œ๊ฑฐ ํ›„ ReminderModal component๋กœ ํ•ฉ์„ฑ

* refactor: reminder date, time ์ƒํƒœ๊ฐ’ ๋ณ€๊ฒฝ

- ๊ธฐ์กด "1์‹œ" -> ๋ณ€๊ฒฝ  "1"

* refactor: test ์ฝ”๋“œ ์ˆ˜์ •

- ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ ์šฉ

* refactor: date, time options ์ƒ์„ฑํ•˜๋Š” ๋กœ์ง useSetReminder hook ์—์„œ ๋ถ„๋ฆฌ

Co-authored-by: moonheekim0118 <[email protected]>

* feat: favicon ์ถ”๊ฐ€ ๋ฐ ์˜คํ”ˆ๊ทธ๋ž˜ํ”„ ๋ฉ”ํƒ€ํƒœ๊ทธ ์ถ”๊ฐ€ (#433)

* chore: favicon.ico ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฐ html ์ ์šฉ

* chore: ์˜คํ”ˆ๊ทธ๋ž˜ํ”„์— ๋ณด์—ฌ์ค„ ๋กœ๊ณ  ์ด๋ฏธ์ง€ png ํŒŒ์ผ ์ถ”๊ฐ€

* chore: ์˜คํ”ˆ๊ทธ๋ž˜ํ”„ ๋ฉ”ํƒ€ํƒœ๊ทธ ์ถ”๊ฐ€
- type: ์›น ์‚ฌ์ดํŠธ ํƒ€์ž…
- url : ์›น ์‚ฌ์ดํŠธ url (production ์„œ๋ฒ„ ์—ฐ๋™)
- title: ์›น ์‚ฌ์ดํŠธ ํƒ€์ดํ‹€
- image: ์›น ์‚ฌ์ดํŠธ ๋Œ€ํ‘œ ์ด๋ฏธ์ง€
- description: ์›น ์‚ฌ์ดํŠธ ์„ค๋ช…
- site_name: ์›น ์‚ฌ์ดํŠธ ์ด๋ฆ„
- locale: ์›น ์‚ฌ์ดํŠธ ์–ธ์–ด

* chore: EOL ์ œ๊ฑฐ

* chore: Jacoco, SonarQube ์—ฐ๋™ (#442)

* feat: SonarQube ์—ฐ๋™

* refactor: ์บ์‹ฑ ์˜ต์…˜ ์ œ๊ฑฐ ๋ฐ ๋ฌธ๊ตฌ ์ˆ˜์ •

* chore: SonarQube projectKey ์ˆ˜์ •

* feat: thread_broadcast ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (#424)

* feat: subtype์ด thread_broadcast ์ธ ์Šฌ๋ž™ ์ด๋ฒคํŠธ ์ถ”๊ฐ€

* feat: thread_broadcast ์ด๋ฒคํŠธ๊ฐ€ message_changed ์ด๋ฒคํŠธ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€

* test: ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

* refactor: ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* refactor: ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ถ”๊ฐ€

* feat: ์—๋Ÿฌ ์ฝ”๋“œ์™€ ์—๋Ÿฌ ์ฝ”๋“œ, ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•œ dto ์ถ”๊ฐ€ (#451)

* chore: favicon ์›นํŒฉ ์„ค์ • ์ถ”๊ฐ€ (#453)

- htmlWebpackPlugin ์‚ฌ์šฉํ•˜์—ฌ, HTML์— ๋กœ์ปฌ ์ด๋ฏธ์ง€๊ฐ€ ํ•จ๊ป˜ ๋นŒ๋“œ๋˜๋„๋ก ์ถ”๊ฐ€

* refactor: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ UI ๋ฐ ๊ด€๋ จ ๋กœ์ง ๋ฆฌํŒฉํ„ฐ๋ง (#443)

* feat: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€์—์„œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์—†์Œ์— ๋Œ€ํ•œ UI ์ˆ˜์ •
- ํ‚ค์›Œ๋“œ ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ๋ผ๋Š” ๋ฌธ๊ตฌ๋กœ ๋Œ€์ฒด

* refactor: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€์—์„œ searchParam ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„ ๊ฐ™์€ ๋กœ์ง hook ์œผ๋กœ ๋Œ€์ฒด
- useGetSearchParam ์‚ฌ์šฉ

* refactor: ๊ฒ€์ƒ‰ ์ฑ„๋„ ์„ ํƒ ํ›… ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐ ํ˜„์žฌ ๋ฐฉ๋ฌธ์ค‘์ธ ์ฑ„๋„ id ๋ฐฐ์—ด๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ •
- ๊ฒ€์ƒ‰ ์‹œ, ์ด์ „์— ์„ ํƒ๋œ ์ฑ„๋„์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ์ƒํ™ฉ์„ ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋ฐฉ๋ฌธ์ค‘ ์ฑ„๋„ id ๋ฅผ ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •
- ์ „๋ฐ˜์ ์ธ ํ›… ๋ฆฌํŒฉํ„ฐ๋ง

* refactor: useSearchKeywordForm ์—์„œ ๋ถˆํ•„์š”ํ•œ props ์ œ๊ฑฐ
- props ๋Œ€์‹  handler ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ๋„๋ก ์ˆ˜์ •

* refactor: useSearchKeywordForm ๋„ค์ด๋ฐ ์ˆ˜์ •
- useSubmitSearchForm ์œผ๋กœ ์ˆ˜์ •

* feat: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€์—์„œ, ์ด์ „ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ SearchInput ์— ๋‚จ์•„์žˆ๋„๋ก ์ˆ˜์ •

* refactor: ์ œ์ถœํ•œ ํ‚ค์›Œ๋“œ ๊ณต๋ฐฑ ์ œ๊ฑฐ ๋กœ์ง ์ถ”๊ฐ€

* fix: ์„ ํƒ๋œ ์ฑ„๋„์ด ๋ฐ์ดํ„ฐ ๋งค ๋ฆฌ๋ Œ๋”๋ง๋งˆ๋‹ค ๋น„์›Œ์ง€๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* refactor: ๊ตฌ๋…๋œ ์ฑ„๋„ ์š”์ฒญ ์ค‘๋ณต ์ฟผ๋ฆฌ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉ

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜
- prevChannelIds ์‚ฌ์šฉํ•˜์—ฌ ์ฑ„๋„ id filter

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜
- ๊ฐœํ–‰ ์ถ”๊ฐ€

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

* refactor: ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜
- trim util ํ•จ์ˆ˜ ์ œ๊ฑฐ

* refactor: ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ์ œ๊ฑฐ

* fix: ๊ฒ€์ƒ‰ ์ฑ„๋„ ์˜ต์…˜ ์„ ํƒ ๋ฒ„๊ทธ ํ•ด๊ฒฐ (#458)

- ํ˜„์žฌ ๋ฐฉ๋ฌธ์ค‘์ธ ์ฑ„๋„์ด ์ฒดํฌ๋˜์ง€ ์•Š๋Š” ์—๋Ÿฌ ํ•ด๊ฒฐ
- ์ „์ฒด ์„ ํƒ์ด ๋˜์ง€ ์•Š๋Š” ์—๋Ÿฌ ํ•ด๊ฒฐ

* fix: ์„œ๋ฒ„ ์—๋Ÿฌ ๋Œ€์‘ ๋ฐฉ๋ฒ• ์ˆ˜์ • ๋ฐ ๊ตฌ๋…์ค‘์ธ ์ฑ„๋„ ์—†์„ ๊ฒฝ์šฐ ๋Œ€์‘ (#459)

* fix: ์„œ๋ฒ„์—์„œ ์ „๋‹ฌ๋ฐ›๋Š” ์—๋Ÿฌ ํƒ€์ž… ์ˆ˜์ •

* fix: react-query retry ์˜ต์…˜ 0์œผ๋กœ ์„ค์ •

* feat: ๊ตฌ๋…์ค‘์ธ ์ฑ„๋„ ์—†์„ ๊ฒฝ์šฐ ์ฑ„๋„ ์ถ”๊ฐ€ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ๊ตฌํ˜„

* refactor: ์œ ํšจํ•˜์ง€ ์•Š์€ ์Šคํ† ๋ฆฌ ์ œ๊ฑฐ ๋ฐ ํ•„์š”ํ•œ ์Šคํ† ๋ฆฌ ์ถ”๊ฐ€ (#461)

- BookmarkButton ์Šคํ† ๋ฆฌ ์ถ”๊ฐ€
- ReminderButton ์Šคํ† ๋ฆฌ ์ถ”๊ฐ€

* refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” assets ์ œ๊ฑฐ (#462)

* refactor: ๋ˆ„๋ฝ๋œ ํƒ€์ž… ๋ณด๊ฐ• ๋ฐ ํƒ€์ž… ๋ฆฌํŒฉํ„ฐ๋ง (#463)

* refactor: ์ปค์Šคํ…€ํ›… ๋ˆ„๋ฝ๋œ Return Type ์ž‘์„ฑ

* chore: hook ํด๋” ๋‚ด๋ถ€ ์ƒ๋Œ€๊ฒฝ๋กœ ์ œ๊ฑฐ

* refactor: ๋ฆฌ์•กํŠธ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” EventHandler ํƒ€์ž… ์ ์šฉ

* refator: ๋ฐ˜๋ณต๋˜๋Š” ํ‚ค-ํ”„๋กœํผํ‹ฐ ํƒ€์ž… Record ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง

* refactor: useSetReminder ์˜ค์ „,์˜คํ›„ ์ƒ์ˆ˜ํ™” ๋ฐ type ์„ค์ •

* refactor: ReminderModal ๋‚ด ๋ฒ„ํŠผ ํ…์ŠคํŠธ ์ƒ์ˆ˜ํ™” ๋ฐ ํƒ€์ž… ์ •์˜

* refactor: PropsWithChildren ์ ์šฉ ๋ฐ ์ „๋ฐ˜์ ์ธ ์ปดํฌ๋„ŒํŠธ Props ๋ฆฌํŒฉํ„ฐ๋ง

* refactor: api ์š”์ฒญ ํ•จ์ˆ˜ ์ „๋ฐ˜์ ์ธ ๋ฆฌํŒฉํ„ฐ๋ง
- query params ๊ฐ์ฒด๋กœ ๋„˜๊ฒจ์ฃผ๋„๋ก ์ˆ˜์ •
- ๋ˆ„๋ฝ๋œ ์ ˆ๋Œ€๊ฒฝ๋กœ ์ ์šฉ

* refactor: useQuery Error ํƒ€์ž… ๋ช…์‹œ

* refactor: axios ์š”์ฒญ ์‹œ ์ฟผ๋ฆฌํŒŒ๋žŒ ๊ฐ์ฒด๋กœ ๋„˜๊ฒจ์ฃผ๋„๋ก ๊ฐœ์„ 

* refactor: ๋ˆ„๋ฝ๋œ ์ ˆ๋Œ€๊ฒฝ๋กœ ์ถ”๊ฐ€

* refactor: type ๋„ค์ด๋ฐ ์ˆ˜์ •
- ResponseReminder -> Reminder ๋กœ ์ˆ˜์ •

* refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” api ํ•จ์ˆ˜ ์ œ๊ฑฐ

* refactor: hooks ๋ˆ„๋ฝ๋œ ReturnType ์ •์˜

* refactor: ๋ˆ„๋ฝ๋œ ์ ˆ๋Œ€๊ฒฝ๋กœ ์ถ”๊ฐ€

* refactor: ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ, ๋ถ๋งˆํฌ ๋ฐ์ดํ„ฐ id ํƒ€์ž… ์ˆ˜์ •
- string -> number

* refactor: ๋ฆฌ๋งˆ์ธ๋” ์‚ญ์ œ useMutation ์ ์šฉ

* fix: MemberInitializerTest Disable ์ฒ˜๋ฆฌ

* Revert "fix: MemberInitializerTest Disable ์ฒ˜๋ฆฌ"

This reverts commit 66033771a24dabbce1cf3c6dd1272471ed2116de.

* feat: DatabaseCleaner ๊ตฌํ˜„ (#444)

* feat: DatabaseCleaner ๊ตฌํ˜„

Co-authored-by: Richard Jeon <[email protected]>
Co-authored-by: JangBomi <[email protected]>

* feat: AcceptanceTest, ControllerTest์—์„œ truncate.sql ์ œ๊ฑฐ

Co-authored-by: Richard Jeon <[email protected]>
Co-authored-by: JangBomi <[email protected]>

* fix: ReminderServiceTest ์— Transactional ์• ๋„ˆํ…Œ์ด์…˜ ์ถ”๊ฐ€

Co-authored-by: Richard Jeon <[email protected]>
Co-authored-by: JangBomi <[email protected]>

* test: MemberInitializerTest Disable ์ฒ˜๋ฆฌ

* test: AcceptanceTest AfterEach ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝ. clear -> tearDown

Co-authored-by: JangBomi <[email protected]>

* refactor: ์ฑ„๋„ ์ƒ์„ฑ ์—ญํ• ์„ channelService์—๊ฒŒ ์œ„์ž„ (#457)

* refactor: z-index ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ๋ฐ Dropdown Dimmer์ œ๊ฑฐ (#466)

* refactor: ๋ถˆํ•„์š”ํ•œ console.log ์ œ๊ฑฐ

* chore: ๊ฐœํ–‰ ์ถ”๊ฐ€

* refactor: z-index ์ˆ˜์ •

* refactor: Calendar component z-index ์ถ”๊ฐ€ ์ˆ˜์ •

* feat: useOuterClick custom hook ์ƒ์„ฑ ๋ฐ Dropdown component์— ์ ์šฉ

* chore: DB ์„ค์ • ์ •๋ณด ๋ณ€๊ฒฝ (#467)

* feat: ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€์— ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ๊ธฐ๋ก (#468)

* refactor: QA 1์ฐจ ๋ฐ˜์˜  (#469)

* fix: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€์—์„œ ์žฌ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ์ด์Šˆ ํ•ด๊ฒฐ

* fix: main ์ฑ„๋„์˜ ํŠน์ • ๋‚ ์งœ ํ”ผ๋“œ ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ์ฑ„๋„ ์˜ต์…˜์—์„œ ์ฑ„๋„ ์„ ํƒ์ด ์•ˆ๋˜์–ด์žˆ๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* refactor: '๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค' ๋ผ๋Š” ์Šค๋‚ต๋ฐ” ๋ฉ”์‹œ์ง€ ์ œ๊ฑฐ

* fix: placeholer text ๋„์–ด์“ฐ๊ธฐ ์ถ”๊ฐ€

* refactor: home ๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ ๊ฐ€์žฅ ์ตœ๊ทผ ๋ฐฉ๋ฌธํ•œ ํ”ผ๋“œ ๋ฐฉ๋ฌธํ•˜๋„๋ก ๋กœ์ง ์ˆ˜์ •
- sessionStorage ์— ์ €์žฅ
- ๋กœ๊ทธ์•„์›ƒ ์‹œ sessionStorage ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”

* refactor: QA 2์ฐจ ๋ฐ˜์˜ (#470)

* fix: github icon ํด๋ฆญ์‹œ github page๋กœ ์ด๋™ ๋ฐ footer component ํ•„์š”์—†๋Š” ํƒœ๊ทธ ์ œ๊ฑฐ

* fix: Snackbar ๋ฉ”์‹œ์ง€ dimmer ๋ฐ‘์— ๊น”๋ฆฌ๋Š” ๋ฌธ์ œ ์ˆ˜์ • z-index: 3;์œผ๋กœ ์ˆ˜์ •

* refactor: useOuterClick custom hook ref type ์žฌ์„ค์ • (any type ์ œ๊ฑฐ)

* fix: Feed, Reminder, Bookmark, SpecificDateFeed ์ ‘๊ทผ์‹œ ์Šคํฌ๋กค ์ƒ๋‹จ์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* hotfix: ํ™ˆ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์ตœ๊ทผ ๋ฐฉ๋ฌธ ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€๋Š” ๋กœ์ง ๋ฒ„๊ทธ ์ˆ˜์ • (#471)

- ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ sessionStorage์— ์ €์žฅํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* refactor: QA 3์ฐจ ๋ฐ˜์˜ (#472)

* refactor: ์„ ํƒ๋œ ์ฑ„๋„ ์ด๋ฆ„์— ํ•˜์ด๋ผ์ดํŠธ ์ฃผ๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€

* refactor:  Drawer Modal, Logout modal ์ค‘๋ณต์œผ๋กœ ๋„์šฐ์ง€๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

* refactor: ๋ถˆํ•„์š”ํ•œ svg ์ œ๊ฑฐ ๋ฐ svg ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ ํ›„ ๋ณ€๊ฒฝ๋œ svg ์ ์šฉ

* refactor: ๋ฆฌ๋งˆ์ธ๋” ๋“ฑ๋ก์‹œ ๋™์ผํ•œ ๋‚ ์งœ ๋™์ผํ•œ ์‹œ๊ฐ„ ๋™์ผํ•œ ๋ถ„์— ์š”์ฒญ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ์ค‘๋ณต๋˜๋Š” ๋กœ์ง ์ œ๊ฑฐ

* refactor: ์˜ค์ „ ์˜คํ›„ ์‹œ๊ฐ„ ์žฌ ์„ค์ •

- ์˜ค์ „ 0์‹œ ~ 11์‹œ
- ์˜คํ›„ 12์‹œ ~ 11์‹œ

* refactor: AMHour, PMHour ์— ๋งž๊ฒŒ scroll ์ด๋™ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ

* fix: BookmarkResponse์—์„œ bookmark id ๋„ ํ•จ๊ป˜ ๋ฐ˜ํ™˜๋ฐ›๋„๋ก ์ˆ˜์ • (#473)

* refactor: QA 4์ฐจ ๋ฐ˜์˜  (#476)

* refactor: ๋ถˆํ•„์š”ํ•œ ์ฃผ์„ ์ œ๊ฑฐ

* fix: ๋‹คํฌ๋ชจ๋“œ ํ† ๊ธ€๋Ÿฌ icon assets ์— ์ถ”๊ฐ€ ๋ฐ ์‚ฌ์šฉ

* fix: OS ํ™˜๊ฒฝ์— ๋”ฐ๋ผ์„œ ์ดˆ๊ธฐ ๋‹คํฌ๋ชจ๋“œ/๋ผ์ดํŠธ๋ชจ๋“œ ์„ค์ •๋˜๋„๋ก ์ˆ˜์ •

* refactor: ์„œ๋ฒ„์—์„œ ๋ณ€๊ฒฝ๋œ ๋ถ๋งˆํฌ ์Šคํ‚ค๋งˆ ๋ฐ˜์˜

* fix: ๊ฐœ๋ฐœ๋ชจ๋“œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํŒŒ์ผ ์ˆ˜์ •

* fix: ๊ธฐ๋ณธ์ฑ„๋„ (feed) ์ผ ๊ฒฝ์šฐ์—๋„ drawer ์— ํ•˜์ด๋ผ์ดํŠธ ํ‘œ์‹œ๋˜๋„๋ก ์ˆ˜์ •

* refactor: ์ฑ„๋„์„ ํƒ ํŽ˜์ด์ง€์—์„œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์ œ๊ฑฐ ๋ฐ ๋””์ž์ธ ์ˆ˜์ • (#477)

* fix: thread_broadcast ๋ฉ”์‹œ์ง€ ์ˆ˜์ • ์‹œ ์ˆ˜์ •์ด ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • (#465)

* fix: thread_broadcast ๋ฉ”์‹œ์ง€ ์ˆ˜์ • ์‹œ ์ˆ˜์ •์ด ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* test: assert์—์„œ ๊ฒ€์ฆํ•  ๋ถ€๋ถ„ ์ด์™ธ์˜ ์ฝ”๋“œ ์ œ๊ฑฐ

* fix: ๊ฐ™์€ ๋‚  ๋ฆฌ๋งˆ์ธ๋” ๊ฐœ์ˆ˜๊ฐ€ count๋ณด๋‹ค ๋งŽ์€ ๊ฒฝ์šฐ์— isLast ์—๋Ÿฌ ์ˆ˜์ • (#478)

* fix: ๊ฐ™์€ ๋‚  ๋ฆฌ๋งˆ์ธ๋” ๊ฐœ์ˆ˜๊ฐ€ count๋ณด๋‹ค ๋งŽ์€ ๊ฒฝ์šฐ์— isLast ์• ๋Ÿฌ ์ˆ˜์ •

* test: ๋ฆฌ๋งˆ์ธ๋” ๋‚ ์งœ + ์‹œ๊ฐ„ ์ˆœ ์ •๋ ฌ ํ™•์ธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Co-authored-by: ๋ด„ <[email protected]>
Co-authored-by: Richard JEON <[email protected]>
Co-authored-by: hyewoncc <[email protected]>
Co-authored-by: hyewoncc <[email protected]>
Co-authored-by: moonheekim0118 <[email protected]>
Co-authored-by: Jaejeung Ko <[email protected]>
Co-authored-by: JangBomi <[email protected]>