내일배움캠프 14일차

임클·2025년 3월 20일

내일배움캠프

목록 보기
14/44
post-thumbnail

일정


Swift Protocol을 활용한 의존성 주입 (Dependency Injection)

Swift에서 Protocol을 활용하여 의존성 주입(Dependency Injection, DI)을 구현하는 방법을 정리해보았다.

1. 의존성 주입이란?

의존성 주입이란 객체 간의 강한 결합을 줄이고 유연성을 높이기 위해 필요한 객체를 외부에서 주입하는 기법이다. 이를 통해 테스트가 용이해지고 유지보수가 쉬워진다.

2. Protocol을 활용한 의존성 주입

Protocol을 사용하면 구체적인 구현체가 아닌 추상적인 인터페이스에 의존하게 만들어 결합도를 낮출 수 있다.

예제 코드

1) 프로토콜 정의

protocol PNetworkService {
    func fetchData(completion: @escaping (String) -> Void)
}

2) 실제 구현체

class NetworkService: PNetworkService {
    func fetchData(completion: @escaping (String) -> Void) {
        // 네트워크 요청을 가정한 더미 데이터 반환
        completion("Fetched Data from API")
    }
}

3) 의존성을 주입받는 클래스

class DataManager {
    private let networkService: PNetworkService

    init(networkService: PNetworkService) {
        self.networkService = networkService
    }

    func loadData() {
        networkService.fetchData { data in
            print("Received Data: \(data)")
        }
    }
}

4) 의존성 주입하여 사용하기

let networkService = NetworkService()
let dataManager = DataManager(networkService: networkService)
dataManager.loadData()

3. 의존성 주입의 장점

  • 테스트 용이성 증가: Mock 객체를 활용하여 테스트할 수 있음
  • 유연성 증가: 코드 변경 없이 다른 구현체로 쉽게 교체 가능
  • 결합도 감소: 특정 클래스가 특정 구현체에 강하게 의존하지 않음

4. 유닛 테스트를 위한 Mock 객체 활용 예제

class MockNetworkService: PNetworkService {
    func fetchData(completion: @escaping (String) -> Void) {
        completion("Mock Data for Testing")
    }
}

let mockService = MockNetworkService()
let testDataManager = DataManager(networkService: mockService)
testDataManager.loadData() // "Received Data: Mock Data for Testing" 출력

5. 프로토콜 확장을 활용한 기본 구현 제공

프로토콜 확장을 사용하면 기본 구현을 제공하여 코드 중복을 줄일 수 있다.

extension PNetworkService {
    func fetchData(completion: @escaping (String) -> Void) {
        completion("Default Fetched Data")
    }
}

class DefaultNetworkService: PNetworkService {}

let defaultService = DefaultNetworkService()
defaultService.fetchData { data in
    print("Default Implementation: \(data)")
} // "Default Implementation: Default Fetched Data" 출력

0개의 댓글