iOS 개발을 하다 보면 이 네트워크 통신은 떼려야 뗄 수 없는 것 같습니다.
그저 정해진 화면만 구성하는 것을 넘어
흔히 우리가 사용하는 로그인, 실시간으로 정보를 사용자에게 보여주는 등 다양한 작업에서
사용되기에 네트워킹은 앱 개발 생태계에서 매우 중요하다고 볼 수 있습니다.
이번 글에서는 네트워크 통신 방법인
URLSession 과 Alamofire 에 대해 비교해 비교해보고
URLSession에 대한 작성법 정도 정리해 보려고 합니다!
우선 제가 생각하기에 가장 큰 차이점은
URLSession : 애플이 직접 제공하는 네이티브 API
Alamofire: 코드의 간결함과 사용 편의성을 제공하는 외부 라이브러리
인데요, 좀 더 자세히 들어가보면
URLSession의 경우
객체 생성, 에러/JSON 처리가 번거롭고 코드의 양 역시 많습니다.
그렇다고 단점만 있느냐?
그건 아닙니다.
일단 아무래도 애플이 직접 제공하고 있기에 iOS 플랫폼에서 발생할 수 있는 잠재적인 버그나 호환성 문제를 최소화할 수 있습니다.
Alamofire는 객체 생성, 에러/JSON 처리가 굉장히 편리하겠죠??
그렇다고 모든 작업에서 Alamofire를 사용하진 않고 복잡한 네트워크를 간결하게 사용하고 싶을 땐 Alamofire!
안정성과 성능을 추구하는 경우엔URLSession을 사용합니다.
사실 뭐 하나가 딱 좋다고 하기에 애매하기 때문에 프로젝트에 따라 적합한 네트워크 방식을
선택하는 것이 가장 좋은 방법인 것 같아요!
이쯤하면 서운하니 URLSession을 이용한 통신에 대해 추가적으로 알아보려고 합니다!
자 우선, 우리가 통신할 url에 대해서 작성해 줍니다.
guard let url = URL(string: "https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=1132") else {
// url 생성 실패할 경우
return
}
이 방법은 가장 쉬운 방법이겠죠?
지금이야 파라미터가 별로 없지만 파라미터가 많아지는 경우엔 파라미터 체크도 힘들고, 번거로울 것 같아요 ㅜ
그래서 저는 URLComponents() 를 활용해서 코드를 작성해주는 것을 선호합니다!
var component = URLComponents()
component.scheme = "https"
component.host = "www.dhlottery.co.kr"
component.path = "/common.do"
component.queryItems = [
URLQueryItem(name: "method", value: "getLottoNumber"),
URLQueryItem(name: "drwNo", value: "1132")
]
guard let finalURL = component.url else {
// URL 생성에 실패할 경우 에러처리
return
}
let request = URLRequest(url: finalURL, timeoutInterval: 5)
이렇게 하면 URLRequest 객체까지 한 흐름으로 쭈욱 생성할 수 있답니다!
여기서 timeoutInterval은 서버 응답을 기다릴 수 있는 최대시간입니다.
사용자에게 계속 기다리라고 하는 것 보다는 네트워크 통신이 불안정할 때 적절히 대응해주는 게 좋겠죠?
자, 다음은 URLSessionDataTask 실행입니다.
func callRequest(completionHandler: @escaping (Lotto?, NetworkError?) -> Void) {
let url = URL(string: "https://www.dhlottery.co.kr/common.do?method=getLottoNumber&drwNo=1100")!
var component = URLComponents()
component.scheme = "https"
component.host = "www.dhlottery.co.kr"
component.path = "/common.do"
component.queryItems = [
URLQueryItem(name: "method", value: "getLottoNumber"),
URLQueryItem(name: "drwNo", value: "1100")
]
let request = URLRequest(url: component.url!, timeoutInterval: 5)
URLSession.shared.dataTask(with: request) { data, response, error in
DispatchQueue.main.async {
if let error = error {
print("Request failed: \(error)")
completionHandler(nil, .failedRequest)
return
}
guard let data = data else {
print("No data returned")
completionHandler(nil, .invalidData)
return
}
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
print("Invalid response")
completionHandler(nil, .invalidResponsec)
return
}
do {
let result = try JSONDecoder().decode(Lotto.self, from: data)
print("Success")
print(result)
completionHandler(result, nil)
} catch {
print("Decoding error: \(error)")
completionHandler(nil, .noData)
}
}
}.resume()
}
위와 같이 작성해주면 네트워크 통신이 잘 될거랍니다~
사실 정확하기만 하다면 에러처리 코드가 없어도 동작이 되겠지만!!!
항상 그럴수만은 없다는 거 아시죠..??
저는 guard문, try와 do-catch를 사용하여 오류를 처리했고,
JSONDecoder클래스와, .decode 메서드를 사용하여 데이터를 받아와줬습니다!
이 글을 쓰기 전에 많은 사람들의 글을 봤는데
URLSessioin.shared와 URLSessionDataTask 에 대한 객체를 만들어서 사용하시더라고요!! (참고)
이렇게 보면 정말 별거 아닌 것 같은데..
이해하고 잘 사용하게 되는데 꽤 시간이 걸렸던 것 같습니다 😂
항상 처음은 어려워요..
다들 화이팅하시고 그럼
.
.
.
.
'Swift' 카테고리의 다른 글
[iOS] About 싱글턴 패턴 (0) | 2024.06.29 |
---|---|
[iOS] About Router pattern (0) | 2024.06.27 |
[iOS] About Alamofire (0) | 2024.06.23 |
[iOS] About URLSession - 2 (0) | 2024.06.19 |
[iOS] About App SandBox (0) | 2024.05.20 |