Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[마켓] 주문창 gRPC 통신 및 매수, 매도 주문 등록 #89

Open
wants to merge 10 commits into
base: develop
Choose a base branch
from

Conversation

tongticktack
Copy link
Collaborator

@tongticktack tongticktack commented Nov 14, 2024

📚 이슈 번호

✅ 작업 내용

  • [�x] balance gRPC 서버 개발
    • Transaction 서버의 요청으로 asset DB 업데이트
    • order_history에 로우 추가
    • historyId와 status값을 반환
    • gRPC 마이크로 서비스 5001번�포트 개방
  • transaction gRPC 클라이언트 개발
    • gRPC client 객체 생성
    • balance 서버의 서비스 호출
    • buy_order, sell_order 컬렉션에 로우 추가
  • transaction 지정가 매수, 지정가 매도 API 개발
  • enum 추가
    • GrpcOrderStatusCode
      • gRPC balance 트랜젝션 결과값
    • OrderStatus
      • 주문 상태
    • OrderType
      • BUY or SELL

🔥 트러블 슈팅

0. gRPC IDL 인터페이스와 DTO 간 필드명 불일치

order.proto을 DTO와 일치하도록 수정해 해결

1. Prisma가 MongoDB replica set 환경에서 primary 노드에 제대로 연결되지 않음

Prisma가 dockerId을 읽어들이지 못해서 생긴 문제로, replica set config을 localhost로 설정해 해결

rs.reconfig({
  _id: "rs0",
  members: [
    { _id: 0, host: "localhost:27017" }
  ]
})

2. prisma schema database url

공통 모듈인 �Prisma Service 내에서 database의 url을 DATABASE_URL로 처리하고 있어 해당 환경변수를 불어오지 않아 생긴 문제였습니다.

datasource db {
  provider = "mongodb"
  url      = "mongodb:// ... " // 에러
}

🖋️ 학습 자료

🐝 비고

  • Todo: transaction의 buy_order, sell_order 트랜젝션 실패시, gRPC로 balance 측 트랜젝션 롤백

tongticktack and others added 10 commits November 14, 2024 18:00
- port# : 5001
Co-authored-by: Jeongwisdom [email protected]
- OrderLimitRequestDto: 지정가 매수, 매도 요청
  - coin_code -> coinCode
- order.proto 필드명 변경
  - orderId -> historyId
- AuthenticatedGuard import문 경로 변경
- 기존 비어있는 테스트 파일 삭제
- 매수 매도 주문
  - 주문 성공
  - 잔액 부족시 BadRequestException
  - 트랜잭션 오류시InternalServerErrorException
@tongticktack
Copy link
Collaborator Author

@TaeRaeKim
auth에 쓰인 session모듈을 보고 따라서 transaction에 적용했습니다. 30a73e9
제대로 한건지 확인 부탁드립니다 🙏
package.json에 grpc moduleWrapper을 추가했습니다. 30a73e9

@tongticktack
Copy link
Collaborator Author

리뷰 후에 머지하면서 issue close 하도록 하겠습니다!

@TaeRaeKim
Copy link
Collaborator

prisma.schema작성 시, database의 url을 하드코딩하게 되면 << 하드코딩한 것 때문에 안된것이아니라
PrismaService 내에서 환경변수를 불러온 뒤 해당 DATABASE_URL로 db connection 생성하고 있어서 문제가 발생했던 것으로 기억합니다ㅎㅎ

@GrpcMethod('OrderService', 'makeBuyOrder')
async makeBuyOrder(buyOrderRequest: OrderRequestDto): Promise<OrderResponseDto> {
return await this.balanceService.makeBuyOrder(buyOrderRequest);
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grpc 전용 메소드들이 controller에 생성된 이유가 있을까요?

제 생각에는 service에 위치하는게 좋아 보입니다.

Router (Controller)는 사용자와 서버간에 상호작용하는 어플리케이션 계층에 속하는데, 비지니스 계층(TransactionService)에서 어플리케이션 계층(Balance Controller)를 호출하는 것이 적절치 않아보입니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동의합니다. 서비스 게층 간의 상호작용으로 보는게 더 적절하겠네요. 내용 반영하여 수정하겠습니다.

Copy link
Collaborator

@TaeRaeKim TaeRaeKim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!!

options: {
package: 'order',
protoPath: '@app/grpc/order.proto',
url: 'localhost:5001',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

localhost 보다는 실제로 필요한 데이터를 환경변수 형태로 넣어주세요!
ex) ${BALANCE_SERVICE_HOST}:${GRPC_PORT}

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

환경변수는 docker build 시에 주입해주고 있나요? 환경변수를 어디에 정의해야 적절할지요?

@@ -60,6 +60,17 @@
"compilerOptions": {
"tsConfigPath": "libs/session/tsconfig.lib.json"
}
},
"grpc": {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요기는 궁금한 내용인데 직접 작성해주신건가요? 아니면 nest-cli로 generate하면서 자동생성된 코드인가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

배포 시, order.proto 파일을 카피하기 위해 직접 넣어준 코드입니다.

apps/balance/src/balance.module.ts Show resolved Hide resolved
@@ -105,7 +105,8 @@
"^@app/common(|/.*)$": "<rootDir>/libs/common/src/$1",
"^@app/prisma(|/.*)$": "<rootDir>/libs/prisma/src/$1",
"^@app/session(|/.*)$": "<rootDir>/libs/session/src/$1",
"^@app/redis(|/.*)$": "<rootDir>/libs/redis/src/$1"
"^@app/redis(|/.*)$": "<rootDir>/libs/redis/src/$1",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

레디스모듈은 잘못추가된거같네요~

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"^@app/redis(|/.*)$": "<rootDir>/libs/redis/src/$1",

그럼 요 라인은 필요 없고 삭제하면 될까요?

import { PrismaModule } from '@app/prisma';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { TransactionGrcpService } from './transaction.grcp.service';
import { SessionModule } from '@app/session';

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 여기서는 고쳐졌군여 ㅎㅎ 앞에서 리뷰를 달았는데 머쓱하네요

@TaeRaeKim
Copy link
Collaborator

TaeRaeKim commented Nov 14, 2024

  1. transaction grpc service를 transactionOrderService로 이름 변경해주세요.

  2. transaction grpc에 있는 interface OrderService 를 libs/grpc 로 옮겨주세요
    (transactionOrderService, BalanceOrderService에서 impl 해주세요)

  3. transactionOrderService내에서 await firstValueFrom() 작업을 해주세요.

  4. balance.controller 내부의 grpc 관련 코드를 balanceOrderService를 만들고 그곳으로 이동시켜주세요.

@tongticktack
Copy link
Collaborator Author

prisma.schema작성 시, database의 url을 하드코딩하게 되면 << 하드코딩한 것 때문에 안된것이아니라 PrismaService 내에서 환경변수를 불러온 뒤 해당 DATABASE_URL로 db connection 생성하고 있어서 문제가 발생했던 것으로 기억합니다ㅎㅎ

앗 좋은 지적 감사합니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants