의존성?

Jee.e (황지희)·2022년 6월 6일

나는 가능하면 Datasource와 Delegate를 따로 분리시켜 작업을 진행했다.
이번 미션을 진행하던 중, 도무지 어떻게 분리시켜야 하는지 모르겠는 상황에 맞닥뜨렸다.
리뷰어께 고민을 말씀드렸고, 의존성 이라는 키워드를 말씀해 주셨다.
의존성 을 정확히 알지 못한 체 학습을 하고 있었다고 느껴져, 이번 기회에 차근차근 학습해보려 한다.


의존성(Dependency)?

  • 말 그대로 함수에 필요한 클래스나, 참조 변수에 의존하는 것
  • 아래와 같이 하나의 객체가 다른 객체를 참조하며, 참조한 객체에 의존성이 생기는 것
  • 의존성을 갖는 코드가 많아지면, 재활용성이 떨어질 뿐만 아니라 매번 의존성을 갖는 객체들을 같이 수정해줘야 하는 문제가 생긴다.
class Jee {
    let major = "Visual Design"
}

class School {
    let student = Jee()
}

let school = School()
print("Jee의 전공은 \(school.student.major) 입니다.")



의존성 주입?

Dependency Injection : DI

  • 위와 같은 경우, 참조를 하고 있는 객체에 문제 발생(or 수정) 시 참조 했던 객체 또한 문제가 생긴다. 이러한 사항을 해결하기 위해 의존성 주입(DI)이 필요하다.
  • 위의 코드와 다르게 내부가 아닌 외부에서 의존성을 넣어주는 것(주입)

왜 의존성 주입을 해야하는 가?

  • 의존성에서 문제가 됐던, 재활용성 이라던가 한쪽에서 문제 발생시 의존하고 있던 모든 객체에 문제가 생기는 것을 방지해준다.
  • 객체간의 결합도가 낮아져, 유연한 코드 작성이 가능해진다.
  • Unit Test가 용이해진다.

의존성 주입을 하기 위해선, SOLID 중 하나인 DIP 를 알아야한다.




Dependency Inversion Principle

의존 관계 역전 법칙

  • 상위 레벨 모듈은 하위 레벨 모듈에 의존하면 안된다.
  • 둘 다 추상화된 인터페이스에 의존해야한다.
  • 추상 타입(프로토콜)은 구체타입(클래스)에 의존하면 안되고, 구체타입(클래스)은 추상타입(프로토콜)에 의존해야 한다.
protocol Major {
    var major: String { get }
}

class Jee: Major {
    let major = "Visual Design"
}

class School {
    let student: Major
    
    init (student: Major) {
        self.student = student
    }
}

let school = School(student: Jee())
print(school.student.major) // Visual Design

JeeMajor 를 상속받아, Major 에 값을 주입
School 의 내부 프로퍼티는 Major 를 가르켜, Jee의 값을 사용
Class 인 Jee와 SchoolProtocol인 Major 에 의존하고 있으며, 서로 완전 독립적인 객체가 된다.(구체타입끼리 의존하지 않음)

profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.

0개의 댓글