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

Feature/nyh365 step2 #26

Open
wants to merge 42 commits into
base: base/nyh365
Choose a base branch
from
Open

Feature/nyh365 step2 #26

wants to merge 42 commits into from

Conversation

nyh365
Copy link

@nyh365 nyh365 commented Feb 7, 2025

구현 사항

  • 친구의 메인 계좌로 송금이 가능합니다.
    • 만약, 잔액이 부족하다면 10,000원 단위로 충전한 후 송금이 이루어진다.
    • 다만, Step 1 에서 언급한 일일 충전 한도는 여기에서도 적용이 됩니다.
  • 인당 한도는 이제 0시 00분을 기점으로 초기화 되어야 합니다.

송금 기능

  • A에서 B로 송금을 하는 경우 하나라도 실패하게 된다면 롤백을 해야합니다. A 계좌 잔액 감액을 위한 락을 가지게 되고, 이 락은 트랜잭션이 종료가 된 후에야 해제됩니다. 따라서 A 계좌 잔액 감액과 B 계좌 잔액 증액을 별도로 분리하여 처리하고자 했습니다. A 계좌 잔액 감액 후 B 계좌 잔액을 증액할 수 있는 메세지를 발행하고 처리할 수 있도록 RabbitMQ를 이용했습니다.
    (+메시지 큐로 RabbitMQ를 이용했는데 오버스펙이지 않을까 의문입니다.)
  • B계좌 잔액을 증액하는 메세지를 발행한 후 롤백이 일어나면 문제가 생깁니다. B계좌 잔액을 증액하는 메세지가 발행되었지만 롤백으로 인해 A계좌 잔액은 변경이 없게 됩니다. 이를 해결하기 위해 Spring Event를 이용해서 A계좌 잔액 감액 트랜잭션이 커밋이 된 후에만 B 계좌 잔액을 증액할 수 있는 메세지를 발행할 수 있도록 이벤트 처리를 했습니다.
  • A에서 B로의 송금 과정에서 B계좌 잔액을 증액하는 메세지 큐의 메세지를 처리하며 해결됩니다. 이때 메세지 큐의 메세지가 유실되거나 서버의 문제로 메세지를 발행하는 이벤트가 제대로 동작하지 않을 수 있습니다. 이렇게 된다면 A 계좌 잔액은 감액 되었지만 B계좌 잔액은 변경되지 않게 되어 데이터 정합성의 문제가 발생하게 됩니다. 따라서 별도의 테이블을 추가하여 A->B의 송금 내역을 관리할 수 있도록 하였습니다.
  • 따라서 매분마다 스케줄러를 통해 송금 내역을 조회하여 유실된 메세지에 대해 다시 메세지 큐에 발행할 수 있도록 처리했습니다.

최종적으로 아래의 단계를 거치게 됩니다.

  1. A 계좌 잔액 감액과 송금 내역 추가를 하나의 트랜잭션으로 처리
  2. 트랜잭션이 커밋되면 B 계좌 잔액 증액 메세지를 메세지 큐에 저장하도록 이벤트 처리
  3. 메세지 큐를 바탕으로 B 계좌 잔액 증액
  4. 스케줄러를 통해 누락된 B 계좌 잔액 증액 메세지를 메세지 큐에 저장

인당 한도 초기화

  • 자정마다 스케줄러가 동작하여 일일 한도를 초기화하도록 구현했습니다.
  • 단순히 update 쿼리로 한번에 처리했는데 batch size만큼씩 update하는게 더 나을 것 같습니다.

nyh365 added 30 commits January 27, 2025 16:57
- 다중환경에서 lost update로 인한 데이터 적합성 문제를 해결하기 위해 락을 사용했습니다.
- 은행 업무에서는 데이터 무결성을 지키는게 중요하다고 생각해서 비관적 락을 사용했습니다.
- 다중 환경에서 lost update로 인한 데이터 무결성 해결을 위해 비관적 락 사용
- 이후 확장성을 위해 int에서 long으로 변경
- 이후 확장성을 위해 int에서 long으로 변경
- 송금 내역 저장을 위함
- 메세지 큐에 메세지 전송을 위함
- 이벤트 리스너가 비동기적으로 실행되도록 하기 위함
- 이벤트 리스너를 통해 수령인의 잔액 업데이트 로직 분리
- 메세지 큐를 통해 수령인의 잔액 업데이트
@nyh365 nyh365 self-assigned this Feb 7, 2025
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.

1 participant