-
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) //이후 성공 실패 처리
'개발 > Swift' 카테고리의 다른 글
Crashlytics & Google Analytics 를 이용한 원인 분석 (0) 2024.04.11 Async let & TaskGroup Concurrency 예시 (0) 2024.04.10 Xcode 정적 라이브러리 생성과 기능 모듈화 (0) 2024.04.07 [Swift] suspend resume partial function for 함수명 해결 방법 (0) 2024.03.01 [HIG] Privacy 읽기 (0) 2023.09.29