[TIL / 25.03.13] 의존성 주입 (Dependency Injection)

2025. 3. 13. 16:44·iOS/Swift

1. 의존성 주입, 왜 할까?

개발을 하다 보면 코드 간의 의존성 문제로 인해 유지보수가 어려워지는 경우가 많습니다.

객체간에 강하게 참조를 할 경우나,, 어느 객체에서 한 객체를 직접 내부에서 인스턴스화해 쓰는 경우 쓰이던 객체가 만약 문제가 생긴다면?

그 문제는 그 객체만 해결해줄 게 아니라 그걸 직접 만들어 쓰고 있던 객체 측에서도 수정해줘야 합니다..!!

이렇게 한 객체가 타 객체에게 의존을 하게 되어 생기는 문제를 해결할 수 있도록 의존성 주입을 해줍니다

 

2. 의존성 주입은 어떻게 하나? 그리고 장점은?

class Guitar {
    func play() {
        print("대..충.. 기타치는 소리...")
    }
}

class Artist {
    var guitar = Guitar()
    
    func play() {
        print("연주 전 악기 세팅 하고")
        guitar.play()
    }
}

let artist1 = Artist()
artist1.play()

 

이 경우가 직접 객체의 인스턴스를 생성해서 쓰는 건데, 이렇게 되면 Artist는 Guitar 객체에 의존적이게 됩니다. Guitar에 문제가 생기면 연주자한테도 문제가 생겨요 !! 기타줄이 끊어진다던지...라는 비유는 이상하지만

 

그래서 저희는 Swift에서 중요한 기능인 protocol을 써주기로 했습니다 !! 이게 포인트

protocol GuitarProtocol {
    func play()
}

class AcousticGuitar: GuitarProtocol {
    func play() {
        print("감미로운 어쿠스틱 기타 소리...")
    }
}

class ElectricGuitar: GuitarProtocol {
    func play() {
        print("가슴이 웅장해지는 일렉 기타 소리...")
    }
}
 
class BassGuitar: GuitarProtocol {
    func play() {
        print("어? 베이스 기타 소리 왜 안들림...?")
    }
}

class Guitarist {
    var guitar: GuitarProtocol
    
    init(guitar: GuitarProtocol) {
        self.guitar = guitar
    }
    
    func play() {
        print("공연 시작")
        guitar.play()
    }
}

let acousticGuitar = AcousticGuitar()
let elecGuitar = ElectricGuitar()
let bassGuitar = BassGuitar()

let guitarist1 = Guitarist(guitar: acousticGuitar)
let guitarist2 = Guitarist(guitar: elecGuitar)
let guitarist3 = Guitarist(guitar: bassGuitar)

guitarist1.play()
guitarist2.play()
guitarist3.play()

 

의존성 주입을 위해선 두 가지를 지켜주면 되는데 첫번째로 프로토콜을 이용하도록 하는 것! 그리고 객체 주입을 내부에서 하지 않고 생성자를 통해 외부에서 주입하도록 하는 것!입니다

 

이렇게 하게 되면 기타리스트가 기타를 바꿔 치기에도 좋다...! 정도로 생각해주시면 좋을 것 같고 결국 전자의 경우와 다르게 의존성을 강하게 갖고 있지 않게 됩니다~!

 

위에서 보았듯이, 기타리스트 인스턴스를 생성할 때 기타의 인스턴스를 주입해주게 되는데 이게 가능해진다면 역시 테스트에도 용이할 수 밖에 없게 됩니다 !! 실제 인스턴스말고 해당 기능을 테스트하고 싶을 때 목데이터를 넣어둔 인스턴스를 주입해 테스트가 가능해진다는 것!

 

그리고 프로토콜을 따르게 되는 기타 안 메서드에서 어떠한 변화가 일어난다고 한들 기타리스트는 그저 그 기타를 연주할 뿐이기에 영향을 받지 않게 됩니다. 이는 코드의 유연성을 향상시킨다고 볼 수 있습니다.

 

3. 의존 역전 원칙(DIP)

