-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Team 6 iOS๐ฅ ์ญ & ์ญ์จ] MVVM ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ MainPage ๊ตฌํ #38
[Team 6 iOS๐ฅ ์ญ & ์ญ์จ] MVVM ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ MainPage ๊ตฌํ #38
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Observable ๋ ์ง์ ๊ตฌํํ์๊ณ , DTO๋ผ๊ณ ์ด๋ฆ๋ ์ง์ผ์๊ณ ๊ณ ๋ฏผ์ ํ์ ์ด ๋ง์ด ๋ณด์ด๋ค์! ๐ฏ ๐
ํผ๋๋ฐฑ ๋๋ ธ๋๋ฐ ํ์ธ ๋ถํ๋๋ฆฝ๋๋ค. ๊ณ ์ํ์
จ์ต๋๋ค~!!
} | ||
|
||
extension DishesResponseDTO { | ||
func toDomain() -> DishList { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
List
๋ผ๋ ํํ์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ํน์ํ ์๋ฏธ์
๋๋ค. ๋ฐ๋ผ์ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋์ธ List ๊ฐ ์๋๋ผ๋ฉด ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ง๋ ๊ฒ์ด ์ด๋จ๊น์?(์ค์ ์ปจํ
์ด๋๊ฐ List์ธ ๊ฒฝ์ฐ๋ผ๋ ์ปจํ
์ด๋ ์ ํ์ ์ด๋ฆ์ ๋ฃ์ง ์๋ ํธ์ด ๋ฐ๋์งํฉ๋๋ค)
ํด๋ฆฐ์ฝ๋ 2์ฅ ์๋ฏธ์๋ ์ด๋ฆ ์ค ๊ทธ๋ฆ๋ ์ ๋ณด๋ฅผ ํผํ๋ผ๋ ๊ฐ์ ๋ด์ฉ์ด๋ ์ฐธ๊ณ ํ์ ๋ ๋ฉ๋๋ค!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ค ์์ง List ํ์
์ ๋ง์ด ์ฌ์ฉํด๋ณธ ์ ์ด ์์ด์ ๊ทธ๋ฐ ์๋ฏธ๊ฐ ์์๋์ง ๋ชฐ๋๋ค์. ์๋ ค์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
ํด๋ฆฐ์ฝ๋๋ ์ฝ์ด๋ณด๊ฒ ์ต๋๋ค :)
} | ||
|
||
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | ||
return viewModels[section].items.value.count |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ๊ทผ์ด ๋๋ฌด ๊น์ต๋๋ค. ๋๋ฏธํฐ ๋ฒ์น์ ์งํค๋ฉด ๊ฒฐํฉ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฎ์ถ ์ ์์ต๋๋ค. ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ๋ง๋์ จ์ผ๋ ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ต๋ํ ํ์ฉํด๋ณด๋๊ฑด ์ด๋จ๊น์?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ต viewModelย ๋ด๋ถ์์ item count๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
|
||
import Foundation | ||
|
||
protocol FetchDishesUseCase { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DishesUseCase
๋ผ๊ณ ๋ง ํด๋ ์ถฉ๋ถํ ๊ฒ ๊ฐ์์(๋ Fetch๋ ๋์ฌ์ด๊ธฐ ๋๋ฌธ์ ์ฒ์ ๋ณผ๋ ๋๋์ด ๋ฉ์๋๊ฐ๊ธฐ๋ ํฉ๋๋ค).- protocol์ ์ข ๋ ๋ฒ์ฉ์ ์ผ๋ก ๋ง๋๋ ๊ฑด ์ด๋จ๊น์? ํ๋กํ ์ฝ์ Dishes ๊ด๋ จ๋์ด์ ์ ํ์ ์ผ๋ก ์ค๊ณํ์ ๋๋์ด ๋ญ๋๋ค. ์ข ๋ ๋ฒ์ฉ์ ์ผ๋ก ๋ง๋ค๋ฉด ์๋์
DefaultFetchDishesUseCase
์ด๋ฆ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋ ๊ฒ ๊ฐ์์. - execute์ (requestValue: FetchDishesUseCaseRequestValue)๋ ์ข ๋ ๋ฒ์ฉ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ์ ์๋๋ฆฝ๋๋ค.
- execute์ requestValue ๊ฐ request ํ๋๋ฐ ํ์ํ ๊ฐ๋ง ๊ฐ์ง๊ณ ์์ง ์๋ค์! ์ด๊ฒ๋ ์ ์ ํ๊ฒ ๋ถ๋ฆฌํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(1๋ฒ ํผ๋๋ฐฑ) ์ค UseCase๋ ๊ฐ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ๋ํ๋ด๋ ์ญํ ์ด๋ผ (์ด๊ธฐ๊ฐ ์ธํ
, ์์ดํ
์ถ๊ฐ ๋ฑ...) ๋์ฌ์ ํํ์ด ์ด๋ฆ์ ํฌํจ๋์ง ์์์ผ ํ ๊น ์๊ฐํ๋๋ฐ ์คํ๋ ค ๋ฉ์๋ ๊ฐ์ ๋๋์ ์ฃผ๋๊ตฐ์. MVVM์ด๋ ํด๋ฆฐ ์ํคํ
์ฒ ์์ ์ฝ๋๋ฅผ ๋ง์ด ๋ณด์ง ๋ชปํ์ง๋ง ์ด๋ฐ ์์ผ๋ก ๋์ฌ๋ฅผ ๋ฃ์ด ๋ค์ด๋ฐ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด๊ธด ํ๋๋ฐ, ๊ทธ๋ฆฌ ์ผ๋ฐ์ ์ธ ์ปจ๋ฒค์
์ ์๋๊ฑธ๊น์?
(2๋ฒ, 3๋ฒ ํผ๋๋ฐฑ) ์ข ๋ ๋ฒ์ฉ์ ์ผ๋ก ์์ ํด ๋ค์๋ฒ PR์ ๋ฐ์ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
(4๋ฒ ํผ๋๋ฐฑ) execute์ requestValue ๊ฐ request ํ๋๋ฐ ํ์ํ ๊ฐ๋ง ๊ฐ์ง๊ณ ์์ง ์๋ค
๋ ํผ๋๋ฐฑ์ด ํน์ FetchDishesUseCaseRequestValue
๊ตฌ์กฐ์ฒด์ ์์ฑ์ธ categorizable
์ ์ ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ทธ ๋ด๋ถ ์์ฑ์ด categorizable .name
๋ง ์ฌ์ฉํ๊ณ ์๋ ์ ์ ์ง์ ํ์ ๊ฑธ๊น์? ๋ง์ํ์ ์๋ฏธ๋ฅผ ์ ํํ ํ์
ํ์ง ๋ชปํด ๋ค์ ํ๋ฒ ์ฌ์ญ๋๋ค๐
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(4๋ฒํผ๋๋ฐฑ) ๋ค๋ค ๋ง์ต๋๋ค. ์๋ฒ์ชฝ์ผ๋ก requestํ๋๊ฑฐ๋ผ๋ฉด url์ด๋ Request๋ง ํ์ํ์ง, category ์์ฒด๊ฐ ํ์ํ ๊ฒ ๊ฐ์ง ์์์์!
๊ทธ๋ฆฌ๊ณ category๋ ๋ชจ๋ธ ๊ฐ์ฒด์ ๋๋์ด ๊ฐํ๋ฐ request ๋ฉ์๋์ ์ด์ธ๋ฆฌ์ง ์๋ค๊ณ ์๊ฐ๋์ด์์.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(4๋ฒ ํผ๋๋ฐฑ) ํ์ฌ url ๊ตฌ์กฐ๊ฐ baseURL/{{category์ ์์ฑ์ธ name}}
์ด๋ฐ ํํ๋ก ์ฌ์ฉํ๊ณ ์์ด requestValue๋ก categorizable์ ๋ด์ ๋ณด๋ด๊ณ ์์์์ต๋๋ค. (e.g. baseURL/soup
)
category ์์ฒด๋ฅผ requestํ๋ ๊ตฌ์กฐ์์ category์ name๋ง ์์ฒญํ๋ ๊ตฌ์กฐ๋ก ์์ ํด๋ณด๋ ค ํฉ๋๋ค!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(1๋ฒ ํผ๋๋ฐฑ) ์ ๋ต, ์ด๊ฑด ์ ๋ ์ด ๋ ํฌ๋ฅผ ๋ณด๋ ๊ทธ๋๋ก ๋ฌ๋ ๋ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐ๋๋ค์ฌ.
์ ๋ ๋ฉ์๋๋ ๋์ฌ๋ก ์์ํ๊ณ ํ๋กํผํฐ๋ ๋ช
์ฌ๋ก ์์ํด์ผํ๋ค๋ ์ฐจ์์์ ๋ง์๋๋ฆฐ ๊ฑด๋ฐ ์ด ์ ๋๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์์, ๋ช
์ฌ๋ก ํ๋กํผํฐ ์ด๋ฆ์ด ๋๋๊ธฐ๋ ํ๊ณ ์.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(2๋ฒ, 3๋ฒ ํผ๋๋ฐฑ) ๋ค ์ต๋ํ ๋ฒ์ฉ์ ์ผ๋ก ๋ง๋๋ ๊ฑฐ ์ถ์ฒ๋๋ฆฝ๋๋ค. ๊ทธ๋์ผ ์ protocol์ ์ฌ์ฉํ๋์ง ์๋ฟ์ผ์ค ๊ฒ ๊ฐ์์!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ค ๋ต! ๋งํฌ๋ก ๋ฌ์์ฃผ์ ๋ ํฌ๋ฅผ ๋ง์ด ์ฐธ๊ณ ํ์ฌ MVVM์ ๊ตฌํํ์์ต๋๋คใ
ใ
UseCase๋ ์ต๋ํ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉํด๋ณด๊ณ ์ด๋ค ์ ์ด ๋ฌ๋ผ์ง๋์ง ํ์ตํด๋ณด๊ฒ ์ต๋๋ค!
import Alamofire | ||
|
||
class NetworkManager { | ||
static func performRequest(urlString: String, completionHandler: @escaping (DishesResponseDTO) -> ()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- ์ด ๋ฉ์๋๋ ์ธ์คํด์ค ๋ฉ์๋๊ฐ ๋์๊น์, ์ ์ ๋ฉ์๋๊ฐ ๋์๊น์? ์ค์ํํธ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ ๋ฉ์๋๊ฐ ์ด๋ค ์ญํ ์ ๋ฉ์๋์ธ์ง ํ์ธํ๋ฉด์ ๊ณ ๋ฏผํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์์!
- ํด๋น ๋ฉ์๋๋ ์ธ์คํด์ค ๋ฉ์๋๋ก ๋ง๋์๋ฉด ํ ์คํธํ๊ธฐ์๋ ์ข์ต๋๋ค. ์์กด์ฑ ์ฃผ์ , ๊ฐ์ง ๊ฐ์ฒด ๋ฑ ๊ณต๋ถํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ๐ช
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
static์ด ํ
์คํธ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์์ ์ ๋ค์์๋๋ฐ ๊น๋นก ์๊ฐ์ ๋ชปํ๋ค์!
๋ง์ํ์ ํค์๋๋ค๋ ๊ณต๋ถํด๋๋๋ก ํ๊ฒ ์ต๋๋ค!
AF.request(urlString, method: .get) | ||
.validate(statusCode: 200..<300) | ||
.responseDecodable(of: DishesResponseDTO.self) { (response) in | ||
switch response.result { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- AF์์ ์์กด์ฑ์ด ๋๋ค์. ๋ค๋ฅธ ๊ณณ์์ ํ์ จ๋ ๊ฒ์ฒ๋ผ ์์ฑ์๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์ ํ๋ ๊ฒ ์ด๋จ๊น์?
- ๋ ์์กด์ฑ ์ฃผ์ ์ ํ์ค๋ ์์กด์ฑ ์ญ์ ์์น์ ์งํค๋๋ก protocol ํ์ ์ ๋ง๋์๋ ๊ฒ๋ ์ถ์ฒ๋๋ฆฝ๋๋ค.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alamofire๋ฅผ ์ฌ์ฉํด request ์์ฒญํ๋ ๋ถ๋ถ์ ๋ฐ๋ก protocol๋ก ๊ตฌํํด NetworkManager
๊ฐ ์ฑํํ ์ ์๋๋ก ํ๋ผ๋ ๋ง์์ด์ค๊น์?
์ ํฌ๊ฐ ํ์ต์ ํ๋ฉด์ ์ฝ๋๋ฅผ ์์ฑํ๋ค ๋ณด๋ ์ด๋ ๋ถ๋ถ์ด ๋ง์ํ์ ์์ฑ์๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
์ ๊ตฌํํ ๋ถ๋ถ์ธ์ง ์ ํํ ํ์
์ด ์๋๋ ๊ฒ ๊ฐ์ต๋๋ค๐ฅฒ ํน์ ์ด๋ค ๋ถ๋ถ์ธ์ง ์กฐ๊ธ ํํธ๋ฅผ ์ฃผ์ค ์ ์์๊น์? ๐ญ๐ญ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alamofire๋ฅผ ์ฌ์ฉํด request ์์ฒญํ๋ ๋ถ๋ถ์ ๋ฐ๋ก protocol๋ก ๊ตฌํํด NetworkManager๊ฐ ์ฑํํ ์ ์๋๋ก ํ๋ผ๋ ๋ง์์ด์ค๊น์?
=> ์ ์ง๊ธ ๋ณด๋, AF๊ฐ Networkmanager ์์ฒด์ ์ญํ ์ ํด๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ํฌ๊ฐ ํ์ต์ ํ๋ฉด์ ์ฝ๋๋ฅผ ์์ฑํ๋ค ๋ณด๋ ์ด๋ ๋ถ๋ถ์ด ๋ง์ํ์ ์์ฑ์๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์ ์ ๊ตฌํํ ๋ถ๋ถ์ธ์ง ์ ํํ ํ์ ์ด ์๋๋ ๊ฒ ๊ฐ์ต๋๋ค๐ฅฒ ํน์ ์ด๋ค ๋ถ๋ถ์ธ์ง ์กฐ๊ธ ํํธ๋ฅผ ์ฃผ์ค ์ ์์๊น์?
=> ์์๋๋ก ์์ ํ๋ฉด ๊ฐ Usecase ๊ฐ networkmanager๋ฅผ ์์ฑ์๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
๋ฐ ์์กด์ฑ ์ญ์ ์์น์ ํ๋ฉด ๋๊ฒ ๋ค์!
๊ตฌ๊ธ๋งํด์ ์ฐพ์๋ณด์
์ ใ
ใ
ใ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ด ๋ถ๋ถ์ด ์ค์ํ๊ธฐ๋ ํ๊ณ ์ ํฌ๊ฐ ํ์ต์ด ๋ง์ด ํ์ํ ๋ถ๋ถ์ธ ๊ฒ ๊ฐ์์ ํ์๊ณผ ์ข๋ ๊ผผ๊ผผํ ๊ณต๋ถํด๋ณด๊ณ ๊ทธ๋๋ ์ดํด๊ฐ ์ด๋ ค์ฐ๋ฉด ์ถ๊ฐ์ ์ผ๋ก ์ง๋ฌธ์ ๋๋ฆด ์๋ ์์ ๊ฒ ๊ฐ์์. ๋ง์ํ์ ๊ฒ์ฒ๋ผ ๊ตฌ๊ธ๋ง์ด๋ ์๋ฃ ์ฐพ์๋ณด๋ฉด์ ๊ณต๋ถํ๊ณ ์ข๋ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค!
} | ||
} | ||
|
||
func updateThumbImage(completion: @escaping (Data) -> Void) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ทฐ๊ฐ ๋คํธ์ํฌ ๋จ ์ญํ ๊น์ง ํ๋ฉด ์๋ฉ๋๋ค(๋ทฐ๋ชจ๋ธ์ ์ฌ๋ฌ๊ฐ์ง ๋ณํ์ผ์ด์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ์ฉ๋ฉ๋๋ค).
์ด ๋ถ๋ถ๋ ๋ถ๋ฆฌํด์ฃผ์ธ์. ๋ทฐ๋ฅผ ์ต๋ํ ๋ฉ์ฒญํ๊ฒ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ต ๊ธฐ์กด์ ๊ฐ์ง๊ณ ์๋ NetworkManager
๋ก ํด๋น ์ฝ๋๋ฅผ ์ฎ๊ธฐ๋ ๋ฐฉํฅ์ผ๋ก ์์ ํด๋ณด๊ฒ ์ต๋๋ค.
|
||
struct MainCategory: Categorizable { | ||
var name: String = "main" | ||
var sectionTitle: String = "๋ชจ๋๊ฐ ์ข์ํ๋ ๋ ๋ ํ ๋ฉ์ธ์๋ฆฌ" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์น์
ํ์ดํ์ ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋๊ฒ ์ข์๊น์? ๋ทฐ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋๊ฒ ์ข์๊น์?
ํ๊ธ์ด ์๋ ์ฌ๋ฌ ๋ค๊ตญ์ด๋ ์ง์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์๊ฐํด๋ด
์๋ค.
=> ์ด ๋ถ๋ถ์ ์ ์ ํ ๋ก ํด๋ด์!! ์ ๋ ํด๋น sectionTitle
๊ฐ์ด ๋ฐ๋ก ์น์
ํค๋์ ๋ฃ์์ ์๊ธฐ ๋๋ฌธ์ ๋ทฐ๋ชจ๋ธ์ด ๊ฐ์ ธ๋ ๋๋ค๊ณ ์๊ฐํ์ต๋๋ค.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ํ์ฌ ์ ํฌ ์ฝ๋๊ฐ ์น์
ํ์ดํ์ ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋ ๊ตฌ์กฐ์ธ๊ฐ์, ์๋ ๋ทฐ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋ ๊ตฌ์กฐ์ผ๊น์? (๋ฉ์ฒญํ ์ง๋ฌธ ์ฃ์กํฉ๋๋ค๐ญ)
์ ํฌ๋ผ๋ฆฌ๋ ์๊ฒฌ์ด ๊ฐ๋ ค์ ํ๋ฒ ์ฌ์ญค๋ด์.
@JacksonPk
- ๋ชจ๋ธ vs ๋ทฐ๋ชจ๋ธ: ๋ชจ๋ธ์ ์ถ์ํ๋ ๋ฐ์ดํฐ๋ง ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํด์ ์น์ ํ์ดํ์ ๋ทฐ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋ ๊ตฌ์กฐ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ํ์ฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํด์!
- ๋ค๊ตญ์ด ์ง์: ๋ค๊ตญ์ด๋ฅผ ์ถ๊ฐํ๋ค๋ฉด
categorizable
ํ๋กํ ์ฝ์ ๋ค๊ตญ์ด ๋ณ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋์ง ์์๊น ์๊ฐํฉ๋๋ค.
- ๋ชจ๋ธ vs ๋ทฐ๋ชจ๋ธ: ํ์ฌ ๋ทฐ๋ชจ๋ธ ํด๋์ ํ์ผ์ด ์๊ธด ํ์ง๋ง protocol๊ณผ struct๋ง์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ์ด ์น์ ํ์ดํ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
- ๋ค๊ตญ์ด ์ง์: ๋ทฐ๋ชจ๋ธ์ ํ์ํ ์ธ์ด๋ณ๋ก ๋ด๋ถ ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ํด๊ฒฐํ ์ ์์ง ์์๊น ์ถ์ต๋๋ค.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ํ์ฌ ์ ํฌ ์ฝ๋๊ฐ ์น์ ํ์ดํ์ ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋ ๊ตฌ์กฐ์ธ๊ฐ์, ์๋ ๋ทฐ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋ ๊ตฌ์กฐ์ผ๊น์?
๋ต, ์ ๋ ๋ทฐ๋ชจ๋ธ์ ํ๋กํผํฐ๋ก ์๋ ๋ชจ๋ธ(Category
)์ด ์น์ ํ์ดํ์ ๊ฐ๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ๋ชจ๋ธ vs ๋ทฐ๋ชจ๋ธ: ๋ค, ์ ๋ ๋ค์ ๋ณด๋ ๋ชจ๋ธ์ด ์น์ ํ์ดํ ๊ฐ ๊ทธ๋๋ก ๊ฐ์ ธ๋ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๊ธ, ์์ด, ์ผ๋ณธ์ด ๋ฑ๋ฑ ๋ชจ๋ ์ ๊ณตํด์ผ ํ๋ค๊ณ ํด๋ ๋ชจ๋ธ์ด ๊ฐ์ ธ๋ ๋ ๊ฒ ๊ฐ์์.
- ๋ค๊ตญ์ด ์ง์: ์ ๋ ๋ทฐ๋ชจ๋ธ์ด ๊ฐ ์ง์ญ์ ๋ฐ๋ผ ์น์ ํ์ดํ ๊ฐ์ ์ ์ ํ๊ฒ ์ค์ผ ํ๋ค๊ณ ์๊ฐํด์. ๋ชจ๋ธ์ด ์ฌ๋ฌ ์ธ์ด๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ๋ทฐ๋ชจ๋ธ์ด ์ทจ์ฌ์ ํํ๋ ์์ผ๋ก์. ์ ๋ ๋ทฐ๋ชจ๋ธ์ด ์ ์ ํ๊ฒ ๋ชจ๋ธ๊ฐ์ ๋ทฐ์ ๋ฃ์ด์ฃผ๋(์ ๊ณตํ๋) ์ญํ ๋ก ์ดํดํ๊ฑฐ๋ ์.
=> ๋ค ์ ์ ์๊ฐ์ด๊ณ ์ ์์ผ ๋ฟ์ด๋, ์๋ ผํ์๊ณ ์งํํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ค๊ตญ์ด ์ง์ ๋ฑ ์๊ฐํ์ง ๋ชปํ๋ ๋ถ๋ถ๋ ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค๐
}) | ||
} | ||
|
||
func fetchDishes(category: Categorizable, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
toDomain()
์ ํธ์ถํด์ DishList, Dish ๊ฐ์ฒด๋ก ๋ฐ๊พธ์
จ์ง๋ง, ๊ทธ๋๋ ์ ๊ฐ ๋ณด๊ธฐ์ networkmanager์ usecase์ ์ญํ ์ ์ฐจ์ด๊ฐ ์์ด ๋ณด์
๋๋ค! ๊ฐ ๊ฐ์ฒด์ ์ญํ ์ ๋ ๊ตฌ๋ถ์ง์ด๋ณด๋ ๊ฑด ์ด๋จ๊น์?
- ํด๋น ๋ธ๋ก๊ทธ ๊ธ ๋ณด์๋ ๊ฒ ์ ์ ๋๋ฆฝ๋๋ค.
- JK์ ํฌ์ปค์ฑ ์ฝ๋๋ ์์๋ก ์ ์๋๋ฆฝ๋๋ค!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ ํ์คํ ํ์ฌ FetchDishesUseCase
์ NetworkManager
๊ฐ ํฐ ์ฐจ์ด๊ฐ ์๋๊ฑฐ ๊ฐ๋ค์.
DishCell์ ์๋ image๋ฅผ ๋ฐ์์ค๋ ์์
์ NetworkManager
๋ก ์ฎ๊ธฐ๊ณ , ์ ๋งํฌ๋ค๋ ์ฐธ๊ณ ํ์ฌ ๊ฐ์ฒด๊ฐ ์ญํ ์ ์ข ๋ ๊ตฌ๋ถํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
override func viewDidLoad() { | ||
super.viewDidLoad() | ||
mainPageDelegate = MainPageCollectionViewDelegate() | ||
mainPageDataSource = MainPageCollectionViewDataSource() | ||
|
||
let mainViewModel = makeDishesListViewModel() | ||
let soupViewModel = makeDishesListViewModel() | ||
let sideViewModel = makeDishesListViewModel() | ||
|
||
mainViewModel.showDishList(category: MainCategory()) | ||
soupViewModel.showDishList(category: SoupCategory()) | ||
sideViewModel.showDishList(category: SideCategory()) | ||
|
||
mainPageDataSource?.viewModels = [mainViewModel, soupViewModel, sideViewModel] | ||
|
||
dishCollectionView.delegate = mainPageDelegate | ||
dishCollectionView.dataSource = mainPageDataSource | ||
|
||
bind(to: mainViewModel) | ||
bind(to: soupViewModel) | ||
bind(to: sideViewModel) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- ๋ณด์๋ฉด ์์๊ฒ ์ง๋ง ๋ชจ๋ ์ธ ๋ฒ์ฉ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ฑฐ๋ ์ธ ๋ฒ์ฉ ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์นดํ ๊ณ ๋ฆฌ๊ฐ ํ๋ ๋ ์ถ๊ฐ๋๋ฉด ๋ชจ๋ ํ๋ฒ์ฉ ๋ ์ฝ๋๋ฅผ ๋๋ ค์ค์ผ ํฉ๋๋ค. switch ๋ง ์ฌ์ฉํ์ง ์์๋ฟ, ๋ฐ๋ณต ํธ์ถ์ด ๋๊ณ ์๋๊ฑฐ์ฃ .
- ์ธ๋ฒ์ฉ ๋์ด๋๋ ์ด์ ๊ฐ endpoint ๋๋ฌธ์ด๋ผ๋ฉด endpoint๋ง ๋ฐฐ์ด๋ก ๊ฐ์ง๊ณ ์๋ ๊ฑด ์ด๋จ๊น์(์๋๋ฉด endpoint ๋ง enum์ผ๋ก ๋ง๋ค์ด๋ ๋๊ณ ์)? ๊ทธ ์ดํ์ ์ปค๋ฒ๊ฐ ๋์ง ์๋ ๊ฒ์ ๋คํ์ (ํ๋กํ ์ฝ or subclassing)์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ๋๋ค(์ปค๋ฒ๊ฐ ๋์ง ์๋ ๊ฒ์ ์๋ฅผ ๋ค์ด ๋ก์ปฌ์์ ์์ฑํ์ sectionTitle์ด ๋ ์ ์์ ๊ฒ ๊ฐ๋ค์!).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ต endPoint๊ฐ main, soup, side ์ธ๊ฐ๋ผ ์ธ๋ฒ์ฉ ๋ฐ๋ณต ํธ์ถ์ ํด์ฃผ๊ณ ์๋๋ฐ์, ๋จผ์ ViewModel
์์ฑํ๋ ๊ฒ์ endpoint ๋ฐฐ์ด๋ก ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ๊ทธํ ViewModel
์ ์ด์ฉํด loadํ๊ฑฐ๋ bindํ๋ ์์
์ ViewModel
์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋๊ฑธ๊น ์๊ฐ์ด ๋๋ค์. ์ข๋ ๊ณ ๋ฏผํ๋ฉด์ ๋ ์ข์ ๊ตฌ์กฐ๋ก ๊ณ ์น ์ ์์์ง ์๋ํด๋ณด๊ฒ ์ต๋๋ค.
init(dish: Dish) { | ||
self.name = dish.name | ||
self.description = dish.description | ||
self.imageURL = dish.imageURL | ||
self.prices = dish.prices | ||
self.badges = dish.badges | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ทฐ๋ชจ๋ธ์ด ๋จ์ํ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํ์ ๊ฐ์ฒด๋ก ๊ฐ์ ธ๋ ๋์ง ์์๊น์?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ทฐ๋ชจ๋ธ์ด ๋จ์ํ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํ์ ๊ฐ์ฒด๋ก ๊ฐ์ ธ๊ฐ๋ค
๋ ๋ง์์ด Dish
entity์ DishesListItemViewModel
๋ทฐ๋ชจ๋ธ์ด ํฐ ์ฐจ์ด๊ฐ ์์ผ๋ Dish
๋ฅผ ๋ด๋ถ ์์ฑ์ผ๋ก ํ๋ ๊ฐ์ ธ๊ฐ๋ฉด ๋๋ค๋ ์๋ฏธ์ค๊น์?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ค๋ค ๋ง์์, ์ ๊ฐ ์ดํดํ MVVM ํจํด์ ๋ทฐ๋ชจ๋ธ์ด ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์๊ณ , ๋ทฐ๋ชจ๋ธ์ด ๋ทฐ์ ์ํตํ๋์์ผ๋ก ์ดํดํ๊ฑฐ๋ ์. ๋ทฐ๋ชจ๋ธ์ด ๋์(๋ฉ์๋)๋ก ๋ทฐ์ ๋ฃ์ ๊ฐ์ ๋ชจ๋ธ๊ฐ์ ์ ์ ํ๊ฒ ์ด์ฉํด์ ๋ฃ์ด์ฃผ๋ ๊ฑฐ์ฃ .
์ง๊ธ DishesListItemViewModel
์ ๋ชจ๋ธ๊ฐ์ฒด์ธ Dish์ ์์ง ์ฐจ์ด๊ฐ ์์ง๋ง ์ฐจ์ฐจ ๋์์ด ์๊ธธ ๊ฒ ๊ฐ์์.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ๋ต ๋ฌด์จ ๋ง์์ด์ ์ง ์ดํดํ์ต๋๋ค. ๊ทธ๋ ๊ฒ ์์ ํ๊ฒ ๋๋ฉด viewModel.name
์์ viewModel.dish.name
๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์์ ์ ํด์ผํ ๊ฒ ๊ฐ์๋ฐ ๋๋ฏธํฐ ๋ฒ์น๊ณผ๋ ์ฝ๊ฐ ๋ฉ์ด์ง๋๊ฒ ์๋๊ฐ ์ถ์ง๋ง ๊ทธ๋ฆฌ ํฌ๊ฒ ํด์น๋ ๊ฒ๋ ์๋๊ฐ ์ถ๊ธด ํ๋ค์.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ๋๋ฏธํฐ ๋ฒ์น๋ ๊ณ ๋ คํด์ ๊ตฌํํ์ ๊ฑฐ๊ตฐ์. ๊ทธ๋ฌ๋ฉด view์ fill ๋ฉ์๋์์ dish๋ฅผ ์ง์ญ๋ณ์(let dish = viewModel.dish
๋ก ๋ง๋ค์ด์ ํ๋ฉด ํด๊ฒฐ๋ ๊ฒ ๊ฐ๊ตฐ์
์ค์ํ ๊ฑด ๋ทฐ - ๋ชจ๋ธ - ๋ทฐ๋ชจ๋ธ๋ฅผ ๊ตฌ๋ถ์ง์ด์ ํ๋กํผํฐ๋ ์ ํ์๋๊ฒ ๊ฐ์ต๋๋ค. ์ง๊ธ์ ๋ทฐ๋ชจ๋ธ์ด ๋ชจ๋ธ์ ์ญํ ๋ ํ๊ณ ์๋ ๊ฒ ๊ฐ์์์.
๊ผผ๊ผผํ ๋ฆฌ๋ทฐ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์์ง ํ์ธ์ ๋ชปํ ๋ถ๋ถ์ ์ ์ฌ ๋จน๊ณ ์์ ํ๋ฑ ๋ ์ฝ๋ฉํธ ๋ฌ๋๋ก ํ๊ฒ ์ต๋๋ค! ๋ง์ ํ์ธ์๐ฝ |
์ ์ด์จ, ์ ํฌ๊ฐ ์ง๋ฌธ์ด ์ ๋ง ๋ง์๋๋ฐ ์น์ ํ๊ณ ์์ธํ๊ฒ ๋ต๋ณํด์ฃผ์
์ ์ ๋ง์ ๋ง ๊ฐ์ฌ๋๋ ค์๐ฅฒ๐ ๊ธฐ๋ฅ ๊ตฌํ๊ณผ ๋์์ ํผ๋๋ฐฑ ์ฃผ์ ๋ถ๋ถ ์์ ํ๊ณ ๊ณ ๋ฏผ์ด ๋ง์ด ํ์ํ ๋ถ๋ถ์ ๋ฐ๋ชจ ํ์๋ ์๊ฐ์ ํด๋ณด๋ ค ํ๋๋ฐ ๊ด์ฐฎ์ผ์ค๊น์? ๋ค์ ํ๋ฒ ๋ฆฌ๋ทฐ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!!! |
๋ต๋ต ์๊ฐ์ด ํ์ํ ๋ถ๋ถ์ ๋ฐ๋ชจ์ดํ์ ํ์
๋ ๋ฉ๋๋ค! |
ํ์ง๋ง ๋ฐ๋ชจ์ ์ ํ๋ฒ ๋ pr ๋ ๋ฆฌ์๋๊ฑฐ ์ถ์ฒ๋๋ฆฝ๋๋ค. ์ด ๋ ๊ฐ์ง์ค์ ํ๋๋ฅผ ํํด์์.
๋ฐ๋ชจ๋ฅผ ์๋๊ณ ์ต๋ํ ๋ง์ด ๊ตฌํํด์ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ดํ๋ ๋ง์ ์ดํดํฉ๋๋ค ใ ใ ํ์ง๋ง ์์ ๋๊ฐ์ง๋ฅผ ์งํํ์๋ฉด ๋จ์ํ ๋ทฐ๋ง ๊ตฌํํ๋ ๊ฒ ๋ณด๋ค๋ ๋ ์ข์ ๊ฒฝํ์ผ ๊ฒ ๊ฐ์์์. ๋ฐ๋ชจ ๋๋๊ณ ๋ pr์ ๋ฐ์ํ ๋๊น ํธํ์ ๋๋ก ์งํํ์๋ฉด ๋ ๊ฒ ๊ฐ์์! |
๋ต ์ ์ด์จ! ์ผ๋จ ํผ๋๋ฐฑ ์ฃผ์ ๋ด์ฉ ์ค ์ค๋ ์์ ์์ ํ ์ ์๋๊ฑด ์ค๋ ์ ๋ or ๋ฐค ๋ค์ pushํ ํ ์ฝ๋ฉํธ ๋ฌ๊ฒ ์ต๋๋ค. ๋ง์ํด์ฃผ์ ๋๊ฐ์ง ์ค์ ์ฌ์ค... ๋๋ฒ์งธ๋ ๊ตฌํ์ด ๋์ด ์๋ค๊ณ ์๊ฐํ๋๋ฐ ์๋๊ฐ ๋ด
๋๋ค๐ญ๐ญ ๊ธฐ๋ฅ ๊ตฌํ์ด ๋ง์ด ๋์ง ์์ ๋ถ์ํ ๋ง์์ด ์์๋๋ฐ ์ ์ด์จ ๋ง์ ๋ฃ๊ณ ์ง์ง ์ค์ํ ๊ฒ ๋ญ์ง ๋ค์ ๊นจ๋ซ๊ฒ ๋๋๊ฑฐ ๊ฐ์์. ์ ๋ง ์ ๋ง ๊ฐ์ฌํฉ๋๋ค๐ |
Move method updateThumbImage from DishCell to NetworkManager.
โฆ into iOS/feat/view-model
์ ์ด์จ. ์ค๋ ํผ๋๋ฐฑ ์ฃผ์ ๋ด์ฉ ์ค ์์ ๊ฐ๋ฅํ ๋ถ๋ถ ๊ณ ์ณค์ต๋๋ค. ๊ณ ์น ๋ด์ฉ๊ณผ ์์ผ๋ก ๊ณ ์ณ์ผ ํ ๋ด์ฉ์ ์๋ ๋งํฌ์ ๊ธฐ๋กํด ๋์์ต๋๋ค. |
๋ต @1song2, @JacksonPk ๋, ๊ทผ๋ฌด์ค์ด๋ผ ํด๊ทผํ๊ณ ์ง๊ธ ๋ด ๋๋ค!
|
@JacksonPk ๋ต, ํ์ธํ๊ณ ๋จธ์งํ๋๋ก ํ๊ฒ ์ต๋๋ค. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๊ณ ์ํ์
จ์ต๋๋ค! ์ ํผ๋๋ฐฑ ํ๋๋ง ๋ฐ์ํ์๋ฉด ๋จธ์งํ ๊ฒ์.
์๊ณ ํ์
จ์ต๋๋ค~!! ๐๐ฏ
mainPageDelegate = MainPageCollectionViewDelegate() | ||
mainPageDataSource = MainPageCollectionViewDataSource() | ||
|
||
let categories: [Categorizable] = [MainCategory(), SoupCategory(), SideCategory()] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ๊ตฌํํ์ จ๋ค์! ๊ตฌํํ๋๊น ๋๋จธ์ง ๋ถ๋ถ์ ์์ด ์์ํ์์ฃ ? ใ ใ
private let fetchDishesUseCase: FetchDishesUseCase | ||
|
||
//MARK: - Output | ||
var category: Observable<Categorizable> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ค ๋ต ์ ํ์
จ์ด์! ๋ฐ์ฑ๋ ํ์
(Box<T>
)์๋ ?๋ฅผ ๋ถ์ด์ง ์๋๊ฒ์ ์์ง ์์ผ์๊ธธ ๋ฐ๋๋๋ค ใ
ใ
ใ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ต ๋ช ์ฌํด๋๊ฒ ์ต๋๋ค!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ต ๋ฐ์ฑ๋ ํ์ ์ non-optional !!
networkManager.updateThumbImage(imageURL: viewModel.imageURL) { imageData in | ||
DispatchQueue.main.async { | ||
self.thumbnailImageView.image = UIImage(data: imageData) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ต, ๋ทฐ์์ ๋ทฐ๋ชจ๋ธ์ ํ๋กํผํฐ๋ฅผ ๋์ง ์๋ ๊ฒ ์ํ์
จ์ต๋๋ค!!
ํ์ง๋ง ์ด๋ฏธ์ง๋ฅผ ์๋ฒ๋ก๋ถํฐ ๊ฐ์ ธ์ค๋ ์ญํ ๋ ๋ทฐ ์์์ ์ด๋ค์ง๋ฉด ์๋ฉ๋๋ค.
๋ทฐ๋ ์ค์ง ๋ ๋๋งํ๋ ์ญํ ๋ง ํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ค์๋ฒ์๋ networkManager๋ ๋นผ์
์ผ ๋ผ์~~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ํผ๋๋ฐฑ ์ฃผ์ ๋ถ๋ถ์ ์์ ํ ์ดํดํ์ง ๋ชปํ์๋ค์! ๋ค์๋ฒ PR ๋๋ฆฌ๊ธฐ ์ ์ ์์ ํด๋๋๋ก ํ๊ฒ ์ต๋๋ค!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ต~~
} | ||
|
||
extension DishesResponseDTO { | ||
func toDomain() -> DishSet { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ์ ๊ฐ ์ค๋ช
์ ์ ๋ชป๋๋ฆฐ๊ฒ ๊ฐ๋ค์ ใ
ใ
์ ๊ฐ ๋ง์ ๋๋ฆฐ ์๋ฃ๊ตฌ์กฐ๋ Set, List, Array, Dictionary ๋ฑ๋ฑ์ด ๋ชจ๋ ํฌํจ๋ฉ๋๋ค.
- ํด๋น ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฐ์ง์์ผ๋ฉด ์ด๋ฆ์ ์์ ์๋ฃ๊ตฌ์กฐ๋ค์ด ํฌํจ๋์ ์๋ฉ๋๋ค.
- ๋ ํด๋น ์๋ฃ๊ตฌ์กฐ๊ฐ ์ฐ์ธ๋ค๊ณ ํด์ ๋ณ์๋ช ์ dishArrs ๋ณด๋จ dishes๊ฐ ์ ์ ํฉ๋๋ค. ์๋ํ๋ฉด ์ธ์ ๋ ์๋ฃ๊ตฌ์กฐ ํ์ ์ด ๋ฐ๋์ง ๋ชจ๋ฅด๋๊น์.
=> ์ด ๋ถ๋ถ๋ง ์์ ํ์๋ฉด ๋จธ์งํ ๊ฒ์. ๋จ์ํ Dishes
๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์๋ฐ์? ์ค๋ณต๋๋๋ผ๋์.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ํ ๋ถ์ฐ์ค๋ช
์ฃผ์ ๋๋ถ์ ์์ ํ ์ดํดํ์ต๋๋ค!
ํ์ @JacksonPk ๋ Dishes
๋ก ์์ ํ๋ ๊ฒ ์ด๋ ๋๊ณ ์๊ฒฌ ์ฃผ์
จ์๋๋ฐ, ๋ด๋ถ ํ๋กํผํฐ๋ก dishes
๊ฐ ์์ด ๋๋ฌด ์ค๋ณต๋๋ ๊ฒ ๊ฐ์ ๋ง์ค์ฌ์ง๋๋ผ๊ตฌ์๐ญ ํ์ง๋ง ์ค๋ช
ํด์ฃผ์ ๋ด์ฉ ๋ค์ด๋ณด๋ DishList
๋ DishSet
๋ณด๋ค๋ Dishes
๊ฐ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!
(์ผ๋จ์ Dishes
๋ก ์์ ํ ํ ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ ์ ์์๊น๋ ๊ณ ๋ฏผํด๋ณด๊ฒ ์ต๋๋ค!)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ต๋ต, ์์ ํ ์ดํดํ์
จ๋ค๋ ๋คํ์ด๋ค์ ใ
ใ
๊ทผ๋ฐ ํด๋น ๊ฒฝ์ฐ๋ ๋ด๋ถ ํ๋กํผํฐ์ ์ค๋ณต๋์ด๋ ์ ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ํ๋ฉด ํฌ์ปค์ฑ์ ๊ฒฝ์ฐ์๋ Players๋ผ๋ ๊ฐ์ฒด๊ฐ players ๋ฐฐ์ด์ ํ๋กํผํฐ๋ฅผ ๊ทธ๋๋ก ๊ฐ๊ณ ๋์(๋ฉ์๋)์ ์ถ์ํํ๊ธฐ ๋๋ฌธ์ด์ฃ .
๋ค๋ง ํด๋์ค(๋๋ ๊ตฌ์กฐ์ฒด)๋ก ์ถ์ํํ์์๋ ๋์(๋ฉ์๋)๊ฐ ์๋ ๊ฒ๋ค์ ์ถ์ํ๊ฐ ํ์์๋ ๊ฒ๋ค์ด๋ ์ญ์ ํ์
๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค!
์ ์ด์จ, |
์ค ๋ต ํผ๋๋ฐฑ ๋ฐ์ ๊ฐ์ฌํฉ๋๋ค! ๐ |
๊ฐ์ฌํฉ๋๋ค, ์ ์ด์จ ๊ทธ๋ฆฌ๊ณ ์ญ! ๋ชจ๋์๊ฒ ์ฑ์ฅํ๋ ์๊ฐ์ด ๋์ด์ ์ข์ ๋ ์ ๋๋ค. ์ข์ ๋ฐค ๋์ธ์!! |
-Detail ์ ๋ณด๋ฅผ ๋ณด๋ ๋ก์ง ๊ตฌํ -์ ๊ณต๋ API์ ๋ง์ถ์ด Detail ์ ๋ณด์ hash์ data property๋ฅผ ์ถ๋ ฅํ๊ณ -data property์ ์ ๋ฌ๋๋ ๊ฐ์ ์ถ๋ ฅํ๋๋ก ๊ตฌํ
-Detail ์ ๋ณด๋ฅผ ๋ณด๋ ๋ก์ง ๊ตฌํ -์ ๊ณต๋ API์ ๋ง์ถ์ด Detail ์ ๋ณด์ hash์ data property๋ฅผ ์ถ๋ ฅํ๊ณ -data property์ ์ ๋ฌ๋๋ ๊ฐ์ ์ถ๋ ฅํ๋๋ก ๊ตฌํ
* Chore. Category ์ปดํฌ๋ํธ ์์ฑ * Feat. Category UI #4 * Style. Add Header Styled Component #18 * Style. Head style and react icon ์ถ๊ฐ #18 * Feat. delivery ์์ ์ค #9 * Style: Category style #4 * Feat. hover & badge ์๋ฃ * Style: Category UI #4 * Feat. ์ด๊ธฐ๋ฐ์ดํฐ fetch ์์ฒญ -Fetch custom Hook ์์ฑ -์ด๊ธฐ๋ฐ์ดํฐ: ๋ฉ์ธ๋ฉ๋ด, ์นดํ ๊ณ ๋ฆฌ1๋ฒ * Feat. tabClick ํจ๊ณผ ๊ตฌํ #33, MainMenu Fetch #3 * Style. categorySlide 1์ค ๋์ด. #4 * Chore. ๋๋ณด๊ธฐ ๋ฒํผ ๊ตฌํ์์ #5 * Feat. ์์ธํ์ด์ง ํผ ๊ตฌํ - ๋ฐฐ๊ฒฝ์์ค์ /์์ธํ์ด์ง ์์น ๊ฐ์ด๋ฐ๋ก ์ค์ /x๋ฒํผ๊ตฌํ - x๋ฒํผ ํด๋ฆญ ์ ๊ธฐ์กด ํ์ด์ง๋ก ๋ณด์ฌ์ค #36 * Chore. ๋ถํ์ํ ์ฝ๋, ํ์ผ ์ ์ธํ์ฌ prํ๊ธฐ * Feat: toggle button #5 * Feat. ์์ธ๋ฐ์ดํฐ fetch ๋ฐ์์ด #38 * Feat: loading ์ค์ loading ์ด๋ฏธ์ง ์ฝ์ #5 * Fix: ํธ๋ฒ ์ด๋ฏธ์ง์ margin ์ ์ฉ ์ ๊ฑฐ #4 * Style: cursor and category title * Feat. ๋ฐฐํฌAPI์ฃผ์๋ก ๋ณ๊ฒฝ (CATEGORY์ ์ธ) * Fix. REACT WARNING ์์ : HEADER styled-components ์ ์ธ ์์น ์์ * Feat: env ํ์ผ์ url ๋ฃ๊ธฐ * Chore: fetch ๋์ axios ์ด์ฉ * Fix: fetch error ์์๋ก ๊ณ ์นจ - detail ์ปดํฌ๋ํธ์์ ์ฒ์์ fetch ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํจํ url๋ก ์ฃผ์ด์ ์๋ฌ๊ฐ ๋์ค์ง ์๊ฒ ํ๋ค. * Fix: fetch error fix - fetch hook ์ null ์ด ๋ค์ด์ค๋ฉด fetch ๋ฅผ ํ์ง ์๊ฒ ํด์ ์ฒ์๋๋๋ง ๋ ๋ fetch ํ์ง ์๊ฒ ํ์ - ๋๋ณด๊ธฐ ํด๋ฆญ ์ฐ์์ผ๋กํ๋ฉด ๋ํ๋๋ warning Warning: Can't perform a React state update on an unmounted component. -> useEffect์ ํด๋ฆฐํจ์๋ก ์ํ๊ฐ ์ด๊ธฐํ ์์ผ์ค์ ํด๊ฒฐ * Fix: loading ํ๋ฉด ๋์ฐ๊ฒ ํ๊ธฐ * Feat: Error handling - useFetch ์์์ error ์ฒ๋ฆฌ * Fix: FeedBack ๋ฐ์ - component ๋ช ์นญ ํต์ผ * Fix: Feedback ๋ฐ์ - ModalMode => modalMode * Feat: add Modal component * Feat: loading gif MainMenu * Feat: error component * Chore. ๋ณต๊ตฌ * Chore. error ์์ * Feat. portal์ฌ์ฉ-> modalError ์์ * Fix: header hover ์๋ฌ ๊ณ ์นจ * Feat: stock 0 ์ผ์ ๋ฒํผ disable * Refactor: OrderBtn * Feat. ์๋ onChange ์์ ์ค * Chore. PRICEE + STOCK ๊ด๋ฆฌ ์ถ๊ฐ MERGING * Feat. ์์ธํ์ด์ง ์ด๋ฏธ์งํด๋ฆญ์ ๋ํ์ด๋ฏธ์ง ๋ณ๊ฒฝ * Feat. error ์ปดํฌ๋ํธ์์ฑ * Feat. errorPage์์ ๋ฉ์ธํ์ผ๋ก ์ด๋ * Chore. rebase FE * Chore. rebase 2/13 * Chore : .gitignore ํ์ผ ์์ฑ * Chore : ํ๋ก์ ํธ ํด๋์ธ BE ํด๋ ์์ .gitignore ํ์ผ ์์ฑ * Chore : side dish ์คํ๋ง ๋ถํธ๋ฅผ ์ด์ฉํ gradle ํ๋ก์ ํธ ์์ฑ * Feat : jdbc๋ฅผ ์ด์ฉํ mysql ์ฐ๊ฒฐ์ ์ํด application.properties ์ค์ * Feat : side dish ํ๋ก์ ํธ์ schema.sql ํ์ผ ์์ฑ * Chore: .gitignore ์ถ๊ฐ * Feat: dish ๊ด๋ จ ํด๋์ค์ ๋ ํฌ์งํ ๋ฆฌ ์์ฑ ๊ธฐ๋ณธ ํ๋ก์ ํธ ๊ณจ๊ฒฉ์ ์ก๊ธฐ ์ํด Dish, DishController, DishRepository, DishService, BestDishResponseDTO์ ํ ์์ฑ * Feat: badge ๊ด๋ จ ํด๋์ค์ ๋ ํฌ์งํ ๋ฆฌ ์์ฑ ๊ธฐ๋ณธ ํ๋ก์ ํธ ๊ณจ๊ฒฉ์ ์ก๊ธฐ ์ํด Badge, BadgeRepository ์์ฑ * Delete BE directory * Delete .gitignore * Chore. merging(error+oath) * Feat. useFetch method์ ๋ฌ๋ฐฉ์ ๋ณ๊ฒฝ - Ooath ์ธ์ฆ์ฝ๋ 8080 ํฌํธ๋ก post์์ฒญ -cors blocked * Feat. ์บ๋ฌ์ ์์ธํ์ด์ง ์ ์ฉ * Feat. DetailPage ๋ฏธ๋์บ๋ฌ์ ๊ตฌํ ์ค * Feat. ์ฌ๊ณ ์ฃผ๋ฌธapi์์ฒญ๋ณด๋, but์คํจ * Style : detailpage * - * Feat. LOGIN ์์ฒญ์ค * Chore. ๋ก๊ทธ์ธ ์์ ๊ตฌํ์ค * Feat. ์ฌ๊ณ ์๋ DB ์ ๋๊ฐ๋ฅ, (์๋ก๊ณ ์นจ์๋ง) * Fix: error * Feat. Login๊ตฌํ -atomic componentํ * Feat. ๋ฐ์ ํ ํฐ์ผ๋ก ๋ค์ get์์ฒญ -> ๋ก๊ทธ์ธ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ ๊ตฌํ * Refactor . ํ๋ผ๋ฏธํฐ ๋ถํดํ ๋น * Chore. ๋ถํ์ํ constantํ์ผ ์ญ์ * Feat.๋ก๊ทธ์์ api ์์ฒญ * Update README.md * Chore. igonore์ค์ * Chore. * Chore. ๋๋์ง์๋ merge * Feat. ๋ฒ์ฉ์ฑ์๋ Carousel์ ์ ์ญ ํด๋๋ง. -๊ธฐํ ์ค๋ณต ํ์ผ ์ญ์ Co-authored-by: eamon3481 <68339352+eamon3481@users.noreply.github.com> Co-authored-by: jeong-inho <derosatam76@gmail.com> Co-authored-by: Jeong InHo <63284310+eNoLJ@users.noreply.github.com>
์์ ๋ชฉ๋ก
Domain
(Entity, UseCase),Prsentation
(ViewModel, View) ๊ตฌํ.ํ์ต ํค์๋
CollectionViewFlowLayout
,CocoaPods
,Alamofire
,Toaster
,MVVM
,UICollectionReusableView
๊ณ ๋ฏผ๊ณผ ํด๊ฒฐ
OCP
(Open-Closed Principle)๋ฅผ ์ ์ฉํด ๋ณด์์ต๋๋ค.