ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 네트워크 구조 잡기
    개발/Swift 2024. 4. 8. 15:47

    기본적인 구조는 APIClient, Request, Service가 있다.

    APIClient 객체가 있다. APIClient 는 alamofire를 직접 호출하는 역할을 한다.

    api호출에 공통적인 로직이 있는경우 처리에 포함시켜주면 중복코드를 막을수 있다.

    let response = await manager.request(request.url, method: request.method,
                                     parameters: request.parameters, encoding: request.encoding,
                                     headers: request.headers)
    .validate()
    .serializingData()
    .response
    
    /// 실패 처리 ( 성공은 생략 ) 
    case let .failure(error):
    
    if statusCode == 401 && isRefreshIfNeeded {
    	//refreshToken
      switch await refreshAccessToken() {
      case .success:
          return await requestAPI(request: request, uuid: uuid, isRefreshIfNeeded: false)
      case let .failure(error):
          return .failure(error)
      }
    } else {
    
      let error = Error(uuid: uuid, code: statusCode, error: error)
      AnalyticsHelper.shared.logError(error)
      return .failure(error)
    }
    }

     

    Request 객체는 api 호출시에 필요하다 url, header, parameter 등

    api request 함수에 필요한 내용들을 담고있다.

    구현체는 따로 있고 구현체에서 디폴트한 값은 지정해주어 중복 코드를 방지하였다.

    해당 Request 구현체는 API 호출때마다 생성해서 넣어준다. 

    public protocol RequestProtocol {
        var url: String { get }
        var method: HTTPMethod { get }
        var parameters: Parameters? { get }
        var headers: Headers? { get }
        var encoding: ParameterEncoding { get }
    }
    
    

     

    Service 객체가 있다 Service 객체는 Request 객체를 생성 + APIClient를 통해 네트워크를 호출한다.

    백엔드 service 레이어가 분리 되어있는경우나 기능적인 분류를 통해 각 각의 Service 클래스를 만들어 사용하였다.

    ex> OrderService, UserService ... 

     public init(gDB: DatabaseProtocol) {
            self.apiClient = APIClient(gDB: gDB)
        }
     //사용
     let request = Request(url: "users/" + userIdentifier + "/friends",
                                  method: .get, parameters: parameters)
      let response = await apiClient.requestAPI(request: request, uuid: uuid)
      
      //이후 성공 실패 처리
    

     

    댓글

Designed by Tistory.