📱 앱 개발 숙련 강의
🌤️ 날씨 앱 개발 (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. 축약 문법
원래 문법
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 self와 guard let self의 의미를 이해하면서 메모리 관리에 대한 감도 익혔다.
- 실제 데이터를 다루며 UI 업데이트까지 연결하니까 비로소 앱이 완성되는 느낌이 들었다!