---
# System prepended metadata

title: Untitled

---

안녕하세요 웨더! 드디어 첫 pr을 보내게되었습니다 🙌
PR보내는건 느릴지언정 확실히 알고 넘어가야하는 중요한 부분이라 느껴서 공부하는시간을 많이 가졌습니다. 
부족한 부분이 많지만 조언 아끼지말고 팍팍 달아주시면 감사합니다!


## 🤔 고민했던 점

- 서버 API 문서의 데이터 형식을 고려하여 모델 타입을 구현할 때, 서버API에서 요구하는 타입과 일치시켜주지 않아 계속 오류가 발생하였습니다.
    - `GET:Application HealthChekcer`, `GET:상품리스트조회` ,`GET상품 상세 조회` 에서 각각 요구하는 프로퍼티의 타입이 모두 달라서 발생했던 문제였고, 나중엔 해당 부분을 보완하여 구현했을 때 문제가 없었습니다. 

- 통신해야할 네트워킹요소가 3가지이며, 디코딩해야하는 요소는 2가지 였습니다. 따라서, 너무 많은 중복코드가 발생했고 이를 보완하려고 고민했습니다.
    - 메타타입 & 제네릭함수를 공부했고 이를 활용하여 해결하였습니다. 제네릭함수를 활용하였기에 추 후 Step에서 추가적으로 네트워킹&디코딩 할 요소들을 추가되더라도 하나의 함수로 대응이 가능하도록 구현 하였습니다. 

- Result Type
    - completionHandler로 값을 받아올때 에러처리를 어떤식으로 해줄까 고민하다가 Result Type이란것을 알게되어 Result Type으로 에러 처리를 해주었습니다.

- Step 1-3 패스
    - 1-3까지 구현할 시간이 없었습니다.. 1-3은 도전과제 느낌이라서 일단 필수구현인 1-2까지 마치고 뒤에 STEP2 진행할때 널널해지면 그때 진행해보겠습니다!


## 🙏 조언을 얻고 싶은 부분

- 디코딩한데이터 인스턴스에 담아서 출력하는 방법
    - completionHandler로 전달받은데이터를 인스턴스에 담아서 출력하는 코드를 작성했는데 출력이 되지 않았습니다. 추측컨데 데이터를 dataTask로 가져오기도전에 인스턴스가 호출이 되기때문이라고 봅니다. 그래서 DispatchGroup으로 구현을 해보았는데 
```swift
DispatchQueue.global().async(group: group) {
    self.getProductDetailData(productNumber: "31")
}

group.notify(queue: .global()) {
    guard let detailProduct = self.detailProduct else { return }
    print(detailProduct)
}
```
이것도 값이 나타나지않았습니다.. 
값을 요청하고 핸들러로 값이 들어오기도전에 group.norify를 실행하는것같습니다. 

이러한 고민을 하게 된 계기는 이렇습니다.
STEP2에 컬렉션뷰를 구현할때 아이템마다 인스턴스의 값을 전달해주어야하는데
인스턴스에 담긴 값을 indexPath로 준다고 설계했을때 인스턴스에 값이 제대로 담겨있어야 전달이 가능할것이란 생각이 들었습니다.

어떻게하면 인스턴스에 값을 고스란히 담아서 인스턴스의 값을 출력할수있을지 관련된 키워드나 조언을 얻고 싶습니다!


```swift!
private func settingSegmentedControll() {
        segmentedControl.setWidth(view.bounds.width/4, forSegmentAt: 0)
        segmentedControl.setWidth(view.bounds.width/4, forSegmentAt: 1)
        segmentedControl.layer.borderColor = UIColor.systemBlue.cgColor
        segmentedControl.layer.borderWidth = CGFloat(2)
        segmentedControl.selectedSegmentTintColor = UIColor.systemBlue
        segmentedControl.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0)
        segmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: UIControl.State.selected)
        segmentedControl.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.systemBlue], for: UIControl.State.normal)
    }
```