Dependency

API Client나 Data Service 같은 외부 의존성을 주입해야하는 부분에 사용됩니다. 이는 Client 를 완전히 분리해서 구현 할 수 있는 장점이 있고 테스트 환경에도 쉽게 적용이 가능해 로직이 집중되어 있는 곳을 정리할 수 있습니다.

Usage

1. DependencyValue에 필요한 타입을 등록한다

extension DependencyValues {
  var someClient: SomeClient {
    get { self[SomeClient.self] }
    set { self[SomeClient.self] = newValue }
  }
}

2. DependencyKey 프로토콜을 사용해 liveValue 를 구현한다

struct SomeClient {
  // API 정의
  var fetch: @sendable () async -> Result<[SomeItem], ErrorTypeValue>
}

extension SomeClient: DependencyKey {
  static let liveValue: Self = {
    let client = SomeClient()

    return client 
  }
}

3. previewValue, testValue 를 구현하면 테스트나 프리뷰등의 상황에서 쉽게 데이터 전환이 가능하다

extension SomeClient: DependencyKey {
  static var testValue: Self(
    someParam: SomeParam
  )
}

4. 사용할 Reducer내부에 선언하여 사용해준다

@Dependency(\.someClient) var someClient

Reference

https://medium.com/naverfinancial/%EB%84%A4%EC%9D%B4%EB%B2%84%ED%8E%98%EC%9D%B4-%EC%9B%8C%EC%B9%98%EC%95%B1-tca-%EC%A0%81%EC%9A%A9%EA%B8%B0-655f1d1b8c23