반응형
해당 글에서는 서버와 IOS 모바일 간의 API 통신 방법으로 URLSession, Alamofire를 이용한 통신 방법에 대해서 공유합니다.
1) URLSession, Alamofire 비교
구분 | URLSession | Alamofire |
라이브러리 설치 | 필요 없음 | 필요함 |
객체 생성 및 설정 | 번거로움 | 간편함 |
에러 처리 | 수동 처리 | 자동 처리 |
JSON 처리 | 수동 처리 | 자동 처리 |
코드 양 | 많음 | 적음 |
2) URLSession을 이용한 API 통신
💡 Swift에서는 URLSession을 이용하여 API를 호출할 수 있습니다. URLSession은 웹 서버와 데이터를 주고받는 작업을 수행하는 객체입니다.
1. URLSession 객체 생성
let session = URLSession.shared
2. URL 객체 생성
let url = URL(string: "<https://api.example.com/data>")
3. URLRequest 객체 생성
let request = URLRequest(url: url!)
4. URLSessionDataTask 객체 생성 및 실행
let task = session.dataTask(with: request) { (data, response, error) in
if let error = error {
print("Error: \\(error.localizedDescription)")
return
}
guard let data = data else {
print("No data received")
return
}
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
print(json)
} catch let error {
print("Error: \\(error.localizedDescription)")
}
}
task.resume()
2. Alamofire를 이용한 API 통신
💡 Alamofire 라이브러리를 이용하여 API를 호출할 수도 있습니다. Alamofire는 Swift에서 HTTP 네트워킹을 쉽게 처리할 수 있도록 도와주는 라이브러리이다.
1. Alamofire 라이브러리 설치
pod 'Alamofire'
2. Alamofire를 이용한 API 호출
💡 해당 라이브러리를 import 한뒤 request를 구성해 주면 됩니다.
import Alamofire
let url = "<https://api.example.com/data>"
AF.request(url, method: .get).responseJSON { response in
switch response.result {
case .success(let value):
print(value)
case .failure(let error):
print(error.localizedDescription)
}
}
3. 알라모파이어(Alamofire)을 이용한 API 통신 : Alamofire 6 이상 버전
💡에러 발생
'responseJSON(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:completionHandler:)' is deprecated: responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.
responseJSON() 메서드는 Alamofire 5 이하 버전에서 사용이 되며, Alamofire 6에서는 responseJSON이 사용 중지 되었으며, responseDecodable()를 사용을 권장하고 있습니다.
1. API 통신 구현체 구성
💡 모든 API 통신 응답값을 받을때 result, result_code, result_message 형태로 응답 값을 받을 수 있도록 처리하였습니다. 단 result의 타입은 제너릭타입으로 구성하여 서버에서 전달해 주는 다양한 형태의 타입이 들어오도록 구성하였습니다.
//
// AFDataResponse.swift
//
// Created by Lee on 2023/02/27.
//
import Foundation
/**
* API 응답 구현체 값
*/
struct AFDataResponse<T: Codable>: Codable {
// 응답 결과값
let result: T?
// 응답 코드
let result_code: Int?
// 응답 메시지
let result_message: String?
enum CodingKeys: CodingKey {
case result_code, result_message, result
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
result_code = (try? values.decode(Int.self, forKey: .result_code)) ?? nil
result_message = (try? values.decode(String.self, forKey: .result_message)) ?? nil
result = (try? values.decode(T.self, forKey: .result)) ?? nil
}
}
[ 더 알아보기 ]
💡 제너릭 타입 이란?
- Swift에서 타입 안정성을 보장하면서 유연성을 제공하는 기능입니다. 일반적으로 Swift에서 값을 다룰 때는 정적 타입 지정을 하는데, 이렇게 정적으로 타입을 지정하면 컴파일러가 타입 안정성을 보장해줍니다. 하지만, 실제 개발을 진행하다 보면 컴파일 시점에 타입을 지정하지 않고 런타임 시점에 타입을 결정해야 하는 경우가 생길 수 있습니다. 이런 경우에 제네릭 타입을 사용하면 런타임 시점에 타입을 결정할 수 있습니다.
2. result의 데이터 모델 구성
💡 result로 전달받을 데이터를 모델로 구성하였습니다. 해당 데이터 모델의 요소는 id, name으로 구성이 되었습니다.
//
// RoomModel.swift
//
// Created by Lee on 2023/02/27.
//
import Foundation
struct RoomModel : Codable{
let id: String?
let name: String?
enum CodingKeys: CodingKey {
case id, name
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = (try? values.decode(String.self, forKey: .id)) ?? nil
name = (try? values.decode(String.self, forKey: .name)) ?? nil
}
}
[ 더 알아보기 ]
💡 CodingKey 타입
- CodingKey는 Swift에서 Codable 프로토콜을 이용할 때, JSON 데이터와 Swift 객체를 매핑하기 위한 열거형입니다. 즉, JSON 데이터와 Swift 객체의 프로퍼티 이름이 서로 다른 경우, CodingKey를 이용하여 매핑을 수행할 수 있습니다. CodingKey를 구현하기 위해서는 열거형 내부에 JSON 데이터의 key와 Swift 객체의 프로퍼티 이름을 case로 정의해주어야 합니다.
3. API 호출 함수 구성
💡 AFDataResponse라는 구성한 구현체에 응답값을 RoomModel로 받는 구조로 구성하였습니다.
import Alamofire
/**
* 방 존재여부 채크 API 통신
*/
func apiSearchRoom() -> Void{
print("API로 호출을 하였습니다.")
let baseURL = APIConstants.baseURL;
// Alamofire 를 통한 API 통신
AF.request(
baseURL + "/room/295556",
method: .get,
encoding: JSONEncoding.default)
.validate(statusCode: 200..<500)
.responseDecodable(of: AFDataResponse<RoomModel>.self) { response in
switch response.result {
// [CASE] API 통신에 성공한 경우
case .success(let value):
print("성공하였습니다 :: \\(value)")
// [CASE] API 통신에 실패한 경우
case .failure(let error):
print("실패하였습니다 :: \\(error)" )
}
}
}
4. 결과 확인
오늘도 감사합니다. 😀
반응형
'Swift > 이해하기' 카테고리의 다른 글
[Swift] 화면 공유 기술 - 1 : In-App 화면 공유 (0) | 2023.03.06 |
---|---|
[Swift] SwiftUI에서 Storyboard(UIKit) 화면을 불러오는 방법 : UIViewControllerRepresentable (0) | 2023.03.06 |
[Swift] 카메라 & 음성 권한 요청 팝업: info.plist / info - Target (0) | 2023.02.23 |
[Swift] TextField의 포커싱 방법 : @FocusState (0) | 2023.02.23 |
[Swift] 페이지 이동 및 데이터 전달방법 : NavigationView, NavigationLink, @State, @Binding (0) | 2023.02.23 |