[NestJs] - new 없이 객체는 어떻게 만들어질까?

Hunter Joe·2025년 9월 12일
0

📌 들어가며: 객체는 new로 만드는거 아니였어?

기존 OOP에 익숙한상태로 NestJS를 처음 접하면 아래 코드에 의문이 생길 수 있습니다.

@Injectable()
export class Car {
  constructor(
    private readonly engine: Engine,
    private readonly wheels: Wheels,
  ) {
    console.log('자동차 완성');
  }
}

분명 Car를 만드려면 EngineWheels가 필요한데 어디에서도 new Car(new Engine(), new Wheels())와 같이 객체를 생성하고 부품을 넣어두는 코드는 보이지 않습니다.

이 비밀은 NestJs의 핵심 원리인 의존성 주입(DI)에 있습니다.
필요한 부품(의존성)을 개발자가 직접 만드는 것이 아니라, NestJs라는 공장이 알아서 만들고 조립까지 해줍니다.

자동차조립: 직접 부품 사기 vs 공장에 주문하기

두 가지 방식을 통해 개념을 깊게 이해해 봅시다.

전통적인 방식 : 직접 부품 사서 조립하기

개발자가 필요한 모든 부품을 직접 만들고 조립하는 방식입니다.

class Engine { /* ... 엔진 로직 ... */ }
class Wheels { /* ... 바퀴 로직 ... */ }

// 개발자가 직접 엔진과 바퀴를 만들어서 차에 장착한다.
const myEngine = new Engine();
const myWheels = new Wheels();
const myCar = new Car(myEngine, myWheels);

모든 제어권은 개발자에게 있지만 Engine이 바뀌거나 Wheels의 종류가 추가되면 Car을 만드는 코드도 계속 수정해야 합니다.

NestJs 프레임워크 : 공장에 주문하기

NestJS라는 자동차 공장에 설계도(Car)와 부품 목록(providers)만 알려주는 방식입니다.
Car클래스의 생성자는 공장에 보내는 주문서 입니다.

// "이봐 NestJS! 이 차를 만들 땐, 엔진이랑 바퀴가 필요해!"
constructor(
  private readonly engine: Engine,
  private readonly wheels: Wheels,
)

그리고 모듈 파일에 필요한 부품 목록을 알려줍니다.

// car.module.ts
@Module({
  providers: [Car, Engine, Wheels], // "이 부품들을 사용할 수 있게 준비해줘!"
})
export class CarModule {}

이렇게 설계도면과 부품 목록을 알려주면 NestJS 공장은 알아서 부품을 만들고 완벽하게 조립한 뒤에 우리에게 완성된 자동차Car객체만 건네주게 됩니다.

NestJs 공장은 어떻게 자동차를 만들까?(DI과정)

NestJS 공장(IoC 컨테이너)은 다음과 같은 순서로 일합니다.

  1. 부품 등록 (Scan): 애플리케이션이 시작되면, @Module의 providers에 등록된 Engine, Wheels 등을 스캔해서 객체로 만들어 컨테이너에 보관합니다.

  2. 설계도 분석 (Analyze): Car 객체를 만들어야 할 때, 생성자를 보고 "아, Engine과 Wheels가 필요하구나"라고 분석합니다.

  3. 자동 조립 (Inject): 컨테이너에 보관해 둔 Engine과 Wheels 객체를 꺼내와 Car의 생성자에 인자로 전달하며 최종적으로 자동차를 완성합니다.

DI의 장점

  • 유연한 부품 교체(낮은 결합도): CarEngine이 가솔린, 전기 무슨 엔진인지 신경쓰지 않습니다. 그저 "엔진의 기능"이 필요할 뿐입니다. 덕분에 나중에 Engine을 전기 모터로 바궈도 Car코드는 수정할 필요가 없습니다.

  • 테스트 용이성: 자동차를 테스트 할 때 실제 엔진 대신 시뮬레이션 가짜 엔진(Mock)을 쉽게 장착해볼 수 있습니다. 이는 안정적인 단위 테스트를 제공합니다.

  • 효율적인 자원 관리(Singleton): NestJs는 기본적으로 Engine이나 Wheels와 같은 부품을 한 번만 만들고, 여러 곳에서 필요할 때마다 같은 부품을 재사용합니다.
    이는 메모리 절약 + 효율적인 자원 관리를 가능하게 합니다.

마치며

NestJS의 생성자는 객체를 만드는 코드가 아니라, 프레임워크에게 "필요한 것을 알려주는 소통 창구"입니다. 우리는 자동차의 내부 구조를 전부 알 필요 없이, 그저 잘 만들어진 자동차를 받아서 운전(비즈니스 로직 구현)에만 집중하면 됩니다.

이 '제어의 역전' 개념에 익숙해지는 순간, NestJS와 함께 더 빠르고 견고한 애플리케이션 개발을 경험하게 될 것입니다.

profile
Async FE 취업 준비중.. Await .. (취업완료 대기중) ..

0개의 댓글