nest g app menu 명령어로 NestJS 기반 menu microservice 생성함apps/menu 디렉토리에 생성됨libs/database/src/menu/menu.entity.ts 생성하여 메뉴 엔티티 정의함libs/database/src/database.module.ts 에서는 User, Menu 엔티티 모두 등록함TypeOrmModule.forFeature([User]), TypeOrmModule.forFeature([Menu])로 필요 엔티티만 import함DatabaseModule에 통합되어 있음@Entity('menu')
export class Menu {
@PrimaryGeneratedColumn('uuid')
id!: string;
@Column()
name!: string;
@Column({ type: 'int' })
coin!: number;
@Column({ type: 'enum', enum: MenuCategory })
category?: MenuCategory;
@Column({ type: 'int', nullable: true })
calories?: number;
@Column({ type: 'date' })
expirationDate?: Date;
@Column({ default: false })
isBeverage?: boolean;
@CreateDateColumn()
createdAt!: Date;
@UpdateDateColumn()
updatedAt?: Date;
}
./proto/menu.proto에 gRPC 서비스 정의함CreateMenu(CreateMenuRequest) returns (Menu) RPC 추가함npx protoc \
--plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts_proto \
--ts_out=libs/grpc-types \
--ts_opt=nestJs=true,useDate=false \
-I ./proto ./proto/menu.proto
libs/grpc-types/menu.ts@GrpcMethod)는 반드시 @Controller 클래스 안에 선언해야 Nest가 인식함menu.service.ts에 두고, menu.controller.ts에서는 @GrpcMethod()만 정의하여 서비스 위임 처리함await NestFactory.createMicroservice<MicroserviceOptions>(MenuModule, {
transport: Transport.GRPC,
options: {
protoPath: join(process.cwd(), 'proto/menu.proto'),
package: 'menu',
url: '0.0.0.0:xxxx',
},
});
apps/user/src/data-source.tsapps/menu/src/data-source.ts각각 따로 생성하여 migration 분리 관리함
npm run typeorm-menu -- migration:generate apps/menu/src/migrations/CreateMenuTable
npm run typeorm-menu -- migration:run
grpcurl로 menu.MenuService/CreateMenu 테스트함CreateMenu 요청 정상적으로 수신 및 DB 저장 확인됨