티스토리 뷰

iOS/Swift

[iOS/Swift] Alamofire 알아보기

Neoguri🦝 2023. 7. 23. 22:32

안녕하세요? 너구리입니다.

swift에서 network부분을 계속 다루고 있는데

이번에는 Alamofire를 알아보겠습니다.

 

alamofire는 urlsession기반으로 되어 있는데

urlsession을 모르시는 분은 여기 를 보고 와주세요!!

 

 

Alamofire란?

Alamofire is an HTTP networking library written in Swift.

공식문서에는 "swift로 작성된 http 네트워킹 라이브러리" 라고 되어 있습니다.

즉, 네트워킹 작업을 쉽게 작업할 수 있도록 도와줍니다.

 

alamofire는 다음과 같은 특징이 있습니다.

이러한 특징을 가지고 여러가지 기능을 제공하다보니

많은 곳에서 alamofire를 사용하고 있습니다.

 

말만하면 입이 아프니 바로 사용해보죠.

 

Alamofire 사용해보기

예제는 이전에 url session을 설명한 글에서 쓰인 내용입니다.

alamofire를 사용하는 방법은 이렇습니다.

 

1. url, header설정

2. request 만들기

3. response 다루기 

 

모든 과정을 확인할 수 없으니 간단한 방법으로 보겠습니다.

단, alamofire가 설치되어있다는 가정하에 진행할게요.

 

1. url, header 설정

url 설정을 먼저 해보겠습니다.

저번 포스팅에서 사용한 url을 이용해서 만들어보겠습니다.

guard let url = URL(string: "https://neogurios.tistory.com/46?neoguri=yummy") else { return }

 

단, alamofire에서 request를 만들 때 url 타입은 URLConvertible인데

이부분은 아래 분석 내용에서 확인해 보겠습니다.

 

그다음 header를 설정해 볼게요.

alamofire에서는 

header로 사용할 수 있도록 HTTPHeader타입을 제공하고

이것을 배열 형태로 담을 수 있는 HTTPHeaders 타입도 제공합니다.

이걸 이용해서 header도 설정해보겠습니다.

 let headers: HTTPHeaders = [
 	// 방법 1
    HTTPHeader(name: "Content-Type", value: "application/json")
    // 방법 2
    "Content-Type": "application/json"
 ]

편하신 방법대로 설정하면 됩니다.

다만 예제에서는 header를 사용하지 않아서 제외하겠습니다.

 

 

2. Request 만들기

위의 정보로 request를 만들어 보겠습니다.

request를 만드는 과정은 어렵지 않습니다.

바로 함수 하나만 사용하면 되거든요.

 AF.request(url,
           method: .get,
           parameters: nil,
           encoding: URLEncoding.default,
           headers: nil)

 

method: HTTP method 입니다

parameter: Encodable 타입입니다.

encoding: parameter를 인코딩

headers: HTTP Header 영역입니다.

 

request를 만들었으니

response가 연결해서 값을 받아봐야겠죠?

 

response를 다루어볼게요!

 

3. Response다루기

request에 바로 response 메소드를 붙여서 사용할 수 있는데

사용해보기 전에 validation() 이라는 메소드를 연결할 수 있습니다.

 

validation은 말 그대로 들어오는 값을 "확인" 해주는 메소드인데

제가 원하는 결과값만 받을 수 있도록 설정할 수 있어요!

이것들을 사용하면서

제일 기본적인 response 메소드를 붙이겠습니다.

// 수동 validation
AF.request(url,
                  method: .get,
                  parameters: nil,
                  encoding: URLEncoding.default,
                  headers: nil)
        .validate(statusCode: 200..<300)
        .validate(contentType: ["application/json"])
        .response { response in
            print(response)
        }
 
// 자동 validation
// 헤더에 넣은 contentType과 statusCode를 자동으로 필터링 해줌
 AF.request(url,
                  method: .get,
                  parameters: nil,
                  encoding: URLEncoding.default,
                  headers: nil)
        .validate()
        .response { response in
            print(response)
        }

 

그래서 전체 코드를 정리해보면

guard let url = URL(string: "https://neogurios.tistory.com/46?neoguri=yummy") else { return }
let headers: HTTPHeaders = [
    "Content-Type": "application/json"
]
AF.request(url,
          method: .get,
          parameters: nil,
          encoding: URLEncoding.default,
          headers: nil)
.validate()
.response { response in
    print(response)
}

