diff --git a/Projects/App/Project.swift b/Projects/App/Project.swift index 05b77b5f..3e925065 100644 --- a/Projects/App/Project.swift +++ b/Projects/App/Project.swift @@ -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, diff --git a/Projects/Data/Project.swift b/Projects/Data/Project.swift index f746975a..263efa82 100644 --- a/Projects/Data/Project.swift +++ b/Projects/Data/Project.swift @@ -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, diff --git a/Projects/NetworkService/Sources/EndPoint/EndPoint.swift b/Projects/NetworkService/Sources/EndPoint/EndPoint.swift index 526add4b..d268c60a 100644 --- a/Projects/NetworkService/Sources/EndPoint/EndPoint.swift +++ b/Projects/NetworkService/Sources/EndPoint/EndPoint.swift @@ -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 @@ -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 @@ -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 + } } diff --git a/Projects/NetworkService/Sources/NetworkError.swift b/Projects/NetworkService/Sources/NetworkError.swift index 9465197f..432988b7 100644 --- a/Projects/NetworkService/Sources/NetworkError.swift +++ b/Projects/NetworkService/Sources/NetworkError.swift @@ -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 "데이터 파싱에 실패하였습니다." } diff --git a/Projects/NetworkService/Sources/NetworkService/DefaultNetworkService.swift b/Projects/NetworkService/Sources/NetworkService/DefaultNetworkService.swift index 87b1d2c1..afc9bd79 100644 --- a/Projects/NetworkService/Sources/NetworkService/DefaultNetworkService.swift +++ b/Projects/NetworkService/Sources/NetworkService/DefaultNetworkService.swift @@ -14,68 +14,48 @@ public final class DefaultNetworkService: NetworkService { public init() { } public func request(endPoint: EndPoint) -> Observable { - .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() + } } } }