행복한 세상의 니노

의존성, 종속성, 그리고 프로토콜 본문

IOS

의존성, 종속성, 그리고 프로토콜

니노z 2025. 6. 21. 00:13

iOS 개발에서 자주 마주치는 '의존성', '종속성', '프로토콜' 개념은 코드의 유지보수성과 테스트 편의성을 좌우하는 핵심입니다.
의존성이 왜 생기는지, 종속성과의 차이는 뭔지, 그리고 왜 프로토콜이 중요한지를 실제 코딩 흐름과 함께 정리합니다.

* 시작

class ProfileViewModel {
    let api = APIService()
}

처음엔 그냥 이렇게 APIService를 직접 만들어 썼어요.
그런데 테스트하려고 하다 보니 막혔어요.

“가짜 API로 바꿔서 테스트하고 싶은데… 이걸 어떻게 바꾸지?”

그때 처음 접한 개념이 의존성(Dependency) 이었어요.
처음엔 단어 뜻부터 너무 어려웠고, 왜 바꿔야 하는지도 모르겠더라고요.

 

*  의존성이란?

어떤 객체가 다른 객체 없이는 동작할 수 없는 상태

위 코드에선 ProfileViewModel이 APIService 없이는 기능을 못 해요.
→ 즉, APIService에 의존하고 있다는 거죠.

 

* 종속성이란?

의존이 너무 강한 상태 → 코드를 바꾸기 힘들어지는 구조

  • APIService가 바뀌면 ViewModel도 바꿔야 해요
  • 테스트할 때 진짜 서버랑 연결되어야 해서 느리고 불안정해요

→ 이런 걸 강하게 결합되어 있다고 해서 종속성(Tight Coupling)이라고 불러요.

 

*  의존성은 없애야 할까?

아니요.
기능이 있는 코드라면 어딘가에 의존하는 건 당연한 일이에요.

예: 로그인 화면 → 서버 요청 → 응답 받아서 UI 업데이트
→ 이 흐름은 APIService에 의존할 수밖에 없죠.

그래서 의존성이 생기는 건 괜찮고,
그걸 잘 관리하는 게 더 중요해요.

 

* 그럼 어떻게 관리하는거지?

그 해답 중 하나가 바로 프로토콜(Protocol) 이에요.

 

* 프로토콜이란?

“이런 함수는 반드시 있어야 해!” 라는 규칙

protocol APIServicing {
    func fetchProfile() -> User
}

이건 fetchProfile()을 반드시 구현해야 한다는 약속이에요.

 

* 구현

class APIService: APIServicing {
    func fetchProfile() -> User {
        return User(name: "실제 유저")
    }
}

이제 APIService는 APIServicing 프로토콜을 따르는 구현체가 됐어요.

 

* ViewModel에서의 느슨한 결합

class ProfileViewModel {
    let api: APIServicing

    init(api: APIServicing) {
        self.api = api
    }

    func load() {
        let user = api.fetchProfile()
        print(user.name)
    }
}

ViewModel은 “넌 fetchProfile()만 있으면 돼.
그걸 누가 구현했는지는 몰라도 돼.” 라는 구조가 된 거죠.

이걸 느슨한 결합(Loosely Coupled)이라고 해요.

 

* 제가 제일 헷갈렸던 부분

처음엔 이게 너무 이해 안 됐어요.

“아니... api.fetchProfile()을 부르는데 그 안에 코드도 없고 그냥 약속만 있는데,그럼 도대체 누가 실행하는 거지?”

진짜 실행은, 우리가 init으로 넣어준 클래스(APIService)가 해요.

let viewModel = ProfileViewModel(api: APIService())

→ 실제로 어떤 객체가 실행할지는 앱이 실행될 때 결정되는 거예요.

 

* 정리

개념 의미 요약
의존성 객체가 다른 객체에 기대서 동작함 “너 없인 못 살아”
종속성 너무 강하게 묶여서 변경·테스트 힘듦 “같이 망함”
느슨한 결합 역할만 알고 구현은 모름 “약속만 지켜줘”
프로토콜 클래스 간 약속 / 인터페이스 “이 함수 있어야 해”

 

⭐️ 마무리

처음엔 그냥 ViewModel에서 필요한 객체를 직접 만들어 썼어요.
근데 점점 테스트도 어렵고, 구조도 유연하지 않다는 걸 느꼈어요.

그러다 프로토콜과 느슨한 결합, 의존성의 개념을 배우면서 코드를 바꾸지 않고도 확장할 수 있는 구조를 만들 수 있게 됐습니다ㅠ

아직 부족한 점이 많지만.. 배워갈꺼에요!! 

 

틀린점이 있다면 알려주세요!!

반응형