프로그래밍/Nest.js

고급 모듈 관리: Nest.js에서의 모듈 간 의존성 주입

shimdh 2025. 3. 25. 09:12
728x90

Nest.js는 현대 웹 애플리케이션 개발에 있어 매우 강력한 프레임워크로 자리 잡고 있습니다. 그 중에서도 고급 모듈 관리모듈 간 의존성 주입은 애플리케이션의 구조를 효율적으로 설계하고 관리하는 데 필수적인 요소입니다. 이번 포스트에서는 이러한 개념을 깊이 있게 탐구하고, 실제로 어떻게 적용할 수 있는지에 대해 알아보겠습니다.

의존성 주입의 개념

의존성 주입(Dependency Injection, DI)은 객체 지향 프로그래밍에서 널리 사용되는 디자인 패턴입니다. 이 패턴은 객체가 필요로 하는 외부 리소스를 직접 생성하지 않고, 외부에서 제공받는 방식을 의미합니다. 의존성 주입의 주요 장점은 다음과 같습니다:

  • 코드 재사용성: 각 모듈이 독립적으로 개발될 수 있어, 코드의 재사용성이 높아집니다.
  • 테스트 용이성: 의존성을 주입받는 방식으로 인해, 테스트가 용이해집니다.
  • 유지보수성: 각 모듈의 역할이 명확해져 유지보수가 쉬워집니다.

Nest.js에서의 모듈과 서비스

Nest.js에서는 애플리케이션을 여러 개의 모듈로 나누어 구성합니다. 각 모듈은 관련된 기능을 그룹화하며, 서비스는 이러한 기능을 구현하는 핵심 요소입니다. 예를 들어:

  • UserModule: 사용자 관련 기능을 담당하며, 사용자 정보를 관리하는 서비스들을 포함합니다.
  • AuthModule: 인증 및 권한 부여 관련 기능을 제공하며, 사용자 인증을 위한 다양한 메소드를 포함합니다.
  • ProductModule: 제품 관리와 관련된 기능을 제공하며, 제품 정보를 추가, 수정, 삭제하는 서비스들을 포함합니다.

이러한 모듈들은 서로 의존성을 주입받아야 하며, 이를 통해 모듈 간의 결합도를 낮추고 독립적으로 기능할 수 있도록 합니다.

기본적인 의존성 주입 방법

Nest.js에서는 @Injectable() 데코레이터를 사용하여 서비스 클래스를 정의하고, 이를 다른 클래스에서 사용할 때 constructor에 인자로 전달함으로써 의존성을 주입합니다. 이 방식은 코드의 가독성을 높이고, 각 서비스의 역할을 명확히 하여 유지보수를 용이하게 합니다.

import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
    getUsers() {
        return ['User1', 'User2'];
    }
}

@Module({
    providers: [UserService],
})
export class UserModule {}

위 예제에서는 UserService라는 서비스를 정의하였습니다. 이제 이 서비스를 다른 모듈이나 컴포넌트에서도 사용할 수 있으며, 이를 통해 애플리케이션의 다양한 기능을 통합할 수 있습니다.

두 개 이상의 모듈 간 연결하기

모듈 간의 의존성을 명확히 하기 위해서는 한 모듈이 다른 모듈에 대한 참조를 가져야 합니다. 이를 위해서는 해당 서비스를 제공하는 소스인 모듈 내보내기(exporting)임포트(importing) 가 필요합니다. 이러한 과정은 모듈 간의 의존성을 명확히 하고, 각 모듈이 필요한 서비스를 쉽게 사용할 수 있도록 합니다.

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { AuthService } from './auth.service';

@Module({
    imports: [UserModule], // UserModule 임포트
    providers: [AuthService],
})
export class AuthModule {}

@Injectable()
export class AuthService {
    constructor(private userService: UserService) {} // UserService 주입

    validateUser(userId: string) {
        const users = this.userService.getUsers();
        return users.includes(userId);
    }
}

위 코드는 AuthModuleUserModule을 임포트하고 있으며, 그 안에서 AuthServiceUserService를 생성자 매개변수로 받아서 사용하는 모습입니다. 이를 통해 AuthService는 사용자 정보를 검증하는 기능을 수행할 수 있습니다.

결론 및 실습 제안

모듈 간 의존성 주입은 Nest.js 애플리케이션 구조를 유연하게 하고, 유지보수를 쉽게 만들어줍니다. 실제 프로젝트에서는 다양한 상황에 맞게 여러 가지 조합으로 이러한 패턴을 활용해 볼 것을 추천드립니다. 이를 통해 개발자는 더 나은 아키텍처를 설계하고, 애플리케이션의 품질을 높일 수 있습니다.

728x90