---
# System prepended metadata

title: ' iOS interview 10 '
tags: ["\U0001F4BB 면접 질문"]

---

<h1><center> iOS interview 10 </center></h1>

###### tags: `💻 면접 질문`
###### date: `2025-11-0217:21:33.284Z`

> [iOS interview](https://github.com/JeaSungLEE/iOSInterviewquestions)

## 근황

https://skillbuilder.aws/

- 바쁘게 지냈어요!
- 지난주 이력서 어떻게 쓰면 좋을까?
  - 이런 저런 일들 다 일단 써보고(리스트업)
  - 정리해 나가보자
  - (하지만 아직 못했어요..)

## 목표

(지난 숙제)

- DI에서 라이브러리가 정말 필요할까?
- Needle
- DI에서 객체의 생성주기
- DIContainer에 register하는 여러 객체간의 의존성 관리 >> Needle, Swinject > Assembly < SwiftUI??
- **swift-dependencies** > TCA에서 제공하는 것 | TCA가 거의 표준... > 모르고 쓰는 사람도 많아...

``` swift
protocol Network {
    func request()
}

// DependencyKey 정의
struct CoreDependecnyKey: DependencyKey {
    
    let network: Network
    let hello: () -> ()
    
    /// DependencyKey 프로토콜 채택하기 위한 값
    /// 이 값 자체가 static이니깐 객체가 계속 살아있는 것이다!!
    static let liveValue: CoreDependencyKey = {
        @Dependency(\.token) var token
        
        // 값 타입, 참조타입을 왜 더 신경쓰게 된 걸까요?
        return CoreDependencyKey(
            // 아예 생성을 해버림, 앱 실행부터 끝까지 살아있음
            network: NetworkImpl(token: token), 
            // Swinject와 같이 객체 생성주기를 조절할 수 없음
            // Swinject는 register시에 singleton 살릴래..? 아니면 사용처에서 잠깐 살게 둘래..? - inobjectscope
            hello: {
                print("Hello world!!")
            }
        )
    }()
    
    /// 테스트
    static let testValue: CoreDependencyKey = {
        return CoreDependencyKey(
        )
    }()
}

// Swift-Dependency에 등록
extension DependecnyValues {
    var core: DependencyKey { // 여기서 DependencyKey의 liveValue
        get { self[CoreDependencyKey.self] }
        set { self[CoreDependencyKey.self] = newValue }
    }
    
    var coreTest: DepencyKey {
        get { self[CoreDependencyKey.self] }
        set { self[CoreDependencyKey.self] = newValue }
    }
}

/// 사용처
@Dependency(\.core.network) var network // 수평적 확장
// 이게 권장하는 표현
@Dependency(\.core) var core
core.hello()

@Reducer struct HelloReducer {
    
    @ObservableState
    struct State { }
    
    enum Action {
        case hello
    }
    
    @Dependency(\.core) var core
    @Dependency(\.core.network) var network
    
    var body: some ReducerOf<Self> {
        Reduce { state, action in
            switch action {
                case .hello:
                    return .run { send in
                     core.hello()
                }
            }
        }
    }
}
@Observable
class Hello {
    @ObservedIgnored
    @Dependency(\.core)
    var core
}
```

1. 자유도가 너무 높아... 좀 어려워...
2. 테스트를 고려해서 설계가 되어있다. - 굿굿
3. 쓰기 편함


### 무엇을 할 것 인가?
- 면접에서 말

#### Lifecycle 요약
**1. Transient**
서비스 컨테이너에서 요청할 때마다 생성된다.
간단한 Stateless 서비스에 적합하다.
**2. Scoped**
클라이언트의 요청부터 응답까지 유지된다.
클라이언트마다 생성되므로 연결되는 클라이언트 수 만큼 존재될 수 있다.
**3. Singleton**
클라이언트 요청과 관계 없이 웹서비스 시작될 때부터 종료될 때까지 유지된다.
클라이언트가 많아도 오직 1개의 서비스를 제공한다.
종료될 때까지 메모리가 해제되지 않으므로 메모리 사용을 고려해야 한다.