0Pricing
TypeScript Academy · 강의

생성자 주입

생성자를 통해 의존성을 깔끔하게 주입합니다.

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

생성자 주입 자세히 살펴보기

생성자 주입은 모든 의존성을 생성자 매개변수로 선언합니다. 객체가 생성되는 순간 완전히 연결되므로, 필수 협력 객체를 빠뜨릴 수 없습니다.

매개변수 프로퍼티

TypeScript에서는 매개변수에 접근 제어자를 사용하여 한 단계로 의존성을 선언하고 할당할 수 있습니다. private readonly를 사용하면 필드가 자동으로 생성되고 할당됩니다.

interface Mailer { send(to: string, body: string): void; }
class Notifier {
  constructor(private readonly mailer: Mailer) {}
}

인터페이스 기반 의존성

클래스가 아닌 인터페이스에 의존하면 사용하는 쪽이 특정 구현체와 분리됩니다. 인터페이스와 일치하는 어떤 객체든 제공할 수 있습니다.

interface Mailer { send(to: string, body: string): void; }
class SmtpMailer implements Mailer {
  send(to: string, body: string) { console.log("SMTP ->", to); }
}

구성 루트에서 연결하기

객체 그래프를 생성하는 위치를 구성 루트라고 합니다. 이곳에서 구체적인 구현체를 선택하고 주입합니다.

class Notifier {
  constructor(private readonly mailer: Mailer) {}
  notify(to: string) { this.mailer.send(to, "hello"); }
}
const app = new Notifier(new SmtpMailer());
app.notify("a@b.com");

구현체 바꾸기

의존성이 인터페이스이므로 Notifier를 건드리지 않고도 완전히 다른 구현체를 제공할 수 있습니다. 이것이 DI가 제공하는 핵심적인 유연성입니다.

class FakeMailer implements Mailer {
  sent: string[] = [];
  send(to: string) { this.sent.push(to); }
}
const fake = new FakeMailer();
new Notifier(fake).notify("x@y.com");
console.log(fake.sent); // ["x@y.com"]

실제 입출력 없이 테스트하기

fake 메일러를 주입하면 실제 이메일을 보내지 않고도 테스트에서 전송되었을 내용을 검증할 수 있습니다. 테스트가 빠르고 결정적이며 격리됩니다.

const fake = new FakeMailer();
new Notifier(fake).notify("test@site");
console.log(fake.sent.length === 1); // true

여러 의존성

필요한 만큼 의존성을 나열하시면 됩니다. 각 의존성이 명시적이고 타입이 지정되며 필수이므로 클래스에 필요한 항목을 한눈에 파악할 수 있습니다.

interface Logger { log(m: string): void; }
class Notifier {
  constructor(
    private readonly mailer: Mailer,
    private readonly logger: Logger,
  ) {}
}

readonly로 재할당 방지하기

주입된 필드를 readonly로 표시하면 객체의 수명 동안 해당 필드를 바꿀 수 없으므로 협력 객체가 안정적이고 예측 가능하게 유지됩니다.

class Notifier {
  constructor(private readonly mailer: Mailer) {}
  // this.mailer = ... would be a compile error
}

내부에 숨겨진 new 없음

생성자 주입을 사용하는 클래스는 협력 객체를 내부에서 new로 생성해서는 안 됩니다. 모든 의존성이 생성자를 통해 들어오므로 결합 관계가 명시적으로 유지됩니다.

필수와 선택 사항

필수 의존성은 생성자에 두어야 합니다. 정말 선택적인 의존성은 아무 작업도 하지 않는 구현체를 기본값으로 사용할 수 있으며, 이 구현체도 내부에서 만들지 않고 전달해야 합니다.

const noopLogger: Logger = { log() {} };
new Notifier(new SmtpMailer(), noopLogger);

이점 요약

생성자 주입을 사용하면 의존성이 명시적이 되고, 객체가 완전히 초기화되며, 구현체를 바꿀 수 있고, 테스트가 간단해집니다. 이것이 생성자 주입이 기본 DI 스타일로 널리 사용되는 이유입니다.

간단 확인

이 레슨을 간단히 확인해 보겠습니다.

복습

생성자 주입은 인터페이스로 타입이 지정된 의존성을 매개변수로 선언하며, 흔히 private readonly를 사용합니다. 구성 루트에서 구현체를 선택하고, 테스트에서는 fake를 전달합니다. 객체는 항상 완전히 연결되며 클래스를 수정하지 않고도 협력 객체를 바꿀 수 있습니다.

자주 묻는 질문

“생성자 주입” 강의는 무료인가요?

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

“생성자 주입”에서 뭘 배우나요?

생성자를 통해 의존성을 깔끔하게 주입합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“생성자 주입” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 제어 반전 기초
  2. 생성자 주입
  3. InversifyJS를 사용한 DI 컨테이너
  4. 타입 안전한 서비스 토큰
← TypeScript Academy(으)로 돌아가기