(๐๋น๊ทผ!) ๋ฐ๊ฐ์ด ์ค๊ณ ๊ฑฐ๋ ํค์๋ ์๋ฆผ ๋ง๋ค๊ธฐ
์๋ ํ์ธ์. ์ค๊ณ ๊ฑฐ๋์ค์์ iOS ์์ง๋์ด๋ก ์ผํ๊ณ ์๋ Lychee์์.
๋น๊ทผ ์ค๊ณ ๊ฑฐ๋, ๋ค์ํ ๋ฌผ๊ฑด์ ์ฌ๊ณ ํ ๋ ์์ฃผ ์ด์ฉํ์ค ํ ๋ฐ์. ์ฐพ๊ณ ์๋ ๋ฌผํ์ด ์ฌ๋ผ์์ ๋ ๋ฐ๋ก ์๋ฆผ์ ๋ฐ์ ์ ์๋ ํค์๋ ์๋ฆผ ๊ธฐ๋ฅ์ ์์๋์?
์๋ ๊ฐ์ ์ฏค ๋ ธํธ๋ถ์ด ํ์ํด์ ํค์๋ ์๋ฆผ์ผ๋ก ๋ ธํธ๋ถ ๊ธฐ์ข ์ ๋ฑ๋กํด๋์๋ ์ ์ด ์์ด์. ์ ๊ฐ ์ฐพ๋ ๊ธฐ์ข ์ ๊ธ์ด ์ฌ๋ผ์ฌ ๋ ๋ฐ๋ก ์๋ฆผ์ ๋ฐ์ ์ ์์ด์ ์ข์์ฃ . ๊ทธ๋ฐ๋ฐ ์ข ์ข ๋ ธํธ๋ถ ์ผ์ด์ค, ๋ ธํธ๋ถ ์ถฉ์ ๊ธฐ์ ๊ฐ์ด ๋ฑ๋กํ ํค์๋๊ฐ ํฌํจ๋ ๋ค๋ฅธ ๋ฌผ๊ฑด์ ์๋ฆผ์ ๋ฐ๊ธฐ๋ ํ์ด์. ์ด๋ด ๋๋ ๊ธฐ๋ค๋ฆฌ๋ ์๋ฆผ์ด ์๋๋ผ์ ์ค๋งํ๊ธฐ๋ ํ์์ด์.
๊ทธ ์ฆ์ ์ ํฌ ํ์ ์ค๊ณ ๊ฑฐ๋ ๋ฆฌํ ์ ์ ์ค์ํ ์ญํ ์ ํ๋ ํค์๋ ์๋ฆผ์ ์์ธํ ๋ค์ฌ๋ค๋ณด๊ธฐ ์์ํ์ด์. ํค์๋ ์๋ฆผ์ ๋ฑ๋กํ๋ ์งํ๋ ๊พธ์คํ ์ฑ์ฅํ๊ณ ์์ผ๋, ๋ฐ์ก๋ ํค์๋ ์๋ฆผ ํธ์์ ์์ ๋นํด ๋ฎ์ ์คํ์จ์ ๋ณด์์ ๋ ์ฌ์ฉ์๋ค์ด ์ํ๋ ์๋ฆผ์ ๋ฐ์ง ๋ชปํ๊ณ ์๋ค๋ ๊ฑธ ์ ์ ์์์ฃ . ๊ทธ๋ ๊ฒ ์์น ์๋ ์๋ฆผ์ผ๋ก ํผ๋ก๊ฐ ์์ด๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ์ด์.
ํค์๋ ์๋ฆผ์ ๋ฌธ์ ๋ฅผ ๋ ์์ธํ ๋ค์ฌ๋ค๋ณด๊ธฐ ์ํด ์ฌ์ฉ์์ ๋ชฉ์๋ฆฌ๋ฅผ ๋ค์ด๋ณด์์ด์.
๐ฃ๏ธ โ์ ๊ฐ ์ฐพ๋ ๋ฌผ๊ฑด์ด ์๋์์. ๋ฑ๋กํ ํค์๋์ ์ ํํ๊ฒ ์ผ์นํ๋ ์๋ฆผ๋ง ๋ฐ๊ณ ์ถ์ด์โ
๐ฃ๏ธ โ์ ๊ฐ ์ฐพ๋ ๋ฌผ๊ฑด์ด๋ผ๋, ๋๋ฌด ๋จผ ๋๋ค์ ์๋ฆผ์ ๋ฐ๊ณ ์ถ์ง ์์์โ
๐ฃ๏ธ โ๋ด๊ฐ ์ํ๋ ๋ฌผํ์ ํค์๋ ์๋ฆผ์ ๋ฐ์ผ๋ ค๋ฉด ์ด๋ค ํค์๋๋ฅผ ๋ฑ๋กํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ด์โ
๋ค์ํ ์ฌ๋ก๋ฅผ ์์ํ๊ฒ ๋ค์ผ๋ฉฐ, ํค์๋ ์๋ฆผ์ ๋ฌธ์ ๋ฅผ ๋ ๋พฐ์กฑํ๊ฒ ์ ์ํ์ด์. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ์ ๋ํ ๊ฐ์ ์ ์ ๋ฐ๊ตดํด๋๊ฐ๊ณ ๊ทธ๋ ๊ฒ ํค์๋ ์๋ฆผ ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์์ํ์ด์. ํด๋ผ์ด์ธํธ ๋ฆด๋ฆฌ์ฆ ๋ก๊ทธ๋ฅผ ๋์๋ณด๋ ์ง๋ 5๊ฐ์ ๋์ ์์ฃผ ๊ธด๋ฐํ๊ณ ์น์ดํ๊ฒ ๋ชฐ์ ํ ์ ์๋ ์๊ฐ์ ๋ณด๋ธ ๊ฒ ๊ฐ์์ ๐
๊ฐ์ ํ๋ก์ ํธ๋ ํฌ๊ณ ์์ ์ฌ๋ฌ ๊ฐ์ ์คํ๊ณผ ๊ธฐ๋ฅ ๊ฐ์ ์ ๋ฐ๋ณตํ๋ ์ฌ์ดํด๋ก ์งํ๋์์ด์. ํค์๋ ์๋ฆผ ๋ฑ๋ก ๋ฐ ๊ด๋ฆฌ์ ๋ํ ์ ๋ฐ์ ์ธ ๊ธฐ๋ฅ ๊ฐํธ๊ณผ ํจ๊ป ๋ ์ ์ ํ ํค์๋๋ฅผ ๋ฑ๋กํ๋๋ก ๋๋ ์ฌ๋ฌ ์ถ์ฒ ์คํ ๋ฑ์ ๋ฐ๋ณตํ์ฃ . ๊ทธ ๊ฒฐ๊ณผ ํค์๋ ์๋ฆผ ์คํ์จ์ด 2๋ฐฐ ๊ฐ๊น์ด ์์นํ๋ฉฐ, ํค์๋ ์๋ฆผ์์ ๊ตฌ๋งค๋ฅผ ์ํ ์ฑํ ์ผ๋ก ์ ํํ๋ ์๋ ํจ๊ป ์ฆ๊ฐํ๋ ๊ฒ์ ๋ณผ ์ ์์์ด์. ๐๐ป
์ด๋ ๊ฒ ์ ํ์ ์ฑ์ฅ์ ์ํด ๋น ๋ฅด๊ฒ ๊ฐ์ ์ ๋ฐ๋ณตํ๋ ๊ณผ์ ์์, ์ ์๊ฒ ํฐ ๋์์ด ๋์๋ ์ ์ฐํ ๋ชจ๋ฐ์ผ ์ค๊ณ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋๋ ๋ณด๋ ค๊ณ ํด์!
๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ, Feature Module ๊ธฐ๋ฐ์ผ๋ก
๋น๊ทผ iOS ์ฑ์ Feature, UI, Domain, Core, Shared์ 5๊ฐ์ง ๊ณ์ธต์ ๊ฐ์ง ๋ชจ๋๋ก ๊ตฌ์ฑ๋์ด์๋๋ฐ์. ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋๋ง๋ค Feature Module์ ์ถ๊ฐํ์ง๋ ์์ง๋ง, ๋ถ๋ฆฌ๋ ์ ์๋ ๋งฅ๋ฝ์ ๊ธฐ๋ฅ์ด๋ผ๋ฉด ๋ณ๋์ Feature Module์ ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ด์. (๋น๊ทผ iOS์ฑํฐ์ ๋ชจ๋ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ด ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ ๋ ์ข์์.)
โ์ ์ ์ ์ ๋ถ๋์โ ๋ผ๋ ๊ฒฉ์ธ์ ๋ฐ๋ผ ์๋ก ๊ฐ์ ๋๋ ํค์๋ ์๋ฆผ ๊ธฐ๋ฅ์ ๋ด์ ๋ณ๋์ Feature Module์ ์์ฑํ์ด์. ๊ทธ๋ฆฌ๊ณ ์ ๋ชจ๋ ์์ ํค์๋ ์๋ฆผ์์ ์ฌ์ฉํ ์์ค์ฝ๋๋ค์ ์ค๊ณํด ์์์ฌ๋ ธ์ด์.
FleaMarketKeywordNotificationFeature
๋ชจ๋์ ๋ค๋ฅธ Feature ๋ชจ๋๊ณผ ์ฑ ํ๊ฒ๊ณผ๋ ๋
๋ฆฝ์ ์ผ๋ก ๋ถ๋ฆฌ๊ฐ ๋์ด์์ด์, ์ ๊ธฐ๋ฅ์ ๋ผ์๋ฃ์ ๋ ๋ฐ์ํ ์ ์๋ ์ฌ์ด๋ ์ดํํธ๋ก๋ถํฐ ๋น๊ต์ ์์ ํ ํ๊ฒฝ์ด์์ด์. ๋๋ถ์ ์ ์ ๋ถ๋ด๊ฐ์ผ๋ก ๋น ๋ฅด๊ฒ ์์
์ ํด๋๊ฐ ์๊ฐ ์์์ง์. ๋ ์ ์ฒด ๋ชจ๋์ ๋น๋ํ์ง ์๊ณ ๋ ๋จ๋
๋ชจ๋์์ ๋น๋์ ํ
์คํธ๋ฅผ ์ํํ ์ ์๊ธฐ์ ์ด์ ๋ณด๋ค ์๊ฐ์ ๋จ์ถํ ์ ์์ด์ ์์ฐ์ฑ๋ ๋์ด์ฌ๋ฆด ์ ์์์ด์.
์ด๊ธฐ๋ถํฐ ๋ณํ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋๋ก ๊ตฌ์ฑ
ํค์๋ ์๋ฆผ ๊ฐ์ ์ ์ฒซ ๊ณผ์ ๋ก, ๊ฐ์ฅ ๋ง์ ๋ถํธ์ฌํญ์ผ๋ก ๊ผฝํ๋ โ๋ถํ์ํ ํค์๋ ์๋ฆผโ์ ์ค์ด๊ธฐ ์ํ ํค์๋์ ์กฐ๊ฑด์ ์ค์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฒ ๋์์ด์. ๊ธฐ์กด์๋ ํค์๋๋ง์ ๋ฑ๋กํ ์ ์์๋๋ฐ์, ์ด์ ๋ฑ๋กํ ํค์๋์ ์นดํ ๊ณ ๋ฆฌ, ๊ฐ๊ฒฉ ๋ฒ์, ์ ์ธํ๊ณ ์ถ์ ํค์๋์ ๊ฐ์ ์กฐ๊ฑด์ ์ค์ ํด์ ํ์ํ ์๋ฆผ๋ง ํํฐ๋งํด์ ๋ฐ์ ์ ์๋๋ก ํ ๊ฒ์ด์ฃ .
์ ํค์๋ ์๋ฆผ ์ค์ ํ๋ฉด UI์ ์ด๊ธฐ ์คํ์ ๋จ์ผ ์ธ๋กํ ๋ชฉ๋ก์ผ๋ก ๊ตฌ์ฑ๋์์ด์. (์ผ์ชฝ ์ด๋ฏธ์ง ์ฐธ๊ณ ) ํ์ง๋ง ํค์๋ ์๋ฆผ์ ๋ํ ์ฌ๋ฌ ๋ถํธํจ์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฆฌ์คํธ์ ๊ตฌ์กฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ง ํํ๋ก ๋ณํ๋ ๊ฐ๋ฅ์ฑ์ ์ด์ด๋์ด์ผ ํ์ฃ . ๊ทธ๋์ ์ฒ์์ ๋น๋ก Verticle List์ ๋จ์ํ ํํ์ด์ง๋ง enum์ผ๋ก Section
ํ์
์ ์ ์ํ๊ณ , ์ด์ ๋ฐ๋ผ ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํ๋๋ก ํ์ด์.
๋ฆฌ์คํธ UI๋ KarrotListKit์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ๋๋ฐ์. List, Section, Cell์ ์ง๊ด์ ์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ฉ์ดํ์ด์. ๋ ๊ฐ ์ปดํฌ๋ํธ์ modifier๋ฅผ ๋ถ์ฌ ๊ฐ๋จํ๊ฒ ๋ ์ด์์ ์์ฑ์ ์ง์ ํ๊ฑฐ๋ ์ปดํฌ๋ํธ์ ๋ฐ์ํ๋ ์ก์ ์ ๋ฐ๋๋ก ์ฐ๊ฒฐํ ์ ์์ด์ UI ๊ตฌ์ฑ ๋จ๊ณ์ ์์ฐ์ฑ์ ์ฌ๋ ค์ฃผ์์ด์.
enum Section: Equatable, Identifiable {
case registeredUserKeywordList([ItemViewModel])
}
func updateSection(section: Section) {
collectionViewAdapter.apply(
List {
sections.map { section -> Section in
switch section {
case .registeredUserKeywordList(let viewModels):
return Section(
id: id,
cells: makeRegisteredKeywordSectionItems(
viewModels: viewModels
)
)
.withSectionLayout(.vertical(spacing: 0.0))
}
}
}
)
}
๋ฆฌ๋ด์ผ๋ ์ธ๋กํ ๋ฆฌ์คํธ์ ํค์๋ ์๋ฆผ ์ค์ ํ๋ฉด์ ๋ฐฐํฌ ํ, ๋ค์ ์์ ์ผ๋ก ํค์๋ ๋ฑ๋ก์ ์ ์ํ๋ ์คํ์ ํ๊ธฐ๋ก ํ์ด์. ํค์๋ ์๋ฆผ ์ค์ ํ๋ฉด์ ๋ฐฉ๋ฌธํ์ ๋ ์ด๋ค ํค์๋๋ฅผ ๋ฑ๋กํด์ผํ ์ง ์ด๋ ค์์ ๊ฒช๊ณ ์์ ๊ฒ์ด๋ผ๋ ๊ฐ์ค์ด์์ฃ . ๊ทธ๋ ๊ฒ ์ต๊ทผ ๋ณธ ๊ฒ์๊ธ์ ํ ๋๋ก ์ถ์ฒ๋ ํค์๋ ์นฉ ๋ชฉ๋ก์ ๊ธฐ์กด ๋ฆฌ์คํธ ํ๋จ์ ๋ณด์ฌ์ฃผ๋ ์์ ์ ์์ํ์ด์.
์ง๋ ์์
์์ ๋ฆฌ์คํธ์ ์ด๋ค ์น์
์ด ์ถ๊ฐ๋์ด๋ ๋์ํ ์ ์๋๋ก ๊ตฌ์ฑํ ๋๋ถ์ ์ case๋ฅผ ์ ์ํ๊ณ , ์ฐ๊ฒฐํ๋ ์์ ๋ณ๊ฒฝ๋ง์ผ๋ก ์คํ์ ์ค๋นํ ์ ์์์ด์. Section
์ recommendedKeywordList
์ case๋ฅผ ์ถ๊ฐํ๊ณ ํด๋น ์น์
์ ๋ค์ด๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํด ์ฐ๊ฒฐํด์ฃผ์์ด์.
enum Section: Equatable, Identifiable {
case registeredUserKeywordList([ItemViewModel])
case recommendedKeywordList(RecommendedViewModel)
}
๋ฏธ๋์ ๋ํด 100% ์์ธกํ ์๋ ์๊ฒ ์ง๋ง, ํ์๋ค๊ณผ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ๋๋์๋ ๊ฒ์ ํ ๋๋ก ์์๋๋ ๋ณ๊ฒฝ์ ์ ์ ์ฐํ๊ฒ ์ค๊ณํด ๋ ๊ฒ์ด ๋์์ด ๋์์ด์.
N๊ฐ์ ๊ตญ๊ฐ, ํ๋์ ํ๋ฉด
ํค์๋ ์๋ฆผ ๊ธฐ๋ฅ์ ๊ตญ๋ด๋ฅผ ๋น๋กฏํด ๋ถ๋ฏธ, ์ผ๋ณธ, ์๊ตญ์์๋ ๋์ผํ๊ฒ ์ ๊ณต๋๊ณ ์์ด์. ์ค๊ณ ๊ฑฐ๋๋ฅผ ์ด์ฉํ ๋ ํ์ํ ๋ฌผ๊ฑด์ ๋ํ ์๋ฆผ์ ๋ฐ๊ณ ์ถ์ ๋์ฆ๋ ์ด๋์๋ ๋์ผํ๊ธฐ์ ์ ๊ตญ๊ฐ๋ฅผ ํจ๊ป ๊ฐ์ ํ๊ณ ์ ํ์ด์.
์ ๊ตญ๊ฐ์ ์ ๊ณต๋๋ ๊ธฐ๋ฅ์ผ ๋๋ ๋น์ทํ UI๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ํฉ์๋ ๊ตญ๊ฐ๋ณ UX์ ์ ์ฐํจ์ ์ํด View๋ฅผ ๋ฐ๋ก ๊ฐ์ ธ๊ฐ๊ฑฐ๋, ViewModelFactory ๊ตฌํ์ฒด๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ธฐ๋ ํ์๋๋ฐ์. ์ ํฌ ํ์ ์ด์ ๋ํด ๊ตญ๊ฐ ๋ถ๊ธฐ๋ฅผ ์ต์ํํ๊ณ ๊ณตํตํํ์๋ ์๊ฒฌ์ด์์ด์.
๊ตญ๊ฐ๋ณ๋ก ํน์์ฑ์ ๊ฐ์ ธ๊ฐ๋ฉด ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๊ณ ํ์คํ ๋ฆฌ๋ฅผ ์ ์์ง ๋ชปํ๋ ์์ ์๊ฐ ์ถ๊ฐ ์์ ์ ํ ๋ ์ฌ์ด๋ ์ดํํธ์ ์ํ๋๊ฐ ๋์์ง๊ธฐ ๋๋ฌธ์ด์์. ์ ํฌ ํ ํ๋ก๋ํธ ๋์์ด๋ Bada๊ฐ ๋จธ๋ฆฌ๋ฅผ ์ธ๋งค์๋ฉฐ ๊ตญ๊ฐ๋ณ๋ก ์ต๋ํ ๋์ผํ UI/UX๋ฅผ ์ค๊ณํด์ฃผ์ ๋์ ํด๋ผ์ด์ธํธ์์๋ ๊ตญ๊ฐ๋ถ๊ธฐ ์์ด ํ๋์ Presentation Layer๋ก ํ๋ฉด์ ๋ณด์ฌ์ค ์ ์์์ด์.
ํ์ง๋ง, ํค์๋ ์๋ฆผ์ ๋ฐ์ ๋๋ค ๋ฒ์๋ฅผ ์ค์ ํ ์ ์๋๋ก ๊ฐ์ ํ๋ ์์ ์ ํ๋ฉฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ด์. ๊ตญ๊ฐ๋ณ๋ก ์ ์ฉ๋๋ ์ง์ญ ์์คํ ์ด ๋ฌ๋๊ณ , ์ด์ ๋ฐ๋ผ์ ๊ฐ๊ฐ ๋ค๋ฅธ UI๋ฅผ ๋ณด์ฌ์ค ์ ๋ฐ์ ์์์ด์.
- ํ๊ตญ : ๋ฐ๊ฒฝ์ ์๋ ๋๋ค์ ๊ฐ์๋ฅผ ํ์ํ๋ฉฐ 4๋จ๊ณ์ Step Slider UI ์ ๊ณต
- ์บ๋๋ค : ๋ฐ๊ฒฝ km ๋ฒ์๋ฅผ ํ์ํ๋ฉฐ 5๋จ๊ณ์ Slider UI ์ ๊ณต
- ๋ฏธ๊ตญ : ๋ฐ๊ฒฝ mi ๋ฒ์๋ฅผ ํ์ํ๋ฉฐ 5๋จ๊ณ์ Slider UI ์ ๊ณต
- ์ผ๋ณธ : ๋ฐ๊ฒฝ์ ์๋ ๋๋ค์ ๊ฐ์๋ฅผ ํ์ํ๋ฉฐ 4๋จ๊ณ์ Slider UI ์ ๊ณต
์ง์ญ ์์คํ
์ ๋ฐ๋ผ ์๋ฒ์ EndPoint์ Response DTO๋ ๋ค๋ฅด์ง๋ง, ํ๋ฉด์์ ๋ค๋ค์ง๋ ์์๋ ๋ค๋ฅด์ง ์์์ด์. ๊ฐ ๊ตญ๊ฐ์์ ์ฌ์ฉํ๋ ๋๋ค ๋ฒ์์, ๊ฐ ๋๋ค ๋ฒ์๊ฐ ์ด๋ ์ ๋์ ๋ฒ์์ธ์ง ํํ(๋๋ค์ ๊ฐ์ OR ๋ฒ์์ ํฌ๊ธฐ)ํ๋ ๊ฒ์ ๋์ผํ๋ค๋ ์ ์ ์ถ์ํํ์ฌ ํ๋์ KeywordNotificationTownData
๋ฅผ ์ค๊ณํ์ด์.
struct KeywordNotificationTownData {
let town: KeywordNotificationTown
var metadata: KeywordNotificationTown.Metadata
}
enum KeywordNotificationTown {
case fooLocationSystem(FooLocation)
case barLocationSystem(BarLocation)
public var id: Int {
switch self {
case .fooLocationSystem(let fooLocation):
return fooLocation.id
case .barLocationSystem(let barLocation):
return barLocation.h3Index
}
}
public var name: String {
switch self {
case .fooLocationSystem(let fooLocation):
return fooLocation.name
case .barLocationSystem(let barLocation):
return barLocation.name
}
}
public var coordinate: KarrotLocationCoordinate? {
switch self {
case .fooLocationSystem(let fooLocation):
return fooLocation.coordinate
case .barLocationSystem(let barLocation):
return barLocation.coordinate
}
}
struct Metadata: Then {
var currentRange: KeywordNotificationTown.Range
var defaultRange: KeywordNotificationTown.Range
var rangeInfos: [KeywordNotificationTown.RangeInfo]
}
}
๊ทธ๋ฆฌ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ Interactor์ ๊ตญ๊ฐ์ ๋ฐ๋ผ ๊ฐ ์ง์ญ ์์คํ
์ EndPoint์์ ์ง์ญ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ KeywordNotificationTown
๋ก ๋งตํํด ๋ด๋ ค์ฃผ๋ Broker๋ฅผ ๋์์ด์. Broker์๊ฒ fetch๋ฅผ ์์ฒญํ๋ฉด, Interactor์์๋ ์ด๋ ๊ตญ๊ฐ์ธ์ง ์ ํ์ ์์ด, KeywordNotificationTownData
ํ์
์ผ๋ก ์๋ต์ ๋ฐ์ ํ๋ฉด์ ๊ตฌ์ฑํ ๋ฐ์ดํฐ๋ฅผ Presenter์ ์ ๋ฌํด์.
ํ๋์ ํ์ ์ด๋ค ๋ณด๋ ์์ฐ์ค๋ฝ๊ฒ ํ๋์ View์ ViewModel, ViewModelFactory๋ก ํ๋ฉด์ ๊ตฌ์ฑํ ์ ์์์ด์. ๋๋ถ์ Presentation Layer์์์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๊ฒ ๋์์ฃ . (์ด ๊ณผ์ ์์ ํจ๊ป ๊ณ ๋ฏผํด์ฃผ์ Elon.park์๊ฒ ๊ฐ์ฌ์ธ์ฌ๋ฅผ ์ ํด์.)
๋ฐ๋์๋ ํ ์คํธ
๋น ๋ฅด๊ฒ ์ฌ์ดํด์ ๋๋ฉฐ ํ ์คํธ ์ฝ๋์ ๋ํ ๊ณ ๋ฏผ๋ ์๊ฒผ์ด์. ์ ๋ ์ด์ ๊น์ง ๋น์ฆ๋์ค ๋ก์ง๋ถํฐ ํ๋ ์ ํ ์ด์ ๋ก์ง, ๋ผ์ฐํ ๋ก์ง, ํ๋ ๋ฐ์ดํฐ ์ ์ก ๋ก์ง๊น์ง ๋๋ถ๋ถ์ ๋ก์ง์ ๋ํด ์ ๋ํ ์คํธ๋ฅผ ์์ฑํด์์ด์. ๋จ์ by-pass ๋๋ ๊ฐ์ mock ๊ฐ์ฒด์ ์ ๋ฌํด ํธ์ถ ํ์๋ฅผ ํ ์คํธ๋ฅผ ํ๋ ๋ถํ์ํ ํ ์คํธ๋ ๋ง์๋ค๊ณ ์๊ฐํด์.
๋ ํจ์จ์ ์ผ๋ก ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ถ์๋ ์ ๋ ์ด๋ฐ ๊ณ ๋ฏผ๋ค์ ํ๊ธฐ ์์ํ์ด์.
- ์ฃผ์ ์ ์ฆ์ผ์ด์ค๋ง ๊ฒ์ฆํ๋ ๊ฒ์ ์ด๋จ๊น
- ๋น์ฆ๋์ค ๋ก์ง์ ์ผ๋ง๋ ์ด์ดํ๊ฒ ๊ฒ์ฆํด์ผํ ๊น
- ๋จ์ํ ๋ผ์ฐํ , ๋ก๊น ๋ก์ง์ ์ ๋ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ๋ณด๋ค ๊ตฌ๋ ํ ์คํธ๋ฅผ ํ๋๊ฒ ์ด๋จ๊น
- โฆ ๋ฑ๋ฑ
์ฌ๋ฌ ๊ณ ๋ฏผ ๋์, ์ฃผ์ ์ ์ฆ์ผ์ด์ค์ ๋ํ ์ก์ ๊ณผ ๋น์ฆ๋์ค ๋ก์ง ์์ฃผ๋ก ๋ฐ๋์๊ฒ ์ ๋ํ ์คํธ๋ฅผ ๊ตฌ์ฑํด๋ณด๊ธฐ๋ก ํ์ด์. ์ ๋ ํ ์คํธ ์์ฑ์ ๋ํ ๋ถ๋ด๊ฐ์ ๋ฎ์ถ๋, ํ์ํ ๋ถ๋ถ์ ์ ๋๋ก ๊ฒ์ฆํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ ์คํธ๋ฅผ ๊ตฌ์ฑํด์ผํ ์ง ๊ณ ๋ฏผํ๋ฉฐ ์์ฑํ์ด์. ๊ทธ๋ฆฌ๊ณ ๊ตฌ๋ ํ ์คํธ๋ฅผ ํ๋ ์๊ฐ์ ๋ ๋๋ฆฌ๋ฉฐ ์ ํ์ ๋ง์ด ์จ๋ณผ ์ ์์๋๋ฐ์. ๊ทธ ๊ณผ์ ์์ ๊ฒฝํ์ ์ธ ๋ถ๋ถ์ ๋ํ ์ด์ํจ์ ๋ฐ๊ฒฌํด ์ถ์ ์ ์ ๊ฐ์ ํ ์ ์์๋ ์ ๋ ๊ธฐ์ต์ ๋จ์์.
๊ฒ์ ๊ฒฐ๊ณผ ํ๋ฉด์์ ํ์ฌ ๊ฒ์ํ ํค์๋๋ฅผ ํค์๋ ์๋ฆผ์ผ๋ก ๋ฑ๋กํ๋ฉด, ํค์๋ ์๋ฆผ ์กฐ๊ฑด ์ค์ ์ ํด๋ณผ ์ ์๋๋ก ์๋ด๋ฅผ ํด์ฃผ๋ ์จ๋ณด๋ฉ ๊ธฐ๋ฅ์ด ์์์ด์.
์ด๋ฅผ ํตํด ํค์๋ ์๋ฆผ ์กฐ๊ฑด ์ค์ ํ๋ฉด์ ์ง์ ํ์ฌ ์นดํ ๊ณ ๋ฆฌ, ๊ฐ๊ฒฉ ๋ฑ์ ์กฐ๊ฑด ์ค์ ์ ์๋ฃํ๊ณ ๋์จ ๊ฒฝ์ฐ์ ๋ฐ๋ก ์ด์ ์ ์๋ ๊ฒ์ํ๋ฉด์ผ๋ก ๋์์ค๊ฒ ๋๋๋ฐ์. ์กฐ๊ฑด์ ์์ ํ๊ณ ์ถ๊ฑฐ๋ ๋ค์ ์กฐ๊ฑด์ ๋ณด๊ณ ์ถ์ ๋๋ ๋งฅ๋ฝ์ด ์ด์ด์ง ๊ฒฝ๋ก๊ฐ ๋ถ์ฌํ๋ค๋ ๊ฒ์ด ์์ฌ์ ์ด์. ๊ทธ๋์ ์๋ฃ ํ ์ค๋ต๋ฐ์ ๋ณด๋ฌ๊ฐ๊ธฐ ๋ฒํผ์ ๋ฃ์ด ํค์๋ ์๋ฆผ ์กฐ๊ฑด ์ค์ ํ๋ฉด์ผ๋ก ๋ค์ ์ง์ ํ ์ ์๋ ์ ๊ตฌ๋ฅผ ์ถ๊ฐํ๊ฒ ๋์์ด์.
์ ๋ ํ ์คํธ๋ ๋ฌผ๋ก ์ค์ํ์ง๋ง, ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๋ผ๋ฉด ๊ฐ๋ฐํ ๊ธฐ๋ฅ์ ์ง์ ๋ง์ด ์จ๋ณด๋ฉด์ ํ๋ฉด ๋๋จธ์ ๋ถ๋ถ๊น์ง ๊ฒ์ฆํด๋ณด๋ ๊ฒ๋ ์ค์ํ๋ค๋ ๊ฑธ ๋ฐฐ์ ์ด์.
๊ทธ๋ ๊ฒ 5๊ฐ์ ๊ฐ ๊ฐ์ ์ ๋ฐ๋ณตํ ๋์ ์ฐ๋ฆฌ ํค์์ด๊ฐ ๋ฌ๋ผ์ก์ด์! ์์ง ๋น๊ทผ์์ ํค์๋ ์๋ฆผ์ ์จ๋ณด์ ์ ์ด ์๋ค๋ฉด ํ์ํ ๋ฌผํ์ด ์์ ๋ ํ ๋ฒ ์จ๋ณด์๊ธธ ์์ ์๊ฒ ์ถ์ฒ๋๋ ค์ ๐
๊ฐ์ ์ดํ ํค์๋ ์๋ฆผ์ ๋ฑ๋ก ์๊ฐ ์ฆ๊ฐํ๋ฉฐ ์๋ฆผ ์คํ์จ๋ ํจ๊ป ๋์ด๋ฌ๊ณ , ์ด์ ์ ๋นํด ๋ถํ์ํ ์๋ฆผ์ ๋ํ ๋ฌธ์๋ ๋์ ๋๊ฒ ์ค์์ด์. ํค์๋ ์๋ฆผ์์ ์ด์ด์ง๋ ์ค๊ณ ๊ฑฐ๋ ์ฑํ ์ ํ์จ ์์น๊น์ง ๊ฑด๊ฐํ๊ฒ ์ ์ด์ด์ ธ์ ๋ ์๋ฏธ์๋ ๊ฒฐ๊ณผ์๋ ๊ฒ ๊ฐ์์ ๐๐ป
์ด ๊ธ์ ํตํด ํจ๊ป ์น์ดํ๊ฒ ๋ฌ๋ ธ๋ ์ฐ๋ฆฌ ํ์๋ค.. ์ ๋ฆฌ์ฒ์ฌ์ ๋ฐ์ดํฐ๊น์ง ์ ๋ณด๋ PM Suzy, ์ฐจ๋ถํ๊ฒ ์ฐ๋ฆฌ ํ์ ๋์น๋ ์์ด๋์ด์ ์ด์ ์ ์ ๋ฆฌํด ๋ฉ์ง๊ฒ ๋ด์์ฃผ๋ ํ๋ก๋ํธ ๋์์ด๋ Bada, ์ฐ์ฃผ๋ฅผ ์ฌ๋ํ๋ ๊ฑด๊ฐํ Rails ์๋ฒ ์์ง๋์ด Astro, ๋ง์ ๋ง์ง๋ง ํ์ํ ๋ง๋ง ํ๋ ์๋๋ก์ด๋ ์์ง๋์ด Reddy์๊ฒ ๊ฐ์ฌ์ ์ธ์ฌ๋ฅผ ์ ํด์๐งก