자바스크립트 기반 NestJS 웹 애플리케이션의 멀티 테넌시 처리 방법

들어가기 전에

NestJS는 자바스크립트 기반의 프레임워크로, Express와 비슷한 구조와 사용성을 가지고 있습니다. 하지만 NestJS는 강력한 기능을 제공하여 웹 애플리케이션을 더욱 효율적으로 개발할 수 있게 도와줍니다. 여기서는 NestJS를 사용하여 멀티 테넌시를 처리하는 방법에 대해 알아보겠습니다.

멀티 테넌시란?

멀티 테넌시는 한 애플리케이션 안에서 여러 개의 테넌트(사용자)를 분리하여 각각 독립적인 데이터베이스를 사용하는 아키텍처 패턴입니다. 각 테넌트는 자체 데이터를 관리하며, 서로의 데이터에 대한 접근이 제한됩니다. 이를 통해 애플리케이션의 성능과 확장성을 향상시킬 수 있습니다.

NestJS에서의 멀티 테넌시 처리 방법

NestJS에서 멀티 테넌시를 처리하는 방법은 여러 가지가 있지만, 그 중 가장 일반적인 방법은 다음과 같습니다:

  1. 다중 데이터베이스 연결: 각 테넌트마다 별도의 데이터베이스 연결을 설정합니다. 이를 위해 typeorm 라이브러리를 사용하여 여러 개의 Connection을 생성하고, 각각의 테넌트 식별자에 매칭되는 데이터베이스 연결을 사용합니다.
// app.module.ts

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      useClass: DatabaseConfigService,
    }),
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}
  1. 인증 및 권한 부여: 각 테넌트마다 다른 인증 및 권한 부여 방식을 적용할 수 있습니다. 이를 위해 PassportJWT와 같은 인증 미들웨어를 사용하여 테넌트 식별자에 맞는 유저 데이터를 조회하고 인증을 처리할 수 있습니다.
// auth.controller.ts

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

  @Post('login')
  @UseGuards(AuthTenantGuard)
  async login(@Req() req: Request) {
    const user = req.user;
    // 로그인 로직
  }
}
  1. 라우팅 및 컨트롤러 분리: 각 테넌트마다 다른 라우팅 및 컨트롤러를 사용할 수 있습니다. 이를 위해 NestFactory.create() 메서드를 사용하여 각각의 테넌트에 맞는 앱 인스턴스를 생성하고, 해당 앱 인스턴스에 컨트롤러를 등록합니다.
// main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // 테넌트 식별자를 가져와서 적절한 컨트롤러를 등록
  const tenantIdentifier = // 테넌트 식별자 가져오는 로직
  app.use(tenantIdentifier, new TenantController());

  await app.listen(3000);
}
bootstrap();

결론

NestJS를 사용하여 멀티 테넌시를 처리하는 방법에 대해 알아보았습니다. 다중 데이터베이스 연결, 인증 및 권한 부여, 라우팅 및 컨트롤러 분리 등을 통해 효율적인 멀티 테넌시 아키텍처를 구현할 수 있습니다. 이를 통해 더욱 확장 가능하고 성능 향상된 웹 애플리케이션을 개발할 수 있습니다.

참고 자료
#NestJS #멀티테넌시