사용자 도구

사이트 도구


angular:dependency-injection

Angular의 의존성 주입

의존성 주입(Dependency injection, DI)은 애플리케이션 디자인 패턴 중에서도 아주 중요한 패턴입니다. Angular는 독자적인 의존성 주입 시스템을 제공하고 있기 때문에, 이 패턴을 활용하면 Angular 애플리케이션을 좀 더 효율적인 모듈 형태로 구성할 수 있습니다.

의존성(dependencies)은 어떤 클래스가 동작하기 위해 필요한 서비스나 객체를 의미합니다. 그리고 의존성 주입 패턴은 이 의존성을 직접 생성하지 않고 외부 어딘가에서 받아오도록 요청하는 패턴입니다.

Angular에서는 클래스의 인스턴스가 생성될 때 이 클래스에 필요한 의존성을 프레임워크가 생성해서 전달합니다. 이 문서는 Angular에서 의존성 주입이 어떻게 동작하는지, 의존성 주입을 활용하면 애플리케이션을 얼마나 효율적이면서 유연한 구조로 작성할 수 있는지 설명합니다. 의존성 주입을 사용하면 테스트하기 편하고 유지보수하기도 좋은 애플리케이션을 구현할 수 있습니다.

한 파일에 클래스를 여러개 정의하면 이 파일을 접하는 많은 사람들에게 혼란을 줄 수 있습니다. 일반적으로 컴포넌트와 서비스는 파일 하나에 하나씩 정의하는 것을 권장합니다.

그런데 어떤 이유로 컴포넌트와 서비스를 한 파일에 정의해야 한다면 서비스를 먼저 정의하고 컴포넌트를 나중에 정의하세요. 서비스보다 컴포넌트를 먼저 정의하면 런타임 null 참조 에러가 발생합니다.

그리고 이 블로그에서 설명한 것처럼 forwardRef() 메소드를 사용하면 컴포넌트를 먼저 정의할 수도 있습니다.

forwardRef() 메소드는 순환 참조를 방지할 때도 사용합니다. DI Cookbook에서 설명하는 예제를 참고하세요.

의존성으로 주입할 서비스 클래스 정의하기

ng generate service heroes/hero

CLI생성한 소스는

src/app/heroes/hero.service.ts
import { Injectable } from '@angular/core';
 
@Injectable({
  providedIn: 'root',
})
export class HeroService {
  constructor() { }
}

Angular 서비스를 정의하는 코드에서 @Injectable()이 가장 중요합니다. 그리고 이전에 목 데이터를 반환하던 로직은 클래스 코드에서 getHeroes 메소드가 제공하도록 하려면 다음과 같이 구현할 수 있습니다. (실제 앱에서는 목 데이터를 반환하는 대신 리모트 서버에서 비동기로 데이터를 가져오게 될 것입니다. 지금은 서비스를 의존성으로 주입하는 것에만 집중하기 위해 이 부분은 생략합니다.)

Dependency Injection (DI)

  • Code without DI - drawbacks
  • DI as a design pattern
  • DI as a framework

DI as a design pattern

DI is a coding pattern in which a class receives its dependencies from external sources rather then creating them itself.

var engine = new Engine();
var tires = new Tires();
var car = new Car(engine, tires);
 
var engine = new Engine(parameter);
var tires = new Tires();
var car = new Car(engine, tires);

복잡도의 상승

var myEngine = new Engine();
var myTires = new Tires();
var depA = new dependency();
var depB = new dependency();
var depZ = new dependency();
var myCar = new Car(myEngine, myTires, depA, depB, depZ);
var myEngine = new Engine();
var myTires = new Tires();
var depA = new dependency();
var depB = new dependency();
var depAB = new dependency();
var depZ = new dependency(depAB);
var myCar = new Car(myEngine, myTires, depA, depB, depZ);
angular/dependency-injection.txt · 마지막으로 수정됨: 2025/04/15 10:05 저자 127.0.0.1