[내일배움캠프 33일차] Ch.3 앱 개발 숙련3

NH·2025년 4월 16일

내일배움캠프

목록 보기
33/62
post-thumbnail

📱 앱 개발 숙련 강의

🌤️ 날씨 앱 개발 (1/2)

  • URLSession 사용하여 API 서버의 값을 가져와 UI에 값을 업데이트 하는 방법 공부
    • API 문서를 보고 사용할 데이터를 구조체로 구현
    • Codable 프로토콜을 채택하여 JSON 데이터를 디코딩 하여 사용
    • URLSession을 사용하여 API 서버에 데이터 요청 및 날씨 정보를 UI에 업데이트

🔹 1. Codable & CodingKeys

  • 서버에서 받아온 JSON 데이터를 Swift 구조체로 디코딩할 때 Codable을 채택한다.
  • JSON 키와 Swift 프로퍼티 이름이 다를 경우 CodingKeys 열거형을 통해 매핑 가능하다.
struct WeatherMain: Codable {
    let temp: Double
    let tempMin: Double
    let tempMax: Double

    enum CodingKeys: String, CodingKey {
        case temp
        case tempMin = "temp_min"
        case tempMax = "temp_max"
    }
}

🔹 2. URLSession을 사용한 네트워크 요청

  • 서버 데이터를 받아오기 위한 기본적인 비동기 처리 방식은 URLSession.
  • 응답 코드가 200~299인 경우만 성공 처리하고, 데이터를 Decodable로 디코딩해서 클로저로 전달.
private func fetchData<T: Decodable>(url: URL, completion: @escaping (T?) -> Void) {
    let session = URLSession(configuration: .default)
    session.dataTask(with: url) { data, response, error in
        guard let data, error == nil else {
            completion(nil)
            return
        }
        guard let response = response as? HTTPURLResponse, (200..<300).contains(response.statusCode),
              let decodedData = try? JSONDecoder().decode(T.self, from: data) else {
            completion(nil)
            return
        }
        completion(decodedData)
    }.resume()
}

🔹 3. [weak self]의 의미와 사용 이유

  • 클로저 안에서 self를 참조하면 순환 참조(Circular Reference)가 생길 수 있다.
  • 이를 방지하기 위해 [weak self]를 사용하고, 클로저 내부에서는 guard let self = self else { return }로 안전하게 언래핑한다.
fetchData(url: url) { [weak self] (result: CurrentWeatherResult?) in
    guard let self, let result else { return }

    DispatchQueue.main.async {
        self.tempLabel.text = "\(Int(result.main.temp))℃"
        ...
    }
}

🔹 4. 축약 문법

  • Swift 5.7 이후로 도입된 축약 문법

원래 문법

guard let self = self, let result = result else {
    return
}

축약 문법 사용

guard let self, let result else { return } 
  • self = self → weak self로 캡처된 self가 여전히 살아있는지 확인
  • result = result → 옵셔널인 result가 실제 값인지 확인
  • 두 조건 중 하나라도 실패하면 else 블록이 실행됨 (여기선 그냥 return)

🔹 4. 클로저에서 매개변수 이름 생략 가능

  • 클로저를 함수에 전달할 때, 매개변수 이름(completion:)은 생략하고 바로 클로저만 전달 가능.
  • 그래서 아래처럼 쓸 수 있다:

원래 문법

fetchData(url: url, completion: { (result: CurrentWeatherResult?) in
   ...
})

트레일링 클로저 사용!

fetchData(url: url) { result in 
   ...
}

🔹 5. UI 업데이트는 반드시 메인 스레드에서!

  • 이번 실습에서는 API 서버에서 JSON 데이터를 받아와서 UI에 값을 업데이트 하는 방법을 공부했다.
  • URLSession은 백그라운드 스레드에서 실행된다.
  • iOS에서는 UI 업데이트는 반드시 메인 스레드에서 실행 되어야된다.(안그러면 크래시 발생!)
  • 따라서 DispatchQueue.main.async {} 블록을 사용하여 메인 스레드에서 처리되도록 해야된다!

🔹 오늘 실습 결과물

  • 서울의 현재 온도를 가져옴!
  • 최저, 최고 온도 데이터도 API 서버의 데이터를 가져옴!!

✍️ 느낀 점

  • 오늘은 URLSession 을 사용하여 네트워크 처리를 하는 법과 클로저 내부에서의 self 사용, 그리고 Codable의 활용까지 iOS 개발의 핵심적인 개념을 실전 코드와 함께 학습했다.
  • weak selfguard let self의 의미를 이해하면서 메모리 관리에 대한 감도 익혔다.
  • 실제 데이터를 다루며 UI 업데이트까지 연결하니까 비로소 앱이 완성되는 느낌이 들었다!

profile
iOS 개발 블로그

0개의 댓글