0Pricing
Swift Academy · 강의

의존성 주입이 필요한 이유

테스트하기 쉽도록 생성과 사용을 분리합니다.

의존성 주입이 필요한 이유은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

의존성 주입이 필요한 이유

의존성 주입(DI)은 객체가 필요한 것을 스스로 만들게 하지 않고 외부에서 전달하는 방식입니다. 이를 통해 구성 요소 간의 결합도를 낮추고 테스트하기 쉽게 만들 수 있습니다.

문제: 강한 결합

어떤 타입이 협력 객체를 직접 만들면 구체적인 클래스에 종속되어 재구성할 수 없고, 다른 부분과 분리해서 테스트할 수도 없습니다.

class Logger {
    func log(_ m: String) { print("LOG: \(m)") }
}
class Service {
    let logger = Logger() // hard-coded dependency
    func run() { logger.log("running") }
}
Service().run()

결합도가 테스트를 어렵게 만드는 이유

Service가 항상 실제 Logger를 만들기 때문에 테스트에서 로깅 출력을 가로채거나 가짜로 바꿀 수 없습니다. 외부에서는 이 의존성을 알 수 없습니다.

class Logger { func log(_ m: String) { print(m) } }
class Service {
    let logger = Logger()
    func run() { logger.log("hello") }
}
// No way to swap Logger here.
Service().run()

해결책: 주입하기

대신 의존성을 외부에서 전달하세요. 호출하는 쪽이 제공할 구현을 결정하므로 Service는 더 이상 이를 신경 쓰지 않습니다.

class Logger { func log(_ m: String) { print("LOG: \(m)") } }
class Service {
    let logger: Logger
    init(logger: Logger) { self.logger = logger }
    func run() { logger.log("running") }
}
Service(logger: Logger()).run()

결합도 감소의 이점

주입을 사용하면 동일한 Service를 코드 변경 없이 실제 환경이나 테스트에서 서로 다른 로거와 함께 사용할 수 있습니다.

class Logger { var lines: [String] = []
    func log(_ m: String) { lines.append(m) } }
class Service {
    let logger: Logger
    init(logger: Logger) { self.logger = logger }
    func run() { logger.log("event") }
}
let l = Logger()
Service(logger: l).run()
print(l.lines)

단일 책임

DI는 단일 책임 원칙을 뒷받침합니다. 타입은 자신의 작업에 집중하고 다른 관심사는 주입된 협력 객체에 위임합니다.

struct Mailer { func send(_ to: String) { print("Mail to \(to)") } }
struct SignupFlow {
    let mailer: Mailer
    func register(_ email: String) { mailer.send(email) }
}
SignupFlow(mailer: Mailer()).register("a@b.com")

유연성

객체를 새로운 방식으로 조합할 수 있습니다. App의 가장자리에서 연결 구성을 처리하면 핵심 코드를 유연하게 유지할 수 있습니다.

struct Engine { let power: Int }
struct Car {
    let engine: Engine
    func describe() { print("Power: \(engine.power)") }
}
Car(engine: Engine(power: 200)).describe()
Car(engine: Engine(power: 90)).describe()

명시적인 의존성

의존성을 나열하는 초기화 메서드는 해당 타입에 정확히 무엇이 필요한지 설명합니다. 내부에서 직접 만든 숨겨진 의존성은 이러한 계약을 감춥니다.

struct Repo { func load() -> [Int] { [1, 2, 3] } }
struct Report {
    let repo: Repo // visible dependency
    func total() -> Int { repo.load().reduce(0, +) }
}
print(Report(repo: Repo()).total())

직접 생성보다 조합

DI는 객체를 외부에서 조합하는 방식을 선호합니다. 작은 조합 루트에서 객체 그래프를 구성하고, 나머지 코드는 필요한 것을 전달받기만 합니다.

struct DB { func count() -> Int { 42 } }
struct Stats { let db: DB; func show() { print(db.count()) } }
// Composition root:
let app = Stats(db: DB())
app.show()

큰 App에만 필요한 것은 아닙니다

아주 작은 프로그램에서도 이점을 얻을 수 있습니다. 의존성을 주입하면 추가 프레임워크 없이 동작을 바꿔 끼울 수 있고 의도도 분명해집니다.

struct Clock { func now() -> Int { 12 } }
struct Greeter {
    let clock: Clock
    func greet() { print(clock.now() < 12 ? "Morning" : "Afternoon") }
}
Greeter(clock: Clock()).greet()

프레임워크는 필요하지 않습니다

Swift에서 DI에는 라이브러리가 필요하지 않습니다. 일반적인 초기화 메서드와 프로토콜이면 충분합니다. 다음 수업에서는 생성자 주입, 프로토콜, 모의 객체를 살펴봅니다.

struct Adder { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct Calc {
    let adder: Adder
    func run() { print(adder.add(2, 3)) }
}
Calc(adder: Adder()).run()

빠른 확인

의존성 주입의 핵심 개념은 무엇인가요?

복습

의존성 주입은 협력 객체를 내부에서 직접 만드는 대신 외부에서 제공하여 결합도를 낮추고 의존성을 명확하게 하며 테스트를 가능하게 합니다. Swift에서는 프레임워크가 필요하지 않습니다. 다음에는 가장 일반적인 방식인 생성자 주입을 살펴봅니다.

자주 묻는 질문

“의존성 주입이 필요한 이유” 강의는 무료인가요?

네 — “의존성 주입이 필요한 이유” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“의존성 주입이 필요한 이유”에서 뭘 배우나요?

테스트하기 쉽도록 생성과 사용을 분리합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“의존성 주입이 필요한 이유” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 의존성 주입이 필요한 이유
  2. 생성자 주입
  3. 프로토콜 기반 추상화
  4. 테스트에서 의존성 모의 객체 만들기
← Swift Academy(으)로 돌아가기