의존성 주입이 나오면 꼭 의존 역전 원칙이라는 키워드가 나오게 되는데, 의존 역전 원칙이란 SOLID 원칙 중 하나로, 다음과 같은 두 가지 핵심 아이디어를 담고 있습니다.

 

1. 상위 모듈(기타리스트)은 하위 모듈(기타)에 의존해서는 안됩니다. 두 모듈 모두 추상화에 의존해야 합니다.

2. 추상화는 세부 사항에 의존해서는 안 됩니다. 세부 사항이 추상화에 의존해야 합니다. (이 부분은 프로토콜 원리를 이용한 부분을 말하는듯?)

 

자 그럼 이 의존성 주입을 하면 의존 "역전"이 왜 일어나게 되는가!!

 

맨 처음 설명드렸던 케이스에서의 의존 관계는,,, Artist(Guitarist) -> Guitar 의 의존성 방향을 가졌다면

의존 역전 원칙을 적용하면 의존성 방향이 역전됩니다. Guitarist -> GuitarProtocol <- ElectricGuitar, AcousticGuitar, BassGuitar

 

이렇게 되면 기타리스트의 요구사항에 맞춰 프로토콜을 설계할 것이고, 기타는 그 프로토콜의 요구사항을 따라야 하기에 내부 구현이 바뀔 겁니다.

 

4. 결론

의존성 주입은 코드의 유연성, 테스트 용이성, 그리고 유지보수성을 크게 향상시킬 수 있는 중요한 원칙입니다.

MVVM 아키텍처를 사용하는 경우, 각 레이어 간의 의존성을 관리하는 데 특히 유용합니다. (본인 사이드 플젝에서 이거 제대로 적용안하고 있었슴,,, 담에 적용해봐야지 !!)

 

이러한 원칙을 적용하면 코드가 더 모듈화되고, 테스트가 용이해지며, 장기적으로는 유지보수가 쉬워지는 장점이 있습니다.

 


지금보다 훨씬 못했던 시절에 친구들이 의존성 주입,, 의존성 하면 대충 에...? 난 말하는 감자요. 했었고 알아보려고 찾아보면 이해는 되는듯하면서 벽에 막히는 느낌이 들었는데, 이젠 좀 이해가 되는 걸 보니 나름 성장은 하고 있는갑다,,

사실 프로토콜을 많이 쓰면서 무의식적으로 쓰고있었을 수 있는데 앞으로 좀 의식적으로 습관에 적용해볼 수 있게 해야겠다 !!!

'iOS > Swift' 카테고리의 다른 글

[TIL / 25.03.18] 최적화(OptimizationTips) 1  (5) 2025.03.18
[TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)  (0) 2025.03.17
[TIL / 25.03.12] Alamofire Interceptor에 관한 문제 해결  (0) 2025.03.12
[TIL / 25.03.11] 에러 핸들링(Error Handling)  (2) 2025.03.11
[TIL / 25.03.05] 이미지 슬라이더 + 커스텀 인디케이터  (2) 2025.03.05
'iOS/Swift' 카테고리의 다른 글
  • [TIL / 25.03.18] 최적화(OptimizationTips) 1
  • [TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)
  • [TIL / 25.03.12] Alamofire Interceptor에 관한 문제 해결
  • [TIL / 25.03.11] 에러 핸들링(Error Handling)
subkyu-ios
subkyu-ios
subkyu-ios 님의 블로그 입니다.
  • subkyu-ios
    subkyu-ios 님의 블로그
    subkyu-ios
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • iOS (38)
        • Swift (38)
      • 내일배움캠프 (7)
      • Git, Github (3)
      • Algorithm (6)
      • 회고 (1)
      • 면접 질문 정리 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ios
    github
    KPT
    회고
    프로그래머스
    UIKit
    사전캠프
    내일배움캠프
    stackview
    본캠프
    의존성 주입
    Swift
    RxSwift
    Wil
    TableView
    til
    algorithm
    알고리즘
    tabman
    트러블슈팅
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
subkyu-ios
[TIL / 25.03.13] 의존성 주입 (Dependency Injection)
상단으로

티스토리툴바