프로그래밍/Nest.js

고급 프로바이더 사용법: 커스텀 프로바이더

shimdh 2025. 3. 23. 00:12
728x90

Nest.js는 현대 웹 애플리케이션 개발에 있어 강력한 프레임워크로 자리 잡고 있습니다. 그 중에서도 커스텀 프로바이더는 개발자가 애플리케이션의 특정 요구사항을 충족시키기 위해 사용자 정의 로직을 제공하는 중요한 요소입니다. 이번 포스트에서는 커스텀 프로바이더의 개념, 사용 이유, 생성 방법 및 활용 사례에 대해 자세히 알아보겠습니다.

1. 커스텀 프로바이더란?

커스텀 프로바이더는 Nest.js의 의존성 주입 컨테이너에 등록되어 사용할 수 있는 사용자 정의 객체입니다. 이를 통해 개발자는 특정 기능이나 데이터를 캡슐화하고 재사용할 수 있습니다. 커스텀 프로바이더는 단순히 기능을 제공하는 것에 그치지 않고, 복잡한 비즈니스 로직을 구현하거나 외부 API와의 통신을 관리하는 등 다양한 역할을 수행할 수 있습니다. 이러한 유연성 덕분에 개발자는 애플리케이션의 구조를 더욱 깔끔하고 효율적으로 유지할 수 있습니다.

2. 사용 이유

커스텀 프로바이더를 사용하는 이유는 다음과 같습니다:

  • 비즈니스 로직 분리: 다양한 비즈니스 로직을 별도의 클래스로 분리하여 코드 가독성을 높이고 유지보수를 용이하게 합니다. 이는 팀원 간의 협업을 원활하게 하고, 각자의 역할에 맞는 책임을 명확히 할 수 있게 합니다.
  • 재사용 가능성: 여러 곳에서 동일한 기능을 필요로 할 경우, 하나의 커스텀 프로바이더를 만들어 재사용할 수 있습니다. 이를 통해 중복 코드를 줄이고, 코드의 일관성을 유지할 수 있습니다.
  • 유연한 테스트: 테스트 환경에서 쉽게 대체 가능한 모형(mock) 객체를 만들 수 있어 단위 테스트 및 통합 테스트 시 유용합니다. 커스텀 프로바이더를 사용하면 테스트 시나리오에 맞게 다양한 상황을 시뮬레이션할 수 있어, 보다 철저한 검증이 가능합니다.

3. 커스텀 프로바이더 생성 예제

이제 간단한 사용자 인증 서비스를 위한 커스텀 프로바이더를 만드는 과정을 살펴보겠습니다. 이 예제에서는 사용자 이름과 비밀번호를 검증하는 간단한 로직을 구현합니다.

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

@Injectable()
export class AuthService {
    validateUser(username: string, password: string): boolean {
        // 여기서는 실제 인증 로직 대신 간단히 true 반환
        return username === 'user' && password === 'password';
    }
}

위와 같은 AuthService 클래스를 작성하면, 이제 이를 다른 모듈에서 사용할 수 있도록 설정해야 합니다. 이 과정에서 모듈 간의 의존성을 명확히 하고, 필요한 서비스가 적절히 주입될 수 있도록 합니다.

4. 모듈에 등록하기

모듈 파일에서 AuthService를 제공하기 위해 다음과 같이 설정합니다:

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

@Module({
    providers: [AuthService],
    exports: [AuthService], // 다른 모듈에서도 사용할 수 있도록 내보냄
})
export class AuthModule {}

이렇게 설정함으로써, AuthService는 애플리케이션의 다른 부분에서 쉽게 사용할 수 있는 서비스로 등록됩니다. 이는 코드의 재사용성을 높이고, 모듈 간의 의존성을 명확히 하는 데 기여합니다.

5. 사용하는 방법

다른 서비스나 컨트롤러에서 AuthService를 주입받아 사용할 수 있습니다:

import { Controller, Post, Body } from '@nestjs/common';
import { AuthService } from './auth.service';

@Controller('auth')
export class AuthController {
    constructor(private readonly authService: AuthService) {}

    @Post('login')
    login(@Body() body: { username: string; password: string }) {
        const isValid = this.authService.validateUser(body.username, body.password);
        if (isValid) {
            return { message: '로그인 성공!' };
        }
        return { message: '로그인 실패!' };
    }
}

위 예제에서는 로그인 요청을 처리하는 API 엔드포인트가 있으며, 클라이언트로부터 받은 사용자 이름과 비밀번호를 AuthService의 메서드를 통해 검증합니다. 이 과정에서 발생할 수 있는 다양한 예외 상황을 고려하여, 적절한 응답을 클라이언트에게 반환하는 것이 중요합니다.

결론

커스텀 프로바이더는 Nest.js 애플리케이션 내에서 복잡한 비즈니스 로직을 효율적으로 관리하고 재사용 가능하게 만드는 데 매우 유용합니다. 이러한 구조적 접근 방식은 코드 품질 향상뿐만 아니라 팀 협업 시에도 큰 장점을 제공합니다. 따라서 프로젝트 요구사항에 맞게 적절히 커스터마이징된 서비스를 설계하여 활용하는 것이 중요합니다. 이를 통해 개발자는 더욱 견고하고 유지보수하기 쉬운 애플리케이션을 구축할 수 있습니다.

728x90