ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] - URLSession VS Alamofire
    iOS/iOS 2023. 12. 7. 18:46
    728x90
    반응형

     

    오늘은 iOS 앱개발자에겐 없어선 안될 HTTP통신 라이브러리 URLSession과 Alamofire에 대해서 알아보겠다.

    팀프로젝트를 시작하게 되면서 초반에 이 둘중에 어떤 것을 쓸지 고민을 했었다. 사실 둘다 잘 모르기 때문에 고민이랄것도 없었다.

    문제는 당장 이 둘의 차이점도 모른다는 점이고 그냥 대중픽을 선호했던 것인데, 오늘이 와서야 한번 알아보고 싶어져서 포스팅을 하게 됐다.

     

    URLSession

     

    swift에서 제공하는 HTTP 통신 네트워킹 라이브러리이다.

    비동기적 네트워크 요청처리와 HTTP 메서드지원(GET, POST, PUT, DELETE) 등을 지원한다.

    이때 든 생각은 엥? 뭐 별로 차이없는데 그럼 기본적으로 제공하는 라이브러리를 쓰는게 더 안전하고 효율적인거 아닌가? 였다.

     

    Alamofire

     

    마찬가지로 HTTP 통신 swift 기반 네트워킹 라이브러리이다.

    출처 : https://github.com/Alamofire/Alamofire

    근데 설명을 보면 간결하고 직관적으로 네트워킹 요청이 가능하다고 나와 있다. 그외의 기능으로는 

     

    - 연쇄적인 호출 및 response 메서드

    - 동시성 지원

    - URL/JSON 파라미터 인코딩

    - HTTP 리스폰스 검증

    - TLS인증서 및 공개키

     

    등이 있다고 한다. 

     

    솔직히 문서를 읽었을 때는 그렇게 큰 차이를 느끼지 못했다. 그래서 예제를 하나 작성해보기로 했다.

     

    func urlsessionTest(){
            
            
            var request = URLRequest(url: URL(string: "https://pokeapi.co/api/v2/pokemon")!)
            
            request.httpMethod = "GET"
            let queryItem = [URLQueryItem(name:"limit", value: "3")]
            request.url?.append(queryItems:queryItem)
            //https://pokeapi.co/api/v2/pokemon?limit=3
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            request.addValue("application/json", forHTTPHeaderField: "Accept"))
            
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data,let str = String(data: data, encoding:.utf8) else { return }
                print(str)
            }
            task.resume()
        }

     

    먼저 URLSession으로 작성한 코드다.

    URLRequest에 baseURL을 지정해주고 http메서드를 설정한 후 쿼리아이템을 추가했다. 거기 까지하면 요청 url은 만들어진다. 추가적으로 헤더를 추가하려면 추가하고 completionHandler로 데이터를 추출하여 실행시킨다.

    그렇게 되면 결과는 

    잘 받아오는 듯 하다.

     

    문제는 request만든 다음에 추가적인 설정이 강제된다는 것이고, 유효성 검사를 생성한 completionHandler에서 따로 해야한다는 것이다. 사실 기능 설계가 다소 복잡하고 어려울 뿐이지 문제가 있지는 않다. 

     

    Alamofire 코드를 보자

    func alamofireTest(){
            AF.request("https://pokeapi.co/api/v2/pokemon", method: .get, parameters: ["limit":3], encoding: URLEncoding.default, headers: ["Content-Type":"application/json", "Accept":"application/json"])
                .validate(statusCode: 200..<300)
                .responseString { stirng in
                    print(stirng)
                }
        }

    위에 코드랑 일치한 결과를 출력하는 코드이다. 

     

    requset에 baseUrl,http method,파라미터,헤더등을 한 파라미터로 담아서 사용한다.

    또한 유효성 검사 메서드를 지원해주며 사용하지는 않았지만 JsonDecoding,인터셉터도 제공한다.

     

    간단하게 사용할 수 있긴 하지만 프로젝트를 진행하며 코드자체는 결코 간단하지 않았다. 점차 Alamofire에 대해서 알아가며 세부적인 것들에 대해서 포스팅 해보겠다.

     

     

     

Designed by Tistory.