Skip to content

Auth 세션 인프라와 live 조립 추가 - #12

Merged
gnoes-ios merged 8 commits into
devfrom
feature/auth-session-infra
Aug 5, 2026
Merged

Auth 세션 인프라와 live 조립 추가#12
gnoes-ios merged 8 commits into
devfrom
feature/auth-session-infra

Conversation

@gnoes-ios

Copy link
Copy Markdown
Contributor

📌 변경 요약

  • Domain Auth 포트(AuthClient/AuthSession) 추가
  • Data Auth 세션 인프라와 plain refresh 조립 추가
  • App live 등록 및 Auth 규칙 문서 동기화

📌 변경 내용

Domain

  • AuthSession, AuthError, AuthProvider, AuthClient 포트 추가
  • @DependencyClient 기반 authClient dependency 정의
  • Domain 테스트 타겟/세션 검증 추가

Data

  • Auth DTO/Endpoint/Datasource/Repository 구현
  • AuthLocalDatasource, AuthTokenRefresher, OAuth stub 추가
  • AuthClientFactory + AuthClient.live 조립 경로 추가
  • local/remote/repository를 struct로 구성
  • refresh 실패 시 unauthorized만 세션 삭제, 일시 네트워크 오류는 유지
  • request body encode를 remote에서 수행하고 실패 시 throw
  • Auth 관련 Data 테스트 추가

App

  • InfraContainer를 설정/로컬 저장소 중심으로 유지
  • Dependencies에서 AuthClient.live 등록

Docs

  • live 구현=Data / live 등록=App only 규칙 정리
  • Domain/Data README 진입점 및 Auth 상태 반영

@gnoes-ios gnoes-ios added the feat 새로운 기능 label Aug 4, 2026
@gnoes-ios gnoes-ios self-assigned this Aug 4, 2026
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • 새 기능

    • 카카오·Apple·개발자 로그인을 지원하는 인증 기능을 추가했습니다.
    • 로그인 세션 저장, 복원, 현재 세션 확인 및 로그아웃을 지원합니다.
    • 액세스 토큰 만료 시 자동 갱신되며, 인증 실패 시 세션을 안전하게 정리합니다.
    • 인증 상태와 사용자 프로필 완료 여부를 관리할 수 있습니다.
  • 문서

    • 인증 구성, 세션 처리 규칙 및 아키텍처 안내를 업데이트했습니다.
  • 테스트

    • 로그인, 로그아웃, 세션 복원, 토큰 갱신 및 오류 처리에 대한 검증을 추가했습니다.

Walkthrough

Auth 도메인 계약과 Data 인증 계층을 추가했습니다. 로그인, 세션 저장, 로그아웃, 토큰 갱신, OAuth stub을 구현했습니다. AuthClient.live와 App 의존성 등록을 연결하고 관련 테스트와 아키텍처 문서를 갱신했습니다.

Changes

Auth 도메인 계약

