menu 서비스 NestJS 모듈 생성 요약

ddoachi·2025년 4월 21일

TekaPicker

목록 보기
8/30

목표

  • 기존 user 서비스 외에 menu 서비스를 gRPC 기반으로 추가함
  • user와 menu는 각각 독립적인 database 설정, migration 파일, gRPC 서비스 구조를 가짐

NestJS menu 앱 생성

  • nest g app menu 명령어로 NestJS 기반 menu microservice 생성함
  • apps/menu 디렉토리에 생성됨

database 분리 및 설정

  • libs/database/src/menu/menu.entity.ts 생성하여 메뉴 엔티티 정의함
  • libs/database/src/database.module.ts 에서는 User, Menu 엔티티 모두 등록함
  • 각 서비스(user, menu)는 TypeOrmModule.forFeature([User]), TypeOrmModule.forFeature([Menu])로 필요 엔티티만 import함
  • DB 연결 설정은 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 추가함

ts-proto 사용하여 타입 생성

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

🧠 Controller vs Service 분리

  • gRPC 핸들러(@GrpcMethod)는 반드시 @Controller 클래스 안에 선언해야 Nest가 인식함
  • 비즈니스 로직은 menu.service.ts에 두고, menu.controller.ts에서는 @GrpcMethod()만 정의하여 서비스 위임 처리함

gRPC 서버 실행 설정

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.ts
  • apps/menu/src/data-source.ts

각각 따로 생성하여 migration 분리 관리함

npm run typeorm-menu -- migration:generate apps/menu/src/migrations/CreateMenuTable
npm run typeorm-menu -- migration:run

🧪 테스트 도구

  • grpcurlmenu.MenuService/CreateMenu 테스트함
  • 한글 입력은 BloomRPC에서 안 됨 → VSCode gRPC Client 확장 사용하여 해결함

🎉 결과

  • menu 엔티티 기반 gRPC 서버 성공적으로 실행됨
  • CreateMenu 요청 정상적으로 수신 및 DB 저장 확인됨
profile
내일도 풀스택

0개의 댓글