Nodejs

 

1. Payment Proto 정의 (proto 파일)

 

결제와 관련된 gRPC 서비스를 정의하기 위해 payment.proto 파일을 작성합니다.

syntax = "proto3";

package payment;

service PaymentService {
    rpc MakePayment(MakePaymentRequest) returns (MakePaymentResponse);
}

message MakePaymentRequest {
    string orderId = 1;
    string paymentMethod = 2;
    string paymentName = 3;
    string cardNumber = 4;
    string expiryYear = 5;
    string expiryMonth = 6;
    string birthOrRegistration = 7;
    float amount = 8;
    string userEmail = 9;
    string passwordTwoDigits = 10;
}

message MakePaymentResponse {
    string id = 1;
    string paymentStatus = 2;
    string paymentMethod = 3;
}
  • MakePayment: 결제 요청을 처리하는 gRPC 메서드

  • MakePaymentRequest: 결제 시 필요한 주문 ID, 결제 수단, 카드 정보, 금액, 사용자 이메일 등의 정보 포함

  • MakePaymentResponse: 결제 처리 결과 반환 (결제 ID, 상태, 결제 수단)

 

 

2. NestJS에서 Payment Service 구현

NestJS에서는 gRPC 요청을 @MessagePattern으로 매핑하여 처리합니다.

PaymentController

import {
  Controller,
  UseInterceptors,
  UsePipes,
  ValidationPipe,
} from '@nestjs/common';
import { PaymentService } from './payment.service';
import { MessagePattern, Payload } from '@nestjs/microservices';
import { RpcInterceptor } from '@app/common/interceptor';
import { MakePaymentDto } from './dto/make-payment.dto';

@Controller()
export class PaymentController {
  constructor(private readonly paymentService: PaymentService) {}

  @MessagePattern({ cmd: 'make_payment' })
  @UsePipes(new ValidationPipe())
  @UseInterceptors(RpcInterceptor)
  async makePayment(@Payload() payload: MakePaymentDto) {
    console.log('PaymentController makePayment', payload);

    return this.paymentService.makePayment(payload);
  }
}
  • make_payment: 클라이언트로부터 결제 요청을 받아 서비스로 전달

  • ValidationPipe: 요청 데이터 유효성 검증 수행

  • RpcInterceptor: 공통 에러 처리 및 응답 포맷 관리

 

 

 DTO 정의

import { IsNotEmpty, IsNumber, IsString } from 'class-validator';
import { PaymentMethod } from '../entity/payment.entity';

export class MakePaymentDto {
  @IsString()
  @IsNotEmpty()
  orderId: string;

  @IsNotEmpty()
  paymentMethod: PaymentMethod;

  @IsNotEmpty()
  paymentName: number;

  @IsString()
  @IsNotEmpty()
  cardNumber: string;

  @IsString()
  @IsNotEmpty()
  expiryYear: string;

  @IsString()
  @IsNotEmpty()
  expiryMonth: string;

  @IsString()
  @IsNotEmpty()
  birthOrRegistration: string;

  @IsNumber()
  @IsNotEmpty()
  amount: number;

  @IsString()
  @IsNotEmpty()
  userEmail: string;
}
  • 주문 ID, 카드번호, 만료일, 생년월일(또는 사업자 등록번호), 금액 등 필수 검증 수행

  • PaymentMethod는 별도의 엔티티에서 정의된 Enum 사용

⚠️ 주의할 점: paymentName이 number로 정의되어 있으나, 실제로는 문자열일 가능성이 크므로 타입 검증이 필요합니다.

 

 

3. gRPC Payment Proto 성능 최적화 전략

  1. 단일 RPC 호출: MakePayment 단일 메서드로 결제를 처리하여 복잡성 최소화

  2. DTO 유효성 검사: 결제 요청 단계에서 잘못된 데이터 조기 차단

  3. Interceptor 기반 로깅/에러 처리: 결제 실패 원인 추적 가능

  4. 보안 고려: 카드번호, 비밀번호 등 민감 데이터는 반드시 암호화 또는 보안 채널에서 전송

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

높고 뛰어난 덕이야말로 좋은 정치를 베풀 수 있는 근본이고 정치의 목적은 백성을 잘 양육(養育)하는 데에 있다. 그 방법으로서는 수(水), 화(火), 금(金), 목(木), 토(土)와 곡물의 육부를 풍족하게 하는데 있고 또 정덕(正德), 이용(利用), 후생(厚生)의 삼사를 잘 실행하는 것이다. -서경

댓글 ( 0)

댓글 남기기

작성