Skip to content

Commit 7d738c8

Browse files
authored
[NL-85]: 통신 실패시 최대 3회 재시도 (#58)
1 parent 0ba60e5 commit 7d738c8

File tree

4 files changed

+45
-4
lines changed

4 files changed

+45
-4
lines changed

Core/NetworkCore/Sources/BaseTargetType.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ extension BaseTargetType {
2525
}
2626
public var task: Moya.Task { httpTask }
2727
public var method: Moya.Method { httpMethod }
28+
public var validationType: ValidationType { .successCodes }
2829
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//
2+
// DefaultConfig.swift
3+
// NetworkCore
4+
//
5+
// Created by ttozzi on 8/20/25.
6+
//
7+
8+
import Foundation
9+
10+
enum DefaultConfig {
11+
static let timeOutInterval: TimeInterval = 20
12+
static let retryLimit = 3
13+
}

Core/NetworkCore/Sources/NetworkProvider.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,21 @@ import Moya
1010

1111
public final class NetworkProvider {
1212

13-
public static let shared: NetworkProvider = .init(internalProvider: MoyaProvider<MultiTarget>())
13+
public static let shared = NetworkProvider()
1414
private let internalProvider: MoyaProvider<MultiTarget>
1515

16-
public init(internalProvider: MoyaProvider<MultiTarget>) {
17-
self.internalProvider = internalProvider
16+
private init() {
17+
let configuration = URLSessionConfiguration.default
18+
configuration.timeoutIntervalForRequest = DefaultConfig.timeOutInterval
19+
configuration.timeoutIntervalForResource = DefaultConfig.timeOutInterval
20+
let session = Session(configuration: configuration, interceptor: RetryInterceptor())
21+
self.internalProvider = MoyaProvider<MultiTarget>(session: session)
1822
}
1923

2024
public func request<T: BaseTargetType>(target: T) async throws -> T.Response {
2125
// TODO: Reachability 확인 필요할지
2226
do {
2327
let responseData = try await internalProvider.request(MultiTarget(target))
24-
.filterSuccessfulStatusCodes()
2528
let response = try JSONDecoder().decode(T.Response.self, from: responseData.data)
2629
return response
2730
} catch {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// RetryInterceptor.swift
3+
// NetworkCore
4+
//
5+
// Created by ttozzi on 8/20/25.
6+
//
7+
8+
import Alamofire
9+
import Foundation
10+
import Moya
11+
12+
final class RetryInterceptor: RequestInterceptor {
13+
14+
private let retryLimit = DefaultConfig.retryLimit
15+
16+
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
17+
let retryCount = request.retryCount
18+
if retryCount < retryLimit {
19+
completion(.retryWithDelay(1 * pow(2, Double(retryCount))))
20+
} else {
21+
completion(.doNotRetry)
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)