이전 섹션에서는 DI에 대해 생각하게 만드는 동기를, 또 느슨한 결합이 얼마나 중요한지와 인터페이스에 대한 프로그래밍이 어떻게 초석이 되는지 설명했습니다. 느슨한 결합이 이점이 있다고 확신한다면 모든 것을 느슨하게 결합하고 싶을 수도 있습니다.
전반적으로 좋은 생각입니다. 모듈을 패키징하는 방법을 결정해야 할 때 느슨한 결합은 특히 유용합니다.
***하지만 모든 것을 추상화하여 플러그형으로 만들 필요는 없습니다. ***
이 섹션에서는 종속성을 모델링하는 방법을 결정하는 데 도움이 되는 몇 가지 의사 결정 도구를 소개합니다.
모든 종속성을 동일하게 취급할 필요는 없습니다. 위험을 초래하지 않는 유형과 애플리케이션의 결합 정도를 강화할 수 있는 유형을 구분하는 방법을 아는 것이 중요합니다. 주로 후자에 집중하세요.
DI를 배우면서 종속성을 안정적인 종속성과 불안정한 종속성으로 분류하는 것이 도움이 될 수 있습니다. **Seam**을 어디에 배치할지 결정하는 것은 곧 자연스러운 일이 될 것입니다. 다음 섹션에서는 이러한 개념에 대해 더 자세히 설명합니다.
SEAM이란?
애플리케이션을 구성하는 부분들이 모여서 완성되는 부분을 말하며, 옷이 봉제선에서 조립되는 것처럼 각 부분의 이음매로부터 애플리케이션을 조립한다는 비유를 사용하고 있습니다.
Stable Dependencies
애플의 iOS 개발을 진행하면서 여러분은 다양한 기본 제공 라이브러리들. 즉 Foundation 라이브러리나 UIKit과 같은 모듈들을 자주 접하게 됩니다. 이러한 라이브러리들은 iOS 앱 개발의 기초가 되며 여러분이 앱을 구축할 때 필요한 표준 기능들을 간결하게 제공합니다. 예를 들면, UI 구성, 네트워킹, 데이터 관리 등의 기능을 말합니다.
이러한 모듈들은 애플리케이션의 모듈화 수준을 위협하지 않으며 오히려 이를 통해 코드를 간결하게 유지하면서 재사용성을 높일 수 있습니다. iOS 애플리케이션을 구동하기 위해서는 iOS SDK가 필요하고, 이는 이미 잘 구성된 모듈로서 병렬 개발의 복잡성을 줄여줍니다.
또한, 이러한 모듈은 다른 애플리케이션에서도 재사용될 수 있기 때문에 여러분의 코드 베이스를 확장하는 데 있어 큰 이점을 제공합니다.
기본적으로 iOS SDK 내에 정의된 대부분의 클래스나 모듈을 Stable Dependencies 로 볼 수 있습니다. 이들은 이미 잘 구성되어 있고 새 버전의 iOS에도 호환되며, 호출했을 때 예측 가능한 결과를 반환하기 때문입니다.
대부분의 Stable Dependencies 요소는 iOS의 기본 클래스일 것이나, 여러분이 다른 라이브러리를 참조할 때도 이러한 안정성을 찾을 수 있습니다. 이러한 안정 종속성을 평가할 때는 다음과 같은 기준을 고려할 수 있습니다.
- 클래스나 모듈이 이미 존재하고 널리 사용됩니다.
- 새 버전의 iOS에서 API가 크게 바뀌지 않을 것으로 예상됩니다.
- 해당 클래스나 모듈은 결정론적이며, 같은 입력에 대해 일관된 출력을 제공합니다.
- 여러분이 해당 기능을 수정하거나 변경할 필요 없이 그대로 사용할 수 있습니다.
특정 분야의 애플리케이션 개발. 예를 들어 화학 앱을 개발하는 경우에는 화학 계산을 위한 특수 알고리즘을 캡슐화하는 타사 라이브러리를 참조할 수 있습니다.
이러한 라이브러리는 복잡한 화학 알고리즘을 단순화하여 개발자가 쉽게 화학 데이터를 처리할 수 있게 해주며 iOS 앱의 모듈화를 촉진하는 안정적인 종속성으로서 기능합니다.
안정적인 종속성은 개발 과정을 간소화하고 애플리케이션의 유지보수성과 확장성을 높여주는 중요한 요소입니다.
특정 디컨테이너를 기반으로 애플리케이션을 만들기로 결정하면 애플리케이션의 전체 수명 기간 동안 이 선택에 얽매이게 될 위험이 있습니다. 이것이 바로 컨테이너 사용을 애플리케이션 엔트리 포인트로 제한해야 하는 또 다른 이유입니다.
엔트리 포인트에서만 DI Container를 참조해야 합니다.
일반적으로 종속성은 제외하면 안정적인 것으로 간주할 수 있습니다. 변동성이 없다면 안정적이라고 할 수 있습니다.
Volatile Dependencies
변동성 의존성(Volatile Dependency)은 애플리케이션의 안정성과 유연성에 부정적인 영향을 미칠 수 있는 의존성을 말합니다.
iOS 개발에 있어서 이는 예측 불가능하거나 변경 가능성이 높은 외부 요소에 대한 의존을 의미합니다. 예를 들어, 외부 서버, 데이터베이스, 파일 시스템 또는 아직 개발 중인 라이브러리 등이 이에 해당됩니다.
여기서 '심(Seam)'이란 애플리케이션 내에서 의존성을 분리하는 경계를 말합니다. 의존성 주입(Dependency Injection, DI)을 사용하여 이러한 변동성 의존성을 관리함으로써, 애플리케이션의 모듈을 느슨하게 결합하고 테스트 용이성을 높일 수 있습니다.
변동성 의존성은 다음과 같은 특징을 가질 때 식별할 수 있습니다
- - 의존성이 애플리케이션의 실행 환경에 특별한 요구 사항을 도입하는 경우, 예를 들면 앱이 특정한 외부 서버에 연결해야 하는 상황.
- - 의존성이 아직 개발 중이거나 존재하지 않아 앱이 불완전한 상태인 경우.
- - 모든 개발 기기에 설치되지 않은 비싼 서드파티 라이브러리에 대한 의존성이 있는 경우.
- - 의존성이 비결정적인 동작을 포함하고 있어 테스트가 어려운 경우, 예를 들면 날짜와 시간에 의존하는 로직.
iOS 개발에서는 이런 변동성 의존성을 관리하기 위해. 예를 들면 네트워크 호출이나 데이터베이스 액세스를 추상화 계층 뒤에 숨기고 이를 프로토콜과 같은 추상 타입을 통해 접근합니다.
그리고 실제 네트워킹이나 데이터베이스 로직은 애플리케이션의 다른 부분과 분리하여 구현합니다. 이렇게 함으로써 필요한 경우 다른 구현으로 쉽게 교체할 수 있으며 테스트하기도 용이해집니다.
이러한 변동성 의존성은 DI를 사용하여 관리하며, 이를 통해 애플리케이션의 유연성을 향상시키고 테스트 가능성을 보장하며 느슨한 결합을 유지할 수 있습니다. 즉, iOS 개발에서는 변동성 의존성을 DI를 통해 관리하여 앱이 외부 변화에 더 잘 적응하고, 유지보수가 용이하며 확장 가능하도록 만들 수 있습니다.
이제 안정적 종속성과 변동성 종속성의 차이점을 이해했으니 DI 범위의 윤곽이 보이기 시작할 것입니다. 느슨한 결합은 널리 퍼져 있는 설계 원칙이므로 DI는 코드 베이스의 모든 곳에 있어야 합니다.
'Dependency Injection' 카테고리의 다른 글
Dependency Injection - Chapter1 마지막(DIScope, Summary) (0) | 2024.02.06 |
---|---|
DependencyInjection : (간단한 예제와 DI 이점) (1) | 2024.01.28 |
DependencyInjection - What, Why, and How(Understanding Perpose of DI, Petterns) (0) | 2024.01.21 |
DependencyInjection - What, Why, and How (DI에 대한 오해) (0) | 2024.01.21 |