diff --git a/Projects/DataSource/Sources/NetworkService/NetworkService.swift b/Projects/DataSource/Sources/NetworkService/NetworkService.swift index bbb11144..fdc1a2c1 100644 --- a/Projects/DataSource/Sources/NetworkService/NetworkService.swift +++ b/Projects/DataSource/Sources/NetworkService/NetworkService.swift @@ -18,7 +18,8 @@ final class NetworkService { plugins = [ TokenInjectionPlugin(), RefreshTokenPlugin(), - RetryPlugin()] + RetryPlugin(), + BitnagilLoggingPlugin()] } func request( @@ -61,11 +62,6 @@ final class NetworkService { let (data, response) = try await URLSession.shared.data(for: request) - // TODO: - 로깅 로직 수정 - if let httpResponse = response as? HTTPURLResponse { - BitnagilLogger.log(logType: .info, message: "응답 코드: \(httpResponse.statusCode)") - } - if withPlugins { for plugin in plugins { try await plugin.didReceive( @@ -79,19 +75,15 @@ final class NetworkService { else { throw NetworkError.invalidResponse } guard 200..<300 ~= httpResponse.statusCode else { - BitnagilLogger.log(logType: .error, message: "응답 코드: \(httpResponse.statusCode)") throw NetworkError.invalidStatusCode(statusCode: httpResponse.statusCode) } - guard !data.isEmpty - else { throw NetworkError.emptyData } + guard !data.isEmpty else { throw NetworkError.emptyData } do { let baseResponse = try decoder.decode(BaseResponse.self, from: data) - BitnagilLogger.log(logType: .info, message: "Server Message: \(baseResponse.message)") - guard let responseDTO = baseResponse.data - else { return nil } + guard let responseDTO = baseResponse.data else { return nil } return responseDTO } catch { diff --git a/Projects/DataSource/Sources/NetworkService/Plugin/BitnagilLoggingPlugin.swift b/Projects/DataSource/Sources/NetworkService/Plugin/BitnagilLoggingPlugin.swift new file mode 100644 index 00000000..0536117b --- /dev/null +++ b/Projects/DataSource/Sources/NetworkService/Plugin/BitnagilLoggingPlugin.swift @@ -0,0 +1,68 @@ +// +// BitnagilLoggingPlugin.swift +// DataSource +// +// Created by 이동현 on 8/3/25. +// + +import Foundation +import Shared + +struct BitnagilLoggingPlugin: NetworkPlugin { + func willSend(request: URLRequest, endpoint: Endpoint) async throws -> URLRequest { + let urlString = request.url?.absoluteString ?? "" + let method = request.httpMethod ?? "" + let headers = request.allHTTPHeaderFields ?? [:] + let body: String + if let bodyData = request.httpBody { + body = String(data: bodyData, encoding: .utf8) ?? "디코딩 실패" + } else { + body = "내용 없음" + } + + BitnagilLogger.log( + logType: .debug, + message: """ + REQUEST➡️ + - URL: \(urlString) + - Method: \(method) + - Headers: \(headers) + - Body: \(body) + """ + ) + return request + } + + func didReceive(response: URLResponse, data: Data?, endpoint: Endpoint) async throws { + let urlString = response.url?.absoluteString ?? "" + + guard let httpResponse = response as? HTTPURLResponse else { + BitnagilLogger.log(logType: .error, message: "🚨\(urlString)에 대한 response는 HTTPResponse가 아닙니다.🚨") + return + } + + let statusCode = httpResponse.statusCode + + // code/message 추출 + var code: String = "" + var message: String = "" + if + let data = data, + let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any] + { + code = json["code"] as? String ?? "" + message = json["message"] as? String ?? "" + } + + BitnagilLogger.log( + logType: .debug, + message: """ + RESPONSE⬅️ + - 요청URL: \(urlString) + - Status: \(statusCode) + - Code: \(code) + - Message: \(message) + """ + ) + } +}