문제 상황

Clean Architecture 적용 후 의존성 주입 복잡도 증가

Clean Architecture를 적용하면서 코드 품질은 향상되었지만, ViewController 생성이 복잡해졌습니다.

로그인 화면 생성 코드 (개선 전)

// SceneDelegate.swift
let networkManager = NetworkManager()
let keychainManager = KeychainManager()

let tokenRepository = TokenRepository(
    networkManager: networkManager,
    keychainManager: keychainManager
)
let loginRepository = LoginRepository(
    networkManager: networkManager
)
let socialLoginRepository = SocialLoginRepository(
    networkManager: networkManager,
    keychainManager: keychainManager
)

let loginUseCase = LoginUseCase(
    loginRepository: loginRepository,
    tokenRepository: tokenRepository
)
let socialLoginUseCase = SocialLoginUseCase(
    socialLoginRepository: socialLoginRepository,
    tokenRepository: tokenRepository
)

let loginViewModel = LoginViewModel(loginUseCase: loginUseCase)
let socialLoginViewModel = SocialLoginViewModel(socialLoginUseCase: socialLoginUseCase)

let loginViewController = LoginViewController(
    loginViewModel: loginViewModel,
    socialLoginViewModel: socialLoginViewModel
)

문제점

  1. 코드 중복: 모든 ViewController 생성 시 동일한 패턴 반복
  2. 가독성 저하: 의존성 체인이 길어질수록 코드 파악 어려움
  3. 테스트 어려움: Mock 객체로 교체하려면 모든 코드 수정 필요
  4. 실수 가능성: 의존성 순서를 잘못 지정하면 런타임 에러

DIContainer 구현

핵심 설계: Register/Resolve 패턴

의존성 주입 컨테이너의 패턴인 Register/Resolve를 채택했습니다.

핵심 개념

  1. Register (등록): 앱 시작 시 의존성을 미리 등록
  2. Resolve (해결): 필요할 때 등록된 의존성을 가져와 사용

1. DIContainer 핵심 구조

싱글톤 패턴 적용