0Pricing
TypeScript Academy · 강의

제어 반전 기초

의존성을 반전해야 하는 이유와 시점을 이해합니다.

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

직접 생성한 의존성

클래스가 new로 협력 객체를 직접 만들면 구체적인 타입과 강하게 결합됩니다. 따라서 클래스를 다시 구성하거나 테스트하기가 어려워집니다.

강하게 결합된 예시

여기서는 서비스가 자체적으로 로거를 만듭니다. 클래스를 수정하지 않고는 다른 로거로 바꿀 방법이 없습니다.

class ConsoleLogger { log(m: string) { console.log(m); } }
class OrderService {
  private logger = new ConsoleLogger(); // hard-coded
  place() { this.logger.log("order placed"); }
}
new OrderService().place();

제어의 역전이란 무엇인가

제어의 역전(IoC)은 의존성을 누가 결정하는지를 뒤집습니다. 클래스가 의존성을 만드는 대신 외부의 무언가가 제공합니다. 클래스는 필요한 것을 선언하고 전달받습니다.

의존성 주입

의존성 주입(DI)은 IoC를 구현하는 일반적인 방법입니다. 협력 객체를 내부에서 생성하지 않고 외부에서 전달합니다. 어떤 구현체를 사용할지는 호출하는 쪽에서 제어합니다.

주입을 적용한 버전

이제 로거가 외부에서 제공됩니다. 서비스는 어떤 구체적인 로거를 받았는지 알 필요도 없고 관심을 가질 필요도 없습니다.

class OrderService {
  constructor(private logger: { log(m: string): void }) {}
  place() { this.logger.log("order placed"); }
}
new OrderService(new ConsoleLogger()).place();

IoC가 테스트 용이성을 높이는 이유

의존성이 외부에서 들어오므로 테스트에서 fake나 스파이를 전달할 수 있습니다. 실제 입출력, 데이터베이스 또는 네트워크 호출 없이 동작을 검증할 수 있습니다.

const calls: string[] = [];
const fakeLogger = { log: (m: string) => calls.push(m) };
new OrderService(fakeLogger).place();
console.log(calls); // ["order placed"]

추상화에 의존하기

IoC는 클래스가 구체적인 클래스가 아닌 인터페이스에 의존할 때 가장 잘 작동합니다. 인터페이스를 만족하는 모든 구현체를 주입할 수 있습니다.

interface Logger { log(m: string): void; }
class OrderService {
  constructor(private logger: Logger) {}
}

생성자 주입

생성자 주입은 생성자 매개변수로 의존성을 전달합니다. 의존성은 즉시 사용할 수 있고 readonly로 표시할 수 있으므로, 필요한 항목이라는 점이 분명해집니다.

class OrderService {
  constructor(private readonly logger: Logger) {}
}

프로퍼티 주입

프로퍼티 주입은 생성이 끝난 후 공개 프로퍼티나 설정 가능한 프로퍼티에 의존성을 설정합니다. 더 유연하지만 객체가 의존성 없이 잠시 존재할 수 있습니다.

class OrderService {
  logger!: Logger; // set after construction
  place() { this.logger.log("placed"); }
}
const s = new OrderService();
s.logger = new ConsoleLogger();

스타일 선택하기

필수 의존성에는 생성자 주입을 사용하시는 것이 좋습니다. 객체가 불완전하게 만들어진 상태가 되지 않기 때문입니다. 선택적 협력 객체나 생성 순환을 끊어야 할 때는 프로퍼티 주입을 사용하시면 됩니다.

IoC 컨테이너 미리 보기

큰 앱에서는 의존성을 직접 연결하는 작업이 점점 번거로워집니다. IoC 컨테이너는 의존성을 만들고 제공하는 작업을 자동화합니다. 다음 레슨에서는 InversifyJS를 사용해 이를 살펴봅니다.

간단 확인

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

복습

제어의 역전은 의존성 생성을 클래스 외부로 옮기고, 의존성 주입은 의존성을 내부로 전달합니다. 인터페이스에 의존하고, 필수 의존성에는 생성자 주입을 우선하며, fake를 주입해 쉽게 테스트할 수 있습니다.

자주 묻는 질문

“제어 반전 기초” 강의는 무료인가요?

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

“제어 반전 기초”에서 뭘 배우나요?

의존성을 반전해야 하는 이유와 시점을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“제어 반전 기초” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

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