Skip to content

Commit

Permalink
Fix/#320 네트워크 통신 로직수정 및 의존성 수정 (#321)
Browse files Browse the repository at this point in the history
* [Fix] 네트워크 요청 Task dispose 시점에 취소되도록 수정

* [Fix] NetworkError 에러 케이스 추가 및 핸들링

* [Setting] firebase 의존성 수정, GoogleUtilities 의존성 추가
  • Loading branch information
gnksbm authored Aug 13, 2024
1 parent f01f38f commit c24a861
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 71 deletions.
6 changes: 0 additions & 6 deletions Projects/App/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,6 @@ let project = Project.makeProject(
// ]
// )
],
packages: [
.remote(
url: "https://github.com/firebase/firebase-ios-sdk",
requirement: .exact("10.23.1")
),
],
dependencies: [
.mainFeature,
.data,
Expand Down
10 changes: 10 additions & 0 deletions Projects/Data/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ import ProjectDescriptionHelpers
let project = Project.makeProject(
name: "Data",
moduleType: .dynamicFramework,
packages: [
.remote(
url: "https://github.com/google/GoogleUtilities.git",
requirement: .exact("7.13.1")
),
.remote(
url: "https://github.com/firebase/firebase-ios-sdk",
requirement: .exact("10.23.1")
),
],
dependencies: [
.networkService,
.coreDataService,
Expand Down
9 changes: 4 additions & 5 deletions Projects/NetworkService/Sources/EndPoint/EndPoint.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public enum Scheme: String {
}

extension EndPoint {
public var toURLRequest: URLRequest? {
public func toURLRequest() throws -> URLRequest {
var urlComponent = URLComponents()
urlComponent.scheme = scheme.rawValue
urlComponent.host = host
Expand All @@ -38,7 +38,7 @@ extension EndPoint {
guard let urlStr = urlComponent.url?.absoluteString
.replacingOccurrences(of: "%25", with: "%"),
let url = URL(string: urlStr)
else { return nil }
else { throw NetworkError.invalidURL }
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = method.toString
urlRequest.allHTTPHeaderFields = header
Expand All @@ -47,11 +47,10 @@ extension EndPoint {
let httpBody = try JSONSerialization.data(withJSONObject: body)
urlRequest.httpBody = httpBody
} catch {
#if DEBUG
print(error.localizedDescription)
#endif
throw NetworkError.jsonSerializationError(error)
}
}
return urlRequest

}
}
14 changes: 10 additions & 4 deletions Projects/NetworkService/Sources/NetworkError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,28 @@
import Foundation

enum NetworkError: LocalizedError {
case invalidURL
case jsonSerializationError(Error)
case transportError(Error)
case invalidResponse
case invalidStatusCode(Int)
case invalidData
case invalidURL
case parseError

var errorDescription: String? {
switch self {
case .invalidURL:
return "유효하지 않은 URL입니다."
case .jsonSerializationError(let error):
return "JSON 직렬화 에러: \(error.localizedDescription)"
case .transportError(let error):
return "에러: \(error.localizedDescription)"
return "네트워크 요청 에러: \(error.localizedDescription)"
case .invalidResponse:
return "유효하지 않은 응답입니다."
case .invalidStatusCode(let code):
return "서버 응답 코드 에러: \(code)"
case .invalidData:
return "유효하지 않은 데이터입니다."
case .invalidURL:
return "유효하지 않은 URL입니다."
case .parseError:
return "데이터 파싱에 실패하였습니다."
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,68 +14,48 @@ public final class DefaultNetworkService: NetworkService {
public init() { }

public func request(endPoint: EndPoint) -> Observable<Data> {
.create { observer in
guard let urlRequest = endPoint.toURLRequest
else {
observer.onError(NetworkError.invalidURL)
return Disposables.create()
}

URLSession.shared.dataTask(
with: urlRequest
) { data, response, error in
if let error {
observer.onError(NetworkError.transportError(error))
return
}

guard let httpURLResponse = response as? HTTPURLResponse
else { return }
guard 200..<300 ~= httpURLResponse.statusCode
else {
observer.onError(
NetworkError.invalidStatusCode(
httpURLResponse.statusCode
)
)
#if DEBUG
if let url = urlRequest.url,
let httpMethod = urlRequest.httpMethod,
let data = urlRequest.httpBody,
let httpBody = String(
data: data,
encoding: .utf8
) {
print(
url,
httpMethod,
httpBody,
separator: "\n"
Observable.create { observer in
do {
let urlRequest = try endPoint.toURLRequest()
let task = URLSession.shared.dataTask(
with: urlRequest
) { data, response, error in
if let error {
observer.onError(NetworkError.transportError(error))
return
}
guard let httpURLResponse = response as? HTTPURLResponse
else {
observer.onError(
NetworkError.invalidResponse
)
return
}
if let data,
let json = String(
data: data,
encoding: .utf8
) {
print(
json
guard 200..<300 ~= httpURLResponse.statusCode
else {
observer.onError(
NetworkError.invalidStatusCode(
httpURLResponse.statusCode
)
)
return
}
guard let data
else {
observer.onError(NetworkError.invalidData)
return
}
#endif
return
observer.onNext(data)
observer.onCompleted()
}

guard let data
else {
observer.onError(NetworkError.invalidData)
return
task.resume()
return Disposables.create {
task.cancel()
}
observer.onNext(data)
observer.onCompleted()
}.resume()

return Disposables.create()
} catch {
observer.onError(NetworkError.invalidURL)
return Disposables.create()
}
}
}
}

0 comments on commit c24a861

Please sign in to comment.