이렇게 간단히 사용할 수 있습니다.

 

 

 

Alamofire 분석해보기

alamofire가 어떤 구조로 되어있는지 살펴보도록 할게요!

 

1. url, header

위에서 말씀드린것처럼 request에서 사용하는 url은 URLConvertible이라는 타입을 사용합니다.

URLConvertible을 확인해 보면 

protocol로 정의되어있고

URL이 URLConvertible 프로토콜을 채택하고 있는것을 볼 수 있어요!

그래서 reqeust의 url인자 값에 URL타입을 넣을 수 있었습니다.

 

그리고 사진에는 없지만 String, URLComponent도 URLConvertible을 채택하고 있습니다.

 

HTTPHeaders 타입도 확인해보겠습니다.

HTTPHeaders의 headers는 HTTPHeader의 배열 형태로 되어있고

HTTPHeader는 name과 value로 이루어진 구조체인것을 확인할 수 있습니다.

 

HTTPHeaders의 init메소드를 보면 예제에서 dictionary형태로 넣어도 자동으로 HTTPHeader의 형태로 담아서

넣어주는것을 볼 수 있어요

 

HTTPHeaders의 내부 메소드를 보면 값을 추가하거나 제거할 때 

update 함수가 모든 작업을 처리하는것을 볼 수 있습니다.

update 함수는 headers에 중복된 key값이 있을 경우 value를 업데이트 해주고

없을 경우 해당 항목을 추가해 주는 것을 알 수 있어요!

 

 

2. Request

이제 request를 살펴보겠습니다.

request 함수는 DataRequest 타입을 리턴하고 있고

RequestConvertible이라는 인스턴스를 만들어서

request 함수에 인자로 담고 있습니다.

 

request 함수를 보면 dataRequest인스턴스를 만들어 return 하네요!

그리고 리턴하기 전에 perform이라는 함수를 실행시키네요!

확인해 보겠습니다.

 

저희가 예제로 사용한 request는 DataRequest를 사용하니까

performDataRequest를 사용할거에요

performDataRequest함수를 살펴보면 queue를 계속 전달하고 있고,

performSetupOperation을 호출하고 있습니다.

 

이 함수도 살펴볼게요!

이 함수에서는 URLRequest를 작업합니다.

URLRequest를 생성하고 request가 취소되지 않았다면

adaptor를 체크하고 nil이면 didCreateURLRequest를 통해 URLRequest를 생성합니다.

여기서 adaptor는 보통 토큰 인증을 할때 사용하는데 여기서는 생략하고 추후에 포스팅할게요!

 

didCreateURLRequest함수도 확인해 볼게요!

didCreateURLRequest함수에서는 드디어 저희가 URLSession에서 보았던 함수들이 나오네요.

전달된 urlRequest를 통해 task를 만들고 updateStatesForTask함수로 전달합니다.

updateStatesForTask 함수에서는 

request의 상태에 다른 함수를 실행하는데 

resumed가 나왔을때 전달된 task가 .resume(), 실행됩니다.!!

URLSession 기반이랬는데 이렇게 깊숙한곳에 숨어있었네요

 

예제를 보았을 때

request 함수에 validation과 response가 연결되었으니 DataRequest 내부에  

validation함수와 response 함수가 있겠네요

DataRequest 함수를 살펴보면서 response 함수도 분석해 보겠습니다.

 

3. Response

DataRequest는 클래스로 선언되어 있으며 Request 클랫의 서브 클래스 입니다.

URLSessionDataTask를 통해 data를 다운로드 합니다.

 

Request클래스는 alamofire request의 모든 서브 클래스가 공통으로 사용하고

state, delegate, callback handling을 지원합니다.

 

예제에서 사용했던 response 함수를 확인해볼게요

해당 함수는 request가 끝나면 한번 호출 됩니다.

completionHandler를 통해 통신이 끝나면 그 결과는 클로저로 전달해주네요.

 

 

 

휴..

코드 찾아보기가 쉽지 않네요.

그래도 alamofire가 어떻게 동작하는지 어느정도 이해한것 같습니다.

 

피드백이 있다면 언제나 환영입니다.

글 읽어 주셔서 감사합니다.

 

 

출처

https://github.com/Alamofire/Alamofire

 

GitHub - Alamofire/Alamofire: Elegant HTTP Networking in Swift

Elegant HTTP Networking in Swift. Contribute to Alamofire/Alamofire development by creating an account on GitHub.

github.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함