마이크로서비스 아키텍처는 소프트웨어 시스템을 작은 독립적인 서비스들로 나누어 개발하고 배포하는 아키텍처 스타일입니다. 각 서비스는 특정 비즈니스 기능을 수행하며, 서비스 간에는 네트워크를 통해 통신합니다. 이러한 작은 서비스들은 독립적으로 배포될 수 있고, 각 서비스를 개별적으로 확장하거나 수정할 수 있으므로 유연하고 확장성 있는 애플리케이션을 구축할 수 있습니다.
마이크로서비스 아키텍처의 특징:
독립적인 서비스들: 각 서비스는 자체적으로 독립적으로 개발, 배포, 확장, 운영됩니다. 이는 기능의 수정이나 확장이 다른 서비스에 영향을 미치지 않도록 합니다.
최소한의 공유: 각 서비스는 자체적으로 데이터베이스를 가집니다. 데이터베이스를 공유하는 경우가 드뭅니다. 대신, 각 서비스는 외부 API를 통해 데이터를 교환하거나 이벤트 기반 아키텍처를 사용하여 통신합니다.
폴리글랏 프로그래밍: 각 서비스는 서비스에 가장 적합한 언어, 프레임워크, 데이터베이스 등을 선택하여 개발할 수 있습니다.
유연한 개발과 확장성: 마이크로서비스 아키텍처는 작은 규모의 서비스로 구성되기 때문에 개발, 테스트, 배포 등이 용이합니다. 또한, 필요에 따라 각 서비스를 독립적으로 확장할 수 있습니다.
마이크로서비스 배포: 각 서비스는 개별적으로 배포될 수 있습니다. 이는 전체 애플리케이션의 배포를 빠르고 안정적으로 만들어줍니다.
분산 시스템: 서비스 간의 통신은 네트워크를 통해 이루어지므로 분산 시스템의 특징을 가지고 있습니다. 이로 인해 고가용성과 탄력성이 향상됩니다.
NestJS는 마이크로서비스 아키텍처를 쉽게 구현할 수 있도록 Microservices 모듈을 제공합니다. 이 모듈을 사용하여 서로 다른 프로세스 사이에서 통신할 수 있습니다. 주로 네트워크를 통해 통신하며, TCP, Redis, NATS 등 다양한 프로토콜을 지원합니다.
NestJS의 Microservices 모듈을 사용하여 마이크로서비스 간의 통신을 구현하는 기본적인 단계를 살펴보겠습니다.
NestJS 애플리케이션 생성: NestJS CLI를 사용하여 마이크로서비스 애플리케이션을 생성합니다.
nest new microservices-app
cd microservices-app
Microservices 모듈 설정: main.ts
파일에서 Microservices 모듈을 설정합니다.
// main.ts
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
transport: Transport.TCP,
options: {
port: 3001,
},
});
await app.listenAsync();
}
bootstrap();
위 예시에서는 TCP 프로토콜을 사용하여 Microservices 모듈을 설정하였습니다. 포트 3001에서 서비스를 실행합니다.
마이크로서비스 컨트롤러 생성: 마이크로서비스 간의 요청을 처리할 컨트롤러를 생성합니다.
nest generate controller micro
마이크로서비스 컨트롤러 작성: 마이크로서비스 컨트롤러에서 요청에 대한 핸들러 메서드를 구현합니다.
// micro.controller.ts
import { Controller, Get } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';
@Controller()
export class MicroController {
@MessagePattern({ cmd: 'hello' })
async sayHello() {
return 'Hello from microservice!';
}
}
@MessagePattern()
데코레이터는 마이크로서비스 컨트롤러에 대한 메시지 패턴을 정의합니다. 위 예시에서는 { cmd: 'hello' }
패턴으로 정의하여 sayHello()
메서드가 해당 패턴의 요청을 처리합니다.
AppModule에 마이크로서비스 컨트롤러 등록: 마이크로서비스 컨트롤러를 AppModule에 등록합니다.
// app.module.ts
import { Module } from '@nestjs/common';
import { MicroController } from './micro.controller';
@Module({
controllers: [MicroController],
})
export class AppModule {}
**
마이크로서비스 실행**: 애플리케이션의 main.ts
파일에서 createMicroservice()
메서드를 사용하여 마이크로서비스를 실행합니다.
// main.ts
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
// Microservices
const microservice = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
transport: Transport.TCP,
options: {
port: 3001,
},
});
microservice.listenAsync();
}
bootstrap();
위 예시에서 마이크로서비스는 별도의 프로세스에서 실행되며, 주 애플리케이션과 TCP 프로토콜로 통신합니다. 요청을 보내면 해당 마이크로서비스가 패턴에 맞는 핸들러 메서드를 실행하여 결과를 반환합니다.
마이크로서비스 아키텍처는 NestJS의 Microservices 모듈을 활용하여 간편하게 구현할 수 있습니다. 각 마이크로서비스는 독립적으로 개발 및 배포되어 유연하고 확장성 있는 애플리케이션을 구축할 수 있습니다. 마이크로서비스는 필요에 따라 다양한 프로토콜과 메시지 패턴을 사용하여 서로 통신할 수 있습니다.