---
# System prepended metadata

title: Untitled

---

@lina0322

엘림 안녕하세요!
Step1 PR을 보냅니다!!

저희가 날씨요청을 받아오기 위한 APIKey를 APIKey.plist 파일에 저장해두었습니다.
근데 레포에는 올리지 않았기 때문에 저희가 보내드리는 APIKey.plist 파일을 `/WeatherForecast/WeatherForecast/` 에 옮겨두시면 아마 잘 작동될 것 같습니다!

리뷰 잘 부탁드립니다 감사합니다 :)

## 궁금증/고민

### 1. 에러 처리
아직 에러 처리를 어떻게 해야할지 어렵습니다. 예를 들어 WeatherForecastRoute.swift의 APIKey 연산 프로퍼티의 경우 파일이 없을 때와 키가 없을 때 에러 처리를 해야하는데 사용자에게도 알려줘야할지 개발자만 알 수 있도록 하면 될지 고민입니다.

- 만약 사용자에게 알려야 한다면 Alert같은 것을 띄워줘야할 것 같다고 생각했습니다. 
근데 그럴 경우 Alert를 만들어서 ViewController에서 present()해야하는데, 이를 어떻게 ViewController에게 전달할지가 의문입니다. 혹시 delegate 패턴을 써서 WeatherForecastRoute가 ViewController를 delegate으로 지니고 있는게 좋을지 아니면 NotificationCenter 등을 활용해야하는 것인지, 그것도 아니라면 APIKey를 받아오는 로직을 ViewController에서 구현해야할지 등이 어렵습니다. 현재는 APIKey를 못 받아오면 nil을 리턴해서 요청에 실패하는 식으로 처리하고 있습니다.

```swift
private static var apiKey: String? {
    guard let filePath = Bundle.main.path(forResource: APIKey.fileName,
                                          ofType: APIKey.fileExtension)
    else {
        return nil
    }

    let plist = NSDictionary(contentsOfFile: filePath)

    guard let key = plist?.object(forKey: APIKey.fileName) as? String else {
        return nil
    }
    return key
}
```

- 만약 사용자에게 알리지 않는 에러의 경우 어떻게 처리하면 좋을지도 궁금합니다.
  보통 print()문으로 에러를 출력해서 확인하곤 했는데 코드에 print()문을 남기면 좋지 않다고 들었습니다. 그렇다면 예를 들어 다음과 같은 경우 catch 블럭에 무엇을 써줘야할지 궁금합니다.
  지금 생각으로는 그냥 무시하거나 사용자에게 알리는 방법 등이 떠오르는데 더 좋은 방법은 없는지 엘림의 조언을 부탁드립니다!

```swift
do {
   try throwingFunction()
} catch {
   // 이 부분의 처리가 궁금합니다
}
```

### 2. Network 타입의 재사용성
재사용성을 위해 최대한 Network 타입의 역할을 분리해봤습니다.
현재 header, bodyParameters, queryItems을 모두 개별 매개변수로 받고 있는데 이 항목들은 하나의 타입으로 합쳐서 관리하도록 리팩토링할 예정입니다.
현재 구조가 괜찮은지 혹은 어떻게 개선하면 좋을지 조언 부탁드립니다.

### 3. Model타입에서 어떤 프로퍼티를 옵셔널로 둘지
Current 날씨랑 FiveDay 날씨의 데이터를 받아올 때 일부 프로퍼티에 위도/경도에 따라 없는 것을 발견했습니다. 어떤 프로퍼티가 생략되어있을지 몰라서 저희가 임의로 옵셔널임을 확인한 프로퍼티들만 옵셔널로 설정해두었습니다. 이처럼 json의 데이터 중 어느 값이 없을지 모르는 경우 지금과 같은 방식이 괜찮은지 아니면 프로퍼티들을 모두 옵셔널로 둬야할지, 그것도 아니라면 더 좋은 방법은 없는지 궁금합니다!
