Skip to content

계좌 이체를 진행한다. #2

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

Open
wants to merge 32 commits into
base: feature/spear
Choose a base branch
from

Conversation

this-is-spear
Copy link
Collaborator

@this-is-spear this-is-spear commented Feb 18, 2024

설명

계좌 이체 미션 진행했습니다. 아직 고민하지 못한 점은 다음과 같습니다.

  • 동시성을 어떻게 제어할까
  • 유스케이스가 진행되는 동안 트랜잭션 REPEATABLE_READ가 유지되어야 하지 않을까
  • 중복 거래 판단 여부 고민하지 못함
  • 실패 케이스 고려 못함

요구사항 정제

  • 계좌 번호를 입력해 계좌를 생성한다.
    • 계좌 번호는 10자리로 구성되어있다.
    • 계좌 번호는 중복되어서는 안된다.
  • 자신 계좌 번호상대방 계좌 번호 그리고 돈의 수량을 입력해 송금을 진행 한 후 계좌 잔액을 노출한다.
    • 상대방 계좌 번호가 존재하지 않으면 안된다.
    • 자신 계좌 번호가 존재하지 않으면 안된다.
    • 자신 계좌 번호상대방 계좌 번호가 동일하면 안된다.
    • 돈의 수량은 0보다 커야한다.
    • 자신 계좌에 잔액이 입력한 돈의 수량보다 많아야 한다.
    • 동일한 송금은 두번 요청할 수 없다.
    • 자신 계좌에서 상대방의 계좌로 돈을 전달한다.
    • 송금한 기록을 남긴다. 송금 기록에는 자신의 계좌 번호, 상대방 계좌 번호, 송금한 돈의 수량, 송금한 일자가 포함된다.
    • 송금 후 자신 계좌 잔액을 노출한다.
  • 계좌 번호, 돈의 수량를 입력해 돈을 입급한다.
    • 계좌 번호가 존재하지 않으면 안된다.
    • 돈의 수량은 0보다 커야한다.
  • 계좌 번호, 돈의 수량를 입력해 돈을 출금한다.
    • 계좌 번호가 존재하지 않으면 안된다.
    • 돈의 수량은 0보다 커야한다.
    • 계좌에 잔액이 입력한 돈의 수량보다 많아야 한다.

모델링

한글 영어 설명
송금 Transfer 송금에는 송금한 계좌, 송금받은 계좌, 송금한 돈의 수량, 송금한 일자가 포함된다.
송금한 계좌 sourceAccount 송금하려는 계좌 정보.
송금받은 계좌 targetAccount 송금받는 계좌 정보.
송금한 돈의 수량 transferMoney 송금할 돈의 수량.
송금한 일자 transferDate 송금한 일자는 송금한 날짜.
계좌 Account 계좌에는 계좌 번호, 생성 일자 정보, 잔액 정보, 송금 이력을 포함한다.
계좌 번호 AccountNumber 10자리로 구성된 고유한 값.
생성 일자 createDate 계좌를 생성한 날짜.
잔액 balance 계좌에 남은 돈의 수량.
송금 이력 transferHistories 송금 이력에는 송금한 계좌 번호, 송금받은 계좌 번호, 송금한 돈의 수량, 송금한 일자가 포함된다.
Money 주고받는 돈의 기본 단위. 돈의 수량은 0 이상이어야 한다.
입출금 이력 transactionHistory 입출금 이력에는 계좌 번호, 입출금 타입, 돈의 수량, 입출금 일자가 포함된다.

입금

  • 계좌 번호(AccountNumber)돈의 수량(Money)을 입력해 돈을 입금한다.
  • 계좌 번호(AccountNumber)가 존재하지 않으면 안된다.
  • 돈의 수량(Money)은 0보다 커야한다.
  • 입출금 이력(transactionHisotry)입금 기록(DEPOSIT)을 추가한다.

출금

  • 계좌 번호(AccountNumber)돈의 수량(Money)을 입력해 돈을 출금한다.
  • 계좌 번호(AccountNumber)가 존재하지 않으면 안된다.
  • 돈의 수량(Money)은 0보다 커야한다.
  • 계좌에 잔액이 입력한 돈의 수량(Money)보다 많아야 한다.
  • 입출금 이력(transactionHisotry)출금 기록(WITHDRAW)을 추가한다.

송금

  • 자신 계좌(sourceAccount)상대방 계좌(targetAccount), 송금 일자(transferDate) 그리고 돈의 수량(transferMoney)을 입력해 송금한다.
  • 상대방 계좌(targetAccount)가 존재하지 않으면 안된다.
  • 자신 계좌(sourceAccount)가 존재하지 않으면 안된다.
  • 자신 계좌(sourceAccount)상대방 계좌(targetAccount)가 동일하면 안된다.
  • 돈의 수량(transferMoney)은 0보다 커야한다.
  • 자신 계좌(sourceAccount)입출금 이력(transactionHisotry)에는 출금 기록(WITHDRAW)을 추가한다.
  • 상대방 계좌(targetAccount)입출금 이력(transactionHisotry)에는 입금 기록(DEPOSIT)을 추가한다.

계좌

  • 계좌에는 계좌 번호(AccountNumber), 생성 일자 정보(createDate), 잔액 정보(balance), 송금 이력(transferHistories), 입출금 이력(transactionHisotry)를 포함한다.
  • 입출금 이력(transactionHisotry) 에는 계좌 번호(AccountNumber), 입출금 타입(type), 돈의 수량(Money), 입출금 일자(transactionDate)가 포함된다.
  • 입출금 이력(transactionHisotry)으로 잔액 정보(balance)를 계산한다.
  • 계좌 번호(AccountNumber)는 10자리로 구성되어있다.
  • 잔액 정보(balance)는 0 이상이어야 한다.
  • 송금 이력(transferHistories) 에는 송금한 계좌(sourceAccountNumber), 송금받은 계좌(targetAccountNumber), 송금한 돈의 수량(transferMoney), 송금한 일자(transferDate)가 포함된다.

돈(Money)

  • 금액 정보(amount)가 포함된다.

클래스 다이어그램

classDiagram
    class Withdraw {
        - Account targetAccount
        - Money withdrawMoney
        - Date withdrawDate
    }

    class Deposit {
        - Account targetAccount
        - Money depositMoney
        - Date depositDate
    }

    class Transfer {
        - Account sourceAccount
        - Account targetAccount
        - money transferMoney
        - Date transferDate
    }

    class Account {
        - AccountNumber number
        - Money balance
        - List~TransferHistory~ transferHistories
        - Date createdDate
    }

    class AccountNumber {
        - String number
    }

    class TransferHistory {
        - AccountNumber sourceAccountNumber
        - AccountNumber targetAccountNumber
        - Money transferMoney
        - TransferDate transferDate
    }

    class Money {
        - int amount
    }

    Withdraw *-- Account
    Withdraw *-- Money
    Deposit *-- Account
    Deposit *-- Money
    Account *-- AccountNumber
    Account *-- Money
    Account *-- TransferHistory
    Transfer *-- Money
    Transfer *-- Account
    TransferHistory *-- Money
    TransferHistory *-- AccountNumber
Loading

erd

erDiagram
    transfer_history {
      id long pk
      source_account_number varchar(200)
      target_account_number varchar(200)
      transfer_money int
      trasfer_date date
    }
    
    account {
      id long pk
      account_number varchar(200)
      created_date date
     }

    account_transaction {
      id long pk
      account_id long fk
      type enum "WITHDRAW, DEPOSIT"
      money int
      transaction_date date
    }

    account ||--o{ transfer_history: has
    account ||--o{ account_transaction: contains
Loading

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