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 성능 최적화 전략
단일 RPC 호출: MakePayment 단일 메서드로 결제를 처리하여 복잡성 최소화
DTO 유효성 검사: 결제 요청 단계에서 잘못된 데이터 조기 차단
Interceptor 기반 로깅/에러 처리: 결제 실패 원인 추적 가능
보안 고려: 카드번호, 비밀번호 등 민감 데이터는 반드시 암호화 또는 보안 채널에서 전송













댓글 ( 0)
댓글 남기기