의존성?

Jee.e (황지희)·2022년 6월 6일
0
post-custom-banner

나는 가능하면 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 개발자입니다.
post-custom-banner

0개의 댓글