본문 바로가기
Swift

[iOS] About URLSession - 1

by dsungc 2024. 6. 12.

iOS 개발을 하다 보면 이 네트워크 통신은 떼려야 뗄 수 없는 것 같습니다.

그저 정해진 화면만 구성하는 것을 넘어

흔히 우리가 사용하는 로그인, 실시간으로 정보를 사용자에게 보여주는 등 다양한 작업에서 

사용되기에 네트워킹은 앱 개발 생태계에서 매우 중요하다고 볼 수 있습니다.

 

이번 글에서는 네트워크 통신 방법인

URLSessionAlamofire 에 대해 비교해 비교해보고

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