[iOS] Alamofire

황석범·2024년 12월 17일
1

내일배움캠프_iOS_5기

목록 보기
48/76

Alamofire

Alamofire는 iOS 개발에서 널리 사용되는 HTTP 네트워킹 라이브러리입니다. Session, Interceptor, 그리고 Request Flow는 Alamofire의 주요 구성 요소입니다. 이들을 활용하면 네트워킹 작업을 더욱 효율적이고 유연하게 처리할 수 있습니다.

1. Alamofire의 Session

  • Alamofire의 Session은 네트워크 요청을 관리하는 핵심 객체입니다.

Session의 역할

  • 네트워크 요청을 생성 및 수행.
  • 요청에 대한 응답 처리.
  • 공통 설정(예: 헤더, 인증, 캐싱 등) 적용.
  • 커스텀 요청 처리를 위한 Interceptor 통합 가능

기본 Session

  • Alamofire는 기본 세션을 제공하며, 보통 AF라는 단축 이름으로 사용됩니다.
AF.request("https://api.example.com/data")
    .validate()
    .responseJSON { response in
        print(response)
    }

위 코드에서 AF는 Alamofire의 기본 Session입니다. 기본적으로 Session.default를 사용합니다.


Custom Session

특정 설정이 필요한 경우, 커스텀 Session을 만들 수 있습니다.

let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 30  // 타임아웃 설정
configuration.httpAdditionalHeaders = ["Authorization": "Bearer YOUR_TOKEN"]

let session = Session(configuration: configuration)
session.request("https://api.example.com/data")
    .validate()
    .responseJSON { response in
        print(response)
    }

여기서는 URLSessionConfiguration을 통해 세션 설정(예: 타임아웃, 헤더)을 커스터마이징했습니다.


2. Interceptor

  • Interceptor는 Alamofire에서 요청(Request)과 응답(Response)에 대한 공통 작업을 수행하기 위해 사용됩니다.

Interceptor의 역할

  • 요청 전처리: 헤더 추가, 토큰 갱신, 파라미터 수정 등.
  • 응답 후처리: 에러 처리, 재시도 정책 설정.
  • 재시도 로직: 실패한 요청을 자동으로 재시도하거나 수정.

Interceptor 구현 예제

Alamofire의 RequestInterceptor 프로토콜을 구현하면 커스텀 인터셉터를 만들 수 있습니다.

토큰 갱신 및 재시도 로직

class AuthInterceptor: RequestInterceptor {
    // 요청 전 처리
    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
        var adaptedRequest = urlRequest
        // 헤더에 인증 토큰 추가
        adaptedRequest.setValue("Bearer YOUR_ACCESS_TOKEN", forHTTPHeaderField: "Authorization")
        completion(.success(adaptedRequest))
    }

    // 재시도 로직
    func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
        // 네트워크 오류나 인증 실패 시 재시도 로직 작성
        if let response = request.response, response.statusCode == 401 {
            // 토큰 갱신 로직 수행 후 재시도
            refreshAccessToken { success in
                if success {
                    completion(.retry)
                } else {
                    completion(.doNotRetry)
                }
            }
        } else {
            completion(.doNotRetry)
        }
    }

    // 토큰 갱신 메서드
    private func refreshAccessToken(completion: @escaping (Bool) -> Void) {
        // 토큰 갱신 로직 (예: API 요청)
        print("Refreshing Access Token...")
        completion(true)  // 성공으로 가정
    }
}

Interceptor 적용

let session = Session(interceptor: AuthInterceptor())

session.request("https://api.example.com/protected/data")
    .validate()
    .responseJSON { response in
        print(response)
    }

정리

Session:

  • 네트워크 요청의 핵심 관리 객체.

Interceptor:

  • 요청 및 응답 전후 처리.

Request:

  • 요청 객체(DataRequest, DownloadRequest, UploadRequest 등).

EventMonitor:

  • 네트워크 이벤트 로깅 및 감지.

Response Handlers:

  • 응답 처리(responseJSON, responseDecodable, responseString 등).

Validation:

  • 상태 코드 및 커스텀 유효성 검사.

RequestAdapter & RequestRetrier:

  • 요청 수정 및 재시도 로직.

NetworkReachabilityManager:

  • 네트워크 상태 감지.

일단 이정도로 정리하고 다시 공부하자...

profile
iOS 공부중...

0개의 댓글

관련 채용 정보