Skip to content

[Refactor] #96 - Networking Endpoint 개선#97

Open
Naknakk wants to merge 22 commits into
developfrom
refactor/#96
Open

[Refactor] #96 - Networking Endpoint 개선#97
Naknakk wants to merge 22 commits into
developfrom
refactor/#96

Conversation

@Naknakk
Copy link
Copy Markdown
Collaborator

@Naknakk Naknakk commented Apr 29, 2026

💡 Issue


💭 Summary

  • 이번 리팩토링에서는 Endpoint의 각 역할을 전담하는 enum을 도입해, 선언 시점에 의도가 드러나고 인코딩/헤더 처리는 내부에서 자동으로 이루어지도록 개선했습니다.
  • 또한 토큰 주입 정책을 NetworkingClient가 직접 가지고 있어, Endpoint에서 원하는 정책을 선택할 수 없는 문제가 있었습니다.

🔑 Key Changes

AuthorizationPolicy

  • 기존 requireTokenRefresh: Bool은 갱신 재시도 여부를 하나의 Bool로 표현했습니다. 이 방식으로는 "토큰은 있지만 갱신은 하지 않는다", "토큰이 있으면 쓰지만 없어도 된다"와 같은 세부 정책을 표현할 방법이 없었습니다.
  • 또한, 토큰 주입 여부는 Endpoint에서 선택할 수 없었습니다.
// Before
var requireTokenRefresh: Bool { true }

// After
var authorization: AuthorizationPolicy { .requiresToken }

도입된 세 가지 case:

  • .requiresToken — Bearer 토큰 필수 첨부. 401 응답 시 토큰 갱신 후 재시도
  • .withoutToken — 토큰 불필요. 로그인, 토큰 재발급 등 공개 API
  • .usesTokenIfAvailable — 토큰이 있으면 첨부하고 401 시 재시도, 없으면 withoutToken과 같이 그냥 진행

RequestBody

  • 기존에는 각 Endpoint 구현체에서 매번 json 인코딩을 작성해줘야 했고,
  • Multipart의 경우 직접 작성해야 하는 문제가 있었습니다.
  • Content-Type 헤더도 "application/json"등 직접 설정해야 해서 놓치면 문제가 생겼습니다.
// Before
var body: Data? { try? JSONEncoder().encode(request) }
var headers: [String: String]? { ["Content-Type": "application/json"] }

// After
var body: RequestBody { .json(request) }

도입된 세 가지 case:

  • .none — 요청 바디 없음
  • .json(any Encodable) — JSONEncoder 자동 적용, Content-Type을 application/json으로 자동 설정
  • .multipart(MultipartFormData) — boundary 자동 생성, Content-Type 헤더 자동 구성,
    이미지/파일/텍스트 파트 지원

멀티파트의 경우 아래와 같이 작성 가능합니다.

var body: RequestBody {
    .multipart(
        MultipartFormData(parts: [
            .json(keyName: "request", value: uploadRequest),   // JSON 파트
            .text(keyName: "description", value: "sample"),    // 텍스트 파트
            .imageData(keyName: "thumbnail", data: imageData), // JPEG 이미지
            .imageData(                                         // 파일명 지정
                keyName: "profileImage",
                data: pngData,
                contentType: .png,
                fileName: "profile.png"
            ),
            .data(                                              // 커스텀 타입
                keyName: "document",
                data: pdfData,
                contentType: .custom(headerValue: "application/pdf", fileExtension: "pdf")
            )
        ])
    )
}

QueryParameters

  • 기존 queryItems: [URLQueryItem]? 도 매번 변환을 직접 Endpoint에서 수행해야 했습니다.
// Before
var queryItems: [URLQueryItem]? { query.asQueryItem() }

// After
var query: QueryParameters { .convertible(query) }

도입된 세 가지 case:

  • .none — 쿼리 파라미터 없음
  • .convertible(any QueryItemConvertible) — 기존 QueryItemConvertible 타입을 자동 변환
  • .custom([URLQueryItem]) — URLQueryItem 배열 직접 전달

그 외 변경점

  • 각 DataModule Endpoint 구현체 파일 업데이트
  • NetworkingClient 내부 로직 개선 (AuthorizationContext 도입, 401 처리 단순화)

@Naknakk Naknakk linked an issue Apr 29, 2026 that may be closed by this pull request
@Naknakk Naknakk changed the title [Refactor] #96 - Networking Module Endpoint 방식 개선 [Refactor] #96 - Networking Endpoint 개선 Apr 29, 2026
@Naknakk Naknakk self-assigned this May 1, 2026
@Guryss Guryss self-requested a review May 6, 2026 09:08
@Naknakk Naknakk requested a review from onesunny2 May 11, 2026 05:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Refactor] Networking module Endpoint 정책 개선 작업

2 participants