swift 복습

의존성 주입

섭섭's 2024. 11. 17. 18:27

의존성은 객체가 다른 객체에 의존하여 동작하는 경우를 뜻합니다.

 

예시들 들어 ViewModel이 네트워크 요청을 처리하는 NetworkManager에 의존하는 상황을 생각할 수 있습니다.

 

이러한 의존성을 관리하는 방식이 의존성 주입 입니다.

 

의존성 주입을 요약하면 객체가 의존성을 직접 생성하거나 관리를 하지 않고, 외부에서 주입받아 사용하는 것 입니다.


 

의존성 주입이 필요한 이유?

 

1.결합도를 낮추기 위하여

 

객체가 만약 의존성을 직접 생산해버린다면 객체들 간의 결합도가 높이자고 코드변경이 어려워집니다.

 

만약, 특정 클래스에서 네트워크 요청을 처리하기 위해 특정 라이브러리를 사용한다고 생각해 볼 때

 

라이브러리를 교체하거나 기능을 확장하기 위해선 해당 클래스의 코드를 수정해야 합니다.

 

이러면 유지보수와 유연성이 저해됩니다.

 

하지만 의존성 주입을 사용하면 객체가 필요한 의존성을 외부에서 제공 받을 수 있기 때문에 내부 구현을 수정하지

 

않고 새로운 의존성을 교체하거나 확장할 수 있습니다. 

 

이렇게 하면 코드의 모듈성도 올라가고 프로젝트의 구조도 더욱 유연해 집니다.

 

2.테스트의 용이성을 위해

 

객체가 의존성을 외부에서 주입받는 구조면, 실제 구현 대신 Mock 객체를 주입하여 테스트 환경을 구성 가능합니다.

 

예를들어, 실제  API 호출 대신에 테스트 전용 네트워크 객체를 주입하여 예상결과를 확인 할 수 있습니다.

 

3.역할 분리와 책임 명백화

 

의존성 주입은 객체의 책임을 명확히 분리합니다.

 

객체는 자신의 역할에만 집중하고 의존성 관리와같은 부수적인 작업은 외부에서 처리합니다.

 

이렇게 하면 객체의 단일 책임 원칙이 지켜지고, 코드가 더욱 직관적이며 이해하기 쉬워집니다.


 

의존성 주입의 방식

1. 생성자 주입:

 

객체 생성 시 의존성을 생성자 파라미터로 전달받는 방식입니다. 의존성이 객체의 필수 요구 사항인 경우 사용되며, 설계의 명확성을 높여줍니다.

 

//주입이 없는 예
class Profile {
    let name = Name(firstName: "kim", lastName: "sub")
}

// 주입 예
class Profile {
    let name: Name

    init(name: Name) {
        self.name = name
    }
}

 

2.속성 주입

 

객체가 생성된 후 의존성을 속성을 통해 설정하는 방식입니다. 의존성이 선택적이거나, 객체 생성 시점 이후에 주입해야 할 필요가 있는 경우에 유용합니다.

// 주입이 없는 예
class Profile {
    var name = Name(firstName: "kim", lastName: "sub")
}

// 주입 예시
class Profile {
    var name: Name?

    func setName(_ name: Name) {
        self.name = name
    }
}

 

 

 

3.메서드 주입

특정 메서드 호출 시 의존성을 전달받는 방식입니다. 주로 단발성 작업이나 특정 상황에서만 의존성이 필요한 경우에 사용됩니다.

// 주입 하지 않은 예
class Profile {
    func printName() {
        let name = Name(firstName: "John", lastName: "Doe")
        print(name)
    }
}

//  주입 예시
class Profile {
    func printName(using name: Name) {
        print(name)
    }
}

 


 

iOS에서의 의존성 주입 활용

1.네트워크 계층관리

 

네트워크 요청을 처리하는 객체(NetworkManager 등)는 앱의 핵심 구성 요소 중 하나입니다.

 

이를 의존성 주입으로 관리하면, 실제 API 호출 대신 Mock 객체를 사용하여 네트워크 요청을 테스트하거나

 

네트워크 계층의 구현을 교체할 때 다른 코드에 영향을 주지 않고 변경할 수 있습니다.

 

 

2.데이터 저장소와 서비스 객체

 

CoreData나 UserDefaults 같은 데이터 저장소를 사용하는 경우

 

이를 주입받아 관리하면 앱의 다른 부분에서 해당 저장소에 직접 접근하는 일을 줄이고

 

저장소의 변경이 앱 전체에 영향을 미치지 않도록 할 수 있습니다.

 

3.화면 간 의존성 전달

 

ViewController 간에 데이터를 전달하거나 특정 서비스를 사용하는 경우에도

 

의존성 주입을 통해 화면 간 결합도를 줄이고, 필요한 의존성만 전달함으로써 코드의 가독성을 높일 수 있습니다.

'swift 복습' 카테고리의 다른 글

CoreData -2  (1) 2024.11.10
CoreData와 객체그래프 - 1  (5) 2024.11.10
Unit test  (0) 2024.10.11
Combine의 개념  (0) 2024.10.06
MVVM 디자인 패턴  (0) 2024.09.22