Layer / File(s) Summary
Auth 모델과 의존성 계약
Projects/Domain/Sources/Auth/*, Projects/Domain/Tests/Auth/*, Projects/Domain/README.md
AuthSession, AuthProvider, AuthError, AuthClientDependencyValues.authClient를 추가했습니다. 모델의 Codable 동작과 테스트 기본값을 검증합니다.

인증 데이터 계층

Layer / File(s) Summary
인증 DTO, 엔드포인트와 원격 요청
Projects/Data/Sources/Auth/DTO/*, Projects/Data/Sources/Auth/Endpoint/*, Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift, Projects/Data/Sources/Auth/Service/OAuth/*, Projects/Data/Tests/Auth/OAuthServiceFactoryTests.swift
로그인과 토큰 갱신 DTO, 인증 엔드포인트, JSON 요청, OAuth 서비스 조회와 미설정 stub을 추가했습니다. DTO 매핑과 OAuth 오류를 테스트합니다.
세션 저장과 인증 수명 주기
Projects/Data/Sources/Auth/Datasource/AuthLocalDatasource.swift, Projects/Data/Sources/Auth/Repository/*, Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift, Projects/Data/Tests/Auth/*, Projects/Data/Tests/Support/*
키체인 기반 세션 저장, 로그인·복원·로그아웃, 토큰 갱신과 오류 매핑을 구현했습니다. 인메모리 키체인과 URL 프로토콜 stub으로 저장, 요청, 세션 삭제 및 오류 처리를 검증합니다.

Live 조립과 App 등록

Layer / File(s) Summary
AuthClient live 조립과 의존성 등록
Projects/Data/Sources/Auth/Client/*, Projects/App/Sources/DI/*, Projects/Data/Project.swift, Projects/Domain/Project.swift, docs/ARCHITECTURE.md, docs/CONVENTIONS.md, Projects/Data/README.md
AuthClient.live가 네트워크 클라이언트, 키체인, refresher, datasource, repository를 조립합니다. Dependencies.register가 설정값과 OAuth 서비스를 사용해 authClient를 등록합니다. 테스트 포함 프로젝트 설정과 live 구현 규칙을 갱신했습니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

  • TeamMozi/mozi-iOS#1: Dependencies.register의 실제 Auth 의존성 연결과 placeholder 계층 확장에 직접 연결됩니다.
  • TeamMozi/mozi-iOS#6: ProjectFactory.framework의 테스트 대상 설정 변경과 연결됩니다.
  • TeamMozi/mozi-iOS#9: Auth 계층이 사용하는 네트워크 및 토큰 갱신 API와 연결됩니다.
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목은 Auth 세션 인프라와 live 조립이라는 변경의 핵심을 명확하고 간결하게 설명합니다.
Description check ✅ Passed 변경 요약과 영역별 변경 내용이 충분히 작성되어 있으며, 저장소·갱신 오류 정책과 테스트 내용도 포함합니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🧹 Nitpick comments (3)
Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift (1)

5-6: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Datasource 프로퍼티에 Auth 접두사를 추가하십시오.

plainClientauthedClient는 Auth 도메인 소속을 이름에 표시하지 않습니다. authPlainClientauthAuthedClient처럼 변경하고 모든 참조를 함께 변경하십시오.

As per path instructions, Datasource 프로퍼티는 도메인 prefix 를 붙인다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift` around
lines 5 - 6, Rename the AuthRemoteDatasource properties plainClient and
authedClient to authPlainClient and authAuthedClient, respectively, and update
every reference within the datasource to use the new domain-prefixed names.

Source: Path instructions

Projects/Domain/Sources/Auth/AuthSession.swift (1)

3-3: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

공개 Auth 타입에 /// 문서를 추가하십시오.

공개 API의 목적과 사용 계약을 문서화하지 않았습니다.

  • Projects/Domain/Sources/Auth/AuthSession.swift#L3-L3: AuthSession의 세션 데이터 계약을 설명하는 type-level /// 문서를 추가하십시오.
  • Projects/Data/Sources/Auth/DTO/TokenResponseDTO.swift#L4-L4: refresh 응답 DTO의 용도와 세션 적용 의미를 설명하는 type-level /// 문서를 추가하십시오.
  • Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift#L4-L4: 원격 Auth 요청의 책임과 client 분리를 설명하는 type-level /// 문서를 추가하십시오.
  • Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift#L5-L5: token rotation과 실패 처리 책임을 설명하는 type-level /// 문서를 추가하십시오.

As per path instructions, 공개 타입·포트에는 ///를 적용하십시오.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Domain/Sources/Auth/AuthSession.swift` at line 3, 공개 Auth 타입과 포트에
type-level /// 문서를 추가하십시오. Projects/Domain/Sources/Auth/AuthSession.swift의
AuthSession에는 세션 데이터 계약을, Projects/Data/Sources/Auth/DTO/TokenResponseDTO.swift의
TokenResponseDTO에는 refresh 응답의 용도와 세션 적용 의미를,
Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift의
AuthRemoteDatasource에는 원격 Auth 요청 책임과 client 분리를,
Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift의
AuthTokenRefresher에는 token rotation 및 실패 처리 책임을 각각 설명하십시오.

Source: Path instructions

Projects/Data/Sources/Auth/DTO/LoginResponseDTO.swift (1)

4-4: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

공개 타입에 /// 문서 주석을 추가하세요.

새 공개 타입에 역할과 모듈 경계를 설명하는 한국어 /// 문서 주석이 없습니다.

  • Projects/Data/Sources/Auth/DTO/LoginResponseDTO.swift#L4-L4: 로그인 응답 DTO와 Domain 매핑 역할을 설명하세요.
  • Projects/Data/Sources/Auth/Datasource/AuthLocalDatasource.swift#L6-L6: Keychain 기반 세션 저장소 및 TokenProviding 역할을 설명하세요.
  • Projects/Data/Sources/Auth/Repository/AuthRepositoryImpl.swift#L6-L6: 인증 원격/로컬 datasource 조정 역할을 설명하세요.
  • Projects/Data/Sources/Auth/Client/AuthClientFactory.swift#L4-L4: Domain AuthClient 생성 역할을 설명하세요.

As per path instructions, "공개 타입·포트에는 ///".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Data/Sources/Auth/DTO/LoginResponseDTO.swift` at line 4, 각 공개 타입 선언에
한국어 /// 문서 주석을 추가하세요: Projects/Data/Sources/Auth/DTO/LoginResponseDTO.swift 4-4의
LoginResponseDTO에는 로그인 응답 DTO 및 Domain 매핑 역할을,
Projects/Data/Sources/Auth/Datasource/AuthLocalDatasource.swift 6-6의
AuthLocalDatasource에는 Keychain 기반 세션 저장소 및 TokenProviding 역할을,
Projects/Data/Sources/Auth/Repository/AuthRepositoryImpl.swift 6-6의
AuthRepositoryImpl에는 인증 원격/로컬 datasource 조정 역할을,
Projects/Data/Sources/Auth/Client/AuthClientFactory.swift 4-4의
AuthClientFactory에는 Domain AuthClient 생성 역할을 설명하세요.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/ARCHITECTURE.md`:
- Around line 66-67: Update the registration flow diagram around
InfraContainer.live() in ARCHITECTURE.md to match the implementation:
InfraContainer.live() should lead to Dependencies.register, with
AuthClient.live(...) registration represented as occurring inside
Dependencies.register rather than directly before it. Verify the ordering
against Dependencies.register in Dependencies.swift.

In `@Projects/Data/Sources/Auth/Client/AuthClient`+Live.swift:
- Around line 9-46: Enforce HTTPS for every authentication request, not only
through the tokenProvider path. Update the NetworkConfiguration used by the
plain and authenticated DefaultNetworkClient instances to reject non-HTTPS URLs,
and ensure redirect handling does not forward OAuth credentials or refresh
tokens to HTTP or a different origin. Apply this across AuthClient’s
plainClient, authedNetworkClient, and their shared authentication flows.

In `@Projects/Data/Sources/Auth/Client/AuthClientFactory.swift`:
- Around line 13-20: Update the login closure in AuthClientFactory so errors
thrown by credentialProvider(provider) are caught and converted to AuthError
before reaching AuthRepositoryImpl’s mapping; preserve the existing
provider-specific repository login calls and add coverage for the
credential-fetch failure path.

In `@Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift`:
- Around line 16-38: Update AuthRemoteDatasource methods loginWithKakao,
loginWithApple, and refresh so credential-bearing requests enforce HTTPS,
validate the base URL against the configured allowed host, and reject redirects
to other origins. Apply the same transport protections through the relevant
NetworkConfiguration/DefaultNetworkClient request path, while preserving
existing request bodies and response handling.

In `@Projects/Data/Sources/Auth/Repository/AuthRepositoryImpl.swift`:
- Around line 15-17: Update AuthRepositoryImpl’s restoreSession and logout
methods to wrap local.load and local.clear in do/catch blocks, converting caught
KeychainError values through the existing error mapper into AuthError.storage
before rethrowing. Preserve successful results and add tests covering failures
from both load and clear.

In `@Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift`:
- Around line 41-44: Update the error handling in AuthTokenRefresher so only
NetworkError.unauthorized clears the local session and maps to .unauthorized.
Handle NetworkError.badRequest separately by preserving the session and
returning the appropriate non-unauthorized error mapping.
- Around line 29-30: Update both unauthorized-handling paths in
AuthTokenRefresher so failures from local.clear are not swallowed by try?.
Propagate an explicit AuthError for the clear failure, or route it through a
persistent retry mechanism, while preserving the unauthorized result when
clearing succeeds. Add coverage for Keychain deletion failure and verify the
invalid refresh token is not silently retained.
- Around line 15-17: Update the session-loading flow around local.load() in
AuthTokenRefresher so datasource failures are handled within a do-catch block.
Catch KeychainError thrown by AuthLocalDatasource.load() and map it to
AuthError.storage, while preserving the unauthorized result when load returns
nil.

In `@Projects/Data/Sources/Auth/Service/OAuth/OAuthServiceFactory.swift`:
- Around line 4-30: Document the public OAuthServices and OAuthServiceFactory
types with triple-slash comments describing their roles, and update makeStub()
documentation to state that its returned services throw AuthError.notConfigured
during login. Remove the PR-status wording from the API documentation and record
future SDK integration separately using a // TODO: comment.

In `@Projects/Data/Tests/Auth/OAuthServiceFactoryTests.swift`:
- Line 6: Rename the test method test_stub_kakao는_notConfigured to follow the
Korean test_<상황>_<기대결과> format, describing the Kakao provider and login
condition in Korean while preserving only the enum case notConfigured as an
identifier.

In `@Projects/Domain/Sources/Auth/AuthClient.swift`:
- Around line 4-10: Document all public Auth contracts with `///` comments: in
Projects/Domain/Sources/Auth/AuthClient.swift lines 4-10, describe each session
operation and its error behavior; in
Projects/Domain/Sources/Auth/AuthError.swift lines 1-9, document the error
categories and `message` purpose; in
Projects/Domain/Sources/Auth/AuthProvider.swift lines 1-4, document supported
providers and case meanings; and in
Projects/Data/Sources/Auth/Service/OAuth/OAuthService.swift lines 4-6, document
returned credential semantics and error conditions.

---

Nitpick comments:
In `@Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift`:
- Around line 5-6: Rename the AuthRemoteDatasource properties plainClient and
authedClient to authPlainClient and authAuthedClient, respectively, and update
every reference within the datasource to use the new domain-prefixed names.

In `@Projects/Data/Sources/Auth/DTO/LoginResponseDTO.swift`:
- Line 4: 각 공개 타입 선언에 한국어 /// 문서 주석을 추가하세요:
Projects/Data/Sources/Auth/DTO/LoginResponseDTO.swift 4-4의 LoginResponseDTO에는
로그인 응답 DTO 및 Domain 매핑 역할을,
Projects/Data/Sources/Auth/Datasource/AuthLocalDatasource.swift 6-6의
AuthLocalDatasource에는 Keychain 기반 세션 저장소 및 TokenProviding 역할을,
Projects/Data/Sources/Auth/Repository/AuthRepositoryImpl.swift 6-6의
AuthRepositoryImpl에는 인증 원격/로컬 datasource 조정 역할을,
Projects/Data/Sources/Auth/Client/AuthClientFactory.swift 4-4의
AuthClientFactory에는 Domain AuthClient 생성 역할을 설명하세요.

In `@Projects/Domain/Sources/Auth/AuthSession.swift`:
- Line 3: 공개 Auth 타입과 포트에 type-level /// 문서를 추가하십시오.
Projects/Domain/Sources/Auth/AuthSession.swift의 AuthSession에는 세션 데이터 계약을,
Projects/Data/Sources/Auth/DTO/TokenResponseDTO.swift의 TokenResponseDTO에는
refresh 응답의 용도와 세션 적용 의미를,
Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift의
AuthRemoteDatasource에는 원격 Auth 요청 책임과 client 분리를,
Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift의
AuthTokenRefresher에는 token rotation 및 실패 처리 책임을 각각 설명하십시오.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: ff80b1cc-0e62-4c82-a790-6e401775a7f1

📥 Commits

Reviewing files that changed from the base of the PR and between 47b2911 and 8356ada.

📒 Files selected for processing (37)
  • Projects/App/Sources/DI/Dependencies.swift
  • Projects/App/Sources/DI/InfraContainer.swift
  • Projects/Data/Project.swift
  • Projects/Data/README.md
  • Projects/Data/Sources/Auth/Client/AuthClient+Live.swift
  • Projects/Data/Sources/Auth/Client/AuthClientFactory.swift
  • Projects/Data/Sources/Auth/DTO/AppleLoginRequestDTO.swift
  • Projects/Data/Sources/Auth/DTO/DevLoginRequestDTO.swift
  • Projects/Data/Sources/Auth/DTO/KakaoLoginRequestDTO.swift
  • Projects/Data/Sources/Auth/DTO/LoginResponseDTO.swift
  • Projects/Data/Sources/Auth/DTO/RefreshRequestDTO.swift
  • Projects/Data/Sources/Auth/DTO/TokenResponseDTO.swift
  • Projects/Data/Sources/Auth/Datasource/AuthLocalDatasource.swift
  • Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift
  • Projects/Data/Sources/Auth/Endpoint/AuthEndpoint.swift
  • Projects/Data/Sources/Auth/Repository/AuthRepositoryImpl.swift
  • Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift
  • Projects/Data/Sources/Auth/Service/OAuth/OAuthService.swift
  • Projects/Data/Sources/Auth/Service/OAuth/OAuthServiceFactory.swift
  • Projects/Data/Tests/Auth/AuthClientFactoryTests.swift
  • Projects/Data/Tests/Auth/AuthLocalDatasourceTests.swift
  • Projects/Data/Tests/Auth/AuthRepositoryImplTests.swift
  • Projects/Data/Tests/Auth/AuthTokenRefresherTests.swift
  • Projects/Data/Tests/Auth/LoginResponseDTOMappingTests.swift
  • Projects/Data/Tests/Auth/OAuthServiceFactoryTests.swift
  • Projects/Data/Tests/Support/AuthURLProtocolStub.swift
  • Projects/Data/Tests/Support/InMemoryKeychainStorage.swift
  • Projects/Domain/Project.swift
  • Projects/Domain/README.md
  • Projects/Domain/Sources/Auth/AuthClient.swift
  • Projects/Domain/Sources/Auth/AuthError.swift
  • Projects/Domain/Sources/Auth/AuthProvider.swift
  • Projects/Domain/Sources/Auth/AuthSession.swift
  • Projects/Domain/Sources/Placeholder.swift
  • Projects/Domain/Tests/Auth/AuthSessionTests.swift
  • docs/ARCHITECTURE.md
  • docs/CONVENTIONS.md
💤 Files with no reviewable changes (1)
  • Projects/Domain/Sources/Placeholder.swift

Comment thread docs/ARCHITECTURE.md Outdated
Comment thread Projects/Data/Sources/Auth/Client/AuthClient+Live.swift
Comment thread Projects/Data/Sources/Auth/Client/AuthClientFactory.swift
Comment thread Projects/Data/Sources/Auth/Datasource/AuthRemoteDatasource.swift
Comment thread Projects/Data/Sources/Auth/Repository/AuthRepositoryImpl.swift
Comment thread Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift Outdated
Comment thread Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift Outdated
Comment thread Projects/Data/Sources/Auth/Service/OAuth/OAuthServiceFactory.swift
Comment thread Projects/Data/Tests/Auth/OAuthServiceFactoryTests.swift Outdated
Comment thread Projects/Domain/Sources/Auth/AuthClient.swift

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Projects/Data/Tests/Support/FailingKeychainStorage.swift`:
- Around line 5-11: Update the Operation enum in FailingKeychainStorage to
conform to Hashable so it can be used as the element type of failingOperations:
Set<Operation>, while preserving its existing Sendable conformance and cases.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d7b77e3-d4d7-4e73-8e3f-16493099b76b

📥 Commits

Reviewing files that changed from the base of the PR and between 8356ada and 693f99d.

📒 Files selected for processing (9)
  • Projects/Data/README.md
  • Projects/Data/Sources/Auth/Repository/AuthRepositoryImpl.swift
  • Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift
  • Projects/Data/Tests/Auth/AuthClientFactoryTests.swift
  • Projects/Data/Tests/Auth/AuthRepositoryImplTests.swift
  • Projects/Data/Tests/Auth/AuthTokenRefresherTests.swift
  • Projects/Data/Tests/Auth/OAuthServiceFactoryTests.swift
  • Projects/Data/Tests/Support/FailingKeychainStorage.swift
  • docs/ARCHITECTURE.md
🚧 Files skipped from review as they are similar to previous changes (6)
  • Projects/Data/Tests/Auth/OAuthServiceFactoryTests.swift
  • Projects/Data/Tests/Auth/AuthClientFactoryTests.swift
  • Projects/Data/Sources/Auth/Repository/AuthRepositoryImpl.swift
  • docs/ARCHITECTURE.md
  • Projects/Data/Sources/Auth/Service/AuthTokenRefresher.swift
  • Projects/Data/README.md

Comment thread Projects/Data/Tests/Support/FailingKeychainStorage.swift
@gnoes-ios
gnoes-ios merged commit 835765a into dev Aug 5, 2026
3 checks passed
@gnoes-ios
gnoes-ios deleted the feature/auth-session-infra branch August 5, 2026 08:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 새로운 기능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant