티스토리 뷰

반응형

✅ NestJS에서 Dependency Injection(DI)이란 무엇이고 어떤 장점이 있나?

**Dependency Injection(DI)**는 NestJS의 핵심 철학 중 하나로,
애플리케이션을 **느슨하게 결합(Loosely Coupled)**하고 확장성과 테스트 가능성을 극대화할 수 있는 구조입니다.

NestJS는 Angular에서 영감을 받아 DI 컨테이너를 내장하고 있으며,
모듈 기반 아키텍처와 함께 동작하면서 서비스 간 의존성 주입을 자동으로 관리합니다.


📌 1. Dependency Injection이란?

DI는 객체 간의 의존성을 외부에서 주입하는 설계 패턴입니다.
클래스 내부에서 직접 객체를 생성하지 않고, 필요한 객체를 외부에서 제공받음으로써
의존성과 생명주기를 분리합니다.


📌 2. NestJS에서 DI 기본 예시

✅ UserService가 UserRepository에 의존하는 경우:

@Injectable()
export class UserService {
  constructor(private readonly userRepository: UserRepository) {}
}

NestJS는 UserRepository를 자동으로 찾아 주입합니다.
이때, @Injectable() 데코레이터가 붙어 있어야 Nest의 DI 컨테이너에 등록됩니다.


📌 3. DI 작동 방식 요약

  1. NestJS는 @Injectable()을 통해 의존성을 식별
  2. 각 클래스는 Nest의 DI 컨테이너에 자동 등록
  3. constructor 인자를 분석해 필요한 의존성 인스턴스를 주입

예시 구조

AppModule
 └── UserModule
      ├── UserService ← Injects UserRepository
      └── UserRepository

📌 4. DI의 장점

반응형

장점 설명

🔹 느슨한 결합 클래스 간 의존성을 인터페이스 또는 추상 레벨로 유지 가능
🔹 단위 테스트 용이 실제 구현체 대신 Mock 객체 주입 가능
🔹 유지보수성 향상 객체 생성 책임 분리 → 관심사 분리(SRP)
🔹 재사용성 증가 독립적인 서비스 구조 → 다른 곳에서도 활용 가능
🔹 코드 가독성 및 관리 DI 컨테이너를 통한 객체 관리로 코드 흐름이 명확

📌 5. 커스터마이징: @Inject() 사용

Nest는 클래스명을 기준으로 자동 주입하지만,
커스텀 토큰 사용 시 @Inject('TOKEN')을 사용해야 합니다.

@Injectable()
export class LoggerService {
  constructor(@Inject('LOGGER') private logger: Logger) {}
}

그리고 providers 설정에서 토큰과 구현체를 연결합니다.

{
  provide: 'LOGGER',
  useClass: WinstonLogger,
}

📌 6. 실무 적용 경험

🧪 문제

  • 서비스 간 강한 결합으로 테스트 어려움
  • 로깅 시스템 교체 시 전체 코드 수정 필요

✅ 해결

  • 의존 객체를 @Inject()로 주입받고, 인터페이스 기반으로 분리
  • 테스트 환경에서는 useValue로 Mock 서비스 제공
  • 로깅 시스템 교체도 모듈 바인딩만 수정해서 해결됨

→ 코드 유연성 + 테스트 편의성 획기적으로 향상


📌 7. 면접에서 이렇게 말하세요

NestJS의 DI는 객체 간 의존성을 외부에서 주입하는 방식으로, 서비스 간 느슨한 결합을 가능하게 합니다.
실무에서는 이 구조 덕분에 Mock 주입을 통한 테스트 용이성 확보, 유지보수성 향상,
로깅 시스템 교체나 A/B 서비스 구성 시에도 빠른 대응이 가능했습니다.



NestJS,DependencyInjection,DI컨테이너,느슨한결합,테스트용이성,모듈아키텍처,백엔드패턴,서비스설계,NestJS구조,프론트엔드면접


 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함
반응형