Code Monkey home page Code Monkey logo

hello-banking-api's Introduction

hello-banking-api's People

Contributors

geon-chang avatar this-is-spear avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

hello-banking-api's Issues

Documentation : Banking

Dictionary

영문 한글 설명
User 사용자 서비스를 사용하는 사람.
Account 계좌 계좌를 관리하기 위한 단위.
잔액과 사용 내역 정보 포함.
사용자는 최소 하나 이상의 계좌를 가짐.
AccountBalance 계좌 잔액 계좌 잔액을 의미.
계좌의 Balance.
AccountHistory 계좌 사용 기록 계좌 금액 변동 내역 의미.
기록 타입 정보를 가진다.
HistoryType 기록 타입 기록 타입은 입금(DEPOSIT), 출금(WITHDRAW) 중 하나의 정보를 가진다.
AccountHistoryList 계좌 사용 목록 AccountHistory의 모음.
Money 금액 돈을 관리하는 단위.
0원 이상이어야 한다.

Modeling

AccoutController

  • 사용자의 계좌(AccountNumber)를 입력해 잔액(AccountBalance)과 사용 목록(AccountHistoryList)을 반환한다.(getAccountBalanceAndAccountHistory)
    • 세션(Session)에서 사용자의 정보(User)를 식별해 사용자의 계좌가 맞는지 확인한다.
    • 잔액(Balance)과 사용 목록(AccountHistoryList)을 반환한다.
  • 사용자의 계좌 정보(FromAccountNumber), 상대방의 계좌 정보(ToAccountNumber), 금액(Money)을 입력받아 돈을 이체한다. (transferMoney)
    • 세션(Session)에서 사용자의 정보(User)를 식별해 사용자의 계좌가 맞는지 확인한다.
    • 돈(Money)을 이체한다.
  • 사용자의 정보를 식별해 계좌 이체할 상대방의 리스트를 반환한다.(getTargetsToBeTransfer) - (임시)
    • 이체할 상대방의 리스트(Targets)를 반환한다.

AccoutApplicationService

  • 계좌 번호(AccountNumber)로 잔액(AccountBalance)과 히스토리(AccountHistory)을 반환한다.
    • 사용자 계좌 히스토리(AccountHistory)를 조회한다.
    • 사용자 계좌 잔액(AccountBalance)을 조회한다.
  • 사용자의 계좌(FromAccountNumber)에서 상대방(ToAccountNumber)에게 입력받은 금액을 이체한다.
    • 계좌 이체한다.
    • 계좌 이체가 완료된 이후 사용자에게 이체 완료 알람을 보낸다.
    • 계좌 이체가 완료된 이후 상대방에게 입금 완료 알람을 보낸다.
  • 사용자 리스트를 반환한다. - (임시)
    • 전체 사용자 계좌 번호(AccountNumber) 리스트를 반환한다.

AccountService

  • 계좌를 조회한다.
  • 계좌에 입금하다.
    • 사용자의 계좌 번호(AccountNumber)를 입력해 히스토리(AccountHistory)에 입금 정보를 추가한다.
  • 계좌에 출금하다.
    • 사용자의 계좌 번호(AccountNumber)를 입력해 히스토리(AccountHistory)에 지출 정보를 추가한다.
  • 계좌 이체한다.
    • 계좌 번호(FromAccountNumber, ToAccountNumber)가 존재해야 한다.
    • 같은 계좌에 이체할 수 없다.
    • 사용자의 계좌에서 상대방의 계좌로 금액을 이체한다.
    • 사용자의 계좌 번호(AccountNumber)를 입력해 히스토리(AccountHistory)에 지출 정보를 추가한다.
    • 상대방의 계좌 번호(AccountNumber)를 입력해 히스토리(AccountHistory)에 입금 정보를 추가한다.

ConcurrencyManager

  • 동시성을 제어한다.
    • 다른 사용자의 접근을 제한한다.
    • 사용자의 동작을 진행한다.
    • 다른 사용자의 제한을 해제한다.

LockRepository

  • 다른 사용자의 접근을 제한한다.
  • 다른 사용자의 제한을 해제한다.

UserRepository

  • 사용자 정보를 저장한다.
  • 사용자 정보를 반환한다.
  • 사용자의 전체 리스트를 반환한다.

AccountRepository

  • 계좌를 생성한다.
  • 계좌 정보를 반환한다.

AccountHistory

  • 계좌 사용 기록을 저장한다.
  • 계좌 사용 기록 목록을 반환한다.

AccountNumberGenerator

  • 계좌 번호를 생성한다.

User

  • 상태
    • 사용자 식별자(userId), 아이디(Id), 이름(name), 비밀번호(Password)를 가진다.

Account

  • 상태
    • 계좌 식별자(Id), 계좌 번호(AccountNumber), 사용자 식별자(UserId), 계좌 잔액(Balance) 정보를 가진다.
      • 계좌 번호는 유일하다.
      • 계좌 잔액은 금액(Money)의 정보이다.
  • 행위
    • 금액을 출금한다.
    • 금액을 입금한다.

AccountNumber

  • 상태
    • 계좌 번호는 숫자와 - 의 조합이다.
    • 계좌 번호의 숫자는 총 13 자리이다.
    • 계좌 번호의 포맷은 xxx-xxxx-xxxxxx 이다.

Money

  • 상태
    • 금액을 의미한다.
    • 금액(Money)은 0 원 이상이어야 한다.

AccountHistories

  • 상태
    • 사용자의 계좌 이체 사용 기록(AccountHistory) 목록을 가진다.

AccountHistory

  • 상태
    • 히스토리 식별자(Id), 계좌 번호(FromAccountNumber)와, 상대 계좌 번호(ToAccountNumber) 기록 타입(HistoryType)과 금액(Money), 계좌 잔액(Balance), 기록 날짜(RecordDate)을 포함한다.
    • 기록 타입(HistoryType)은 입금(DEPOSIT), 출금(WITHDRAW) 중 하나의 정보를 포함한다.

참고 사항

  • 도메인 관련 용어는 금융 API를 제공하는 Exness, Toss에서 참고했습니다.

Documentation : Member

요구사항

  • 사용자는 이메일, 비밀번호, 이름을 입력해 회원가입할 수 있다.
  • 사용자는 회원가입을 하면 자동으로 계좌를 하나 개설한다.

용어 사전

영문 한글 설명
Email 이메일 사용자의 이메일.
Password 비밀번호 사용자의 비밀번호
EncodedPassword 암호화된 비밀번호 암호화 알고리즘으로 암호화된 사용자의 비밀번호
User 사용자의 정보 사용자의 정보를 의미한다. principal에 사용자 정보를 확인할 수 있다.
RoleType 권한 회원(ROLE_MEMBER), 운영자(ROLE_ADMIN) 정보.

모델링

MemberController

  • 이메일, 비밀번호, 이름을 입력받아 회원가입한다.
  • 세션에 저장된 사용자 정보를 이용해 사용자의 정보를 조회한다.

UserDetailService

  • 로그인하려는 사용자의 정보를 확인한다.
    • 로그인하려는 사용자 정보가 있어야 한다.

MemberApplicationService

  • 이메일, 비밀번호, 이름을 입력받아 회원가입한다.
    • 이메일이 유일해야 한다.
    • 저장할 때, 비밀번호를 암호화한다.
  • 사용자 식별자를 이용해 사용자의 정보를 조회한다.
    • 로그인하려는 사용자 정보가 있어야 한다.

Member

  • 상태
    • 사용자는 식별자, 이메일, 이름, 권한, 암호화된 비밀번호를 가진다.
    • 이메일은 형식에 맞아야 한다.
    • 이름은 비어있을 수 없다.
    • 권한은 회원(ROLE_MEMBER), 운영자(ROLE_ADMIN) 중 하나의 정보를 가진다.

User Scenario : Account

사용자 시나리오 목록

  • 사용자는 5천원을 입금하고 5천원을 출금하면 잔액이 0원 남는다.
  • 잔액이 만 원인 사용자는 상대방에게 5천 원 계좌 이체하면 잔액이 5천 원이 남는다.
  • 잔액이 3천원인 사용자는 상대방에게 5천원을 이체하려하면 실패한다.
  • 백만원 있는 사용자가 상대방에게 동시에 천원을 200번 요청하면 잔액에 80만원 남는다.

추가적인 인가 기능을 한 곳에서 관리한다.

Description

  • 공통 관심사를 한 곳에 관리해 유지 보수 비용을 줄입니다.

How to solved

  • 인증 인가 통합 테스트 작성과 문서화 리팩토링을 진행합니다.
  • 인가가 필요한 소스 코드를 리팩토링합니다.
  • 인증 인가가 필요한 테스트 로직을 리팩토링합니다.

User Scenario : Friend

사용자 시나리오 목록

  • 친구 요청을 받은 사용자가 승인을 하면 친구 목록에 추가가 된다.
  • 친구 요청을 받은 사용자가 거절하면 친구 목록에서 볼 수 없다.
  • 거절한 사용자에게 다시 친구 추가 요청을 보낼 수 있다.
  • 요청 대기중이거나 승인한 사용자에게 친구 요청을 보낼 수 없다.

Documentation : Friend

기능

  • 상대방에게 친구 요청을 한다.
  • 친구 요청에 대한 응답을 보낸다.
  • 친구 목록을 조회한다.

용어 사전

영어 한글 설명
Friend 친구 정보 친구 정보.
FromUser 사용자 친구 요청을 보낸 사용자.
ToUser 상대방 친구 요청을 받은 사용자.
FriendHistory 친구 요청 이력 친구 요청 이력을 보낸 정보.
ApprovalStatus 요청 승인 여부 요청이 승인됐는지 여부이다. 승인 여부는 대기(WAITING), 승인(APPROVED), 거절(REJECTED) 중 하나의 정보를 포함한다.
WAITING 대기 요청이 대기인 상태.
APPROVED 승인 요청이 승인된 상태.
REJECTED 실패 요청이 실패된 상태.
Email 이메일 사용자 식별할 수 있는 수단.

모델링

Friend

  • 상태
    • 식별자(Id), 사용자 식별자(FromMemberId), 상대방 식별자(ToMemberId)를 포함한다.
    • 사용자 식별자는 비어있을 수 없다.
    • 상대방 식별자는 비어있을 수 없다.
    • 사용자 식별자와 상대방 식별자는 같을 수 없다.

AskedFriendHistory

  • 상태
    • 식별자(Id), 사용자 식별자(FromMemberId), 상대방 식별자(ToMemberId), 승인 여부(ApprovalStatus)를 포함한다.
    • 승인 여부는 대기(WAITING), 승인(APPROVED), 거절(REJECTED)중 하나의 정보를 가진다.
    • 사용자 식별자는 비어있을 수 없다.
    • 상대방 식별자는 비어있을 수 없다.
    • 사용자 식별자와 상대방 식별자는 같을 수 없다.
  • 행위
    • 대기(WAITING)에서 승인(APPROVED)으로 변경한다.
      • 승인 여부(ApprovalStatus)가 대기(WAITING)여야 한다.
    • 대기(WAITING)에서 거절(REJECTED)로 변경한다.
      • 승인 여부(ApprovalStatus)가 대기(WAITING)여야 한다.
    • 거절(REJECTED)에서 대기(WAITING)로 변경한다.
      • 승인 여부(ApprovalStatus)가 거절(REJECTED)이어야 한다.

SocialNetworkController

  • 상대방에게 친구 요청을 보낸다.
    • 회원만 사용할 수 있다.
  • 자신에게 온 친구 요청을 승낙한다.
    • 회원만 사용할 수 있다.
  • 자신에게 온 친구 요청을 거절한다.
    • 회원만 사용할 수 있다.
  • 자신의 친구 목록을 조회한다.
    • 회원만 사용할 수 있다.
  • 자신에게 온 친구 요청 목록을 확인한다.
    • 회원만 사용할 수 있다.

SocialNetworkService

  • 사용자의 정보(Principal)와 상대방의 식별자(MemberId)를 입력받아 친구 요청을 보낸다.
    • 사용자의 정보가 존재해야 한다.
    • 상대방의 정보가 존재해야 한다.
  • 사용자 정보(Principal)와 친구 요청 식별자(AskedFriendHistoryId)를 입력해 친구 요청을 승낙한다.
    • 요청 받은 사용자 본인이어야 한다.
    • 친구 요청을 승낙한다.
    • 친구 정보가 생성된다.
  • 사용자 정보(Principal)와 친구 요청 식별자(AskedFriendHistoryId)를 입력해 친구 요청을 거절한다.
    • 요청 받은 사용자 본인이어야 한다.
    • 친구 요청을 거절한다.
  • 자신의 정보(Principal)를 이용해 친구 목록을 조회한다.
  • 자신의 정보(Principal)를 이용해 자신에게 온 친구 요청 목록을 확인한다.

FriendService

  • 친구 정보를 저장한다.
  • 친구 목록을 조회한다.
  • 친구 요청 정보를 저장한다.
    • 상대방에게 보내거나 받은 이력이 있으면 안된다.
    • 생성된 친구 요청의 승인 여부(ApprovalStatus)는 대기(WAITING) 상태이거나 거절(REJECTED) 상태여아 한다.
  • 친구 요청 정보를 조회한다.
  • 대기(WAITING) 중인 친구 요청 목록을 조회한다.
  • 친구 요청 정보를 승낙한다.
    • 친구 요청 정보가 존재해야 한다.
    • 승인 여부(ApprovalStatus)가 승인(APPROVED)으로 변경된다.
  • 친구 요청 정보를 거절한다.
    • 친구 요청 정보가 존재해야 한다.
    • 승인 여부(ApprovalStatus)가 거절(REJECTED)로 변경된다.

동시성 제어 방법을 변경한다.

Description

  • 기존에 사용한 synchronized 락이 구현 비용은 작지만, 유지 비용이 매우 비싼 문제가 있습니다.
  • 동시성 제어를 해결하기 위해 여러 기술들을 고민했고 개발, 운영 비용이 적은 Named Lock을 선택했습니다.

비교

  장점 단점
Transactional
Repeatable Read
  • Non-Blocking
  • 개발, 운영 비용 적음
  • 데드락 발생
  • 특정 DB에서는 불가능
  • Synchronized
  • 개발 비용 적음
  • 운영 비용 매우 많음
  • CAS
  • Non-Blocking
  • 예외 직접 관리
  • 개발 비용 많음
  • Optimistic Lock
  • Non-Blocking
  • 구현 간단
  • 개발 비용 많음
  • Passimisitc Lock
  • 많은 동시성 처리 가능
  • 구현 간단
  • Blocking
  • 운영 비용 많음
  • Named Lock
  • Non-Blocking
  • 개발, 운영 비용 적음
  • Blocking
  • 예외 직접 관리
  • Reddisen Lock
  • 많은 동시성 처리 가능
  • 구현 간단
  • Non-Blocking
  • 예외 직접 관리
  • 개발, 운영 비용 많음
  • Issue : 자신의 계좌로만 거래가 가능하다.

    Description

    • 자신의 계좌에서만 거래를 진행할 수 있도록 보장해야 합니다.

    How to solved

    • Presentation 레이어에서 로그인한 사용자의 세션 정보와 계좌 주인이 일치한지 확인합니다.

    같은 요청이 두 번 보내졌을 때, 하나만 처리한다.

    Description

    • 안전한 API 요청을 위해 모든 요청이 멱등을 가집니다.
    • 비용을 고려해 성능 목적이 아닌 멱등성만을 제공합니다.

    How to solved

    • 사용자는 header에 멱등성을 유지할 수 있는 키와 함께 요청을 보냅니다.
    • 멱등성 키와 응답 데이터를 DB에 관리합니다.
    • 요청을 보낼 때, 멱등성 키와 연관된 정보가 있을 경우 해당 정보를 반환합니다.

    Documentation : Alarm

    용어 사전

    영문 한글 설명
    AlarmMessage 알람 메시지 정보를 제공하는 메시지
    TaskStatus 작업 상태 성공(SUCCESS), 실패(FAIL) 중 하나의 정보를 가진다.
    TaskType 작업 유형 출금(WITHDRAW), 입금(DEPOSIT), 이체(TRANSFER) 중 하나의 정보를 가진다.
    userId 사용자 식별자 사용자를 판변하는 식별자
    NumbleAlarmService 넘블 알람 서비스 넘블에서 제공하는 외부 API

    모델링

    AlarmType

    • 작업 상태(status)와 작업 유형(type)의 정보가 포함된다.

    AlarmService

    • 사용자 식별자(userId)와 작업 유형(AlarmType)에 따라 사용자에게 알림을 보낸다.
      • 외부 API를 활용해 메시지를 전송한다.

    Recommend Projects

    • React photo React

      A declarative, efficient, and flexible JavaScript library for building user interfaces.

    • Vue.js photo Vue.js

      🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

    • Typescript photo Typescript

      TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    • TensorFlow photo TensorFlow

      An Open Source Machine Learning Framework for Everyone

    • Django photo Django

      The Web framework for perfectionists with deadlines.

    • D3 photo D3

      Bring data to life with SVG, Canvas and HTML. 📊📈🎉

    Recommend Topics

    • javascript

      JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

    • web

      Some thing interesting about web. New door for the world.

    • server

      A server is a program made to process requests and deliver data to clients.

    • Machine learning

      Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

    • Game

      Some thing interesting about game, make everyone happy.

    Recommend Org

    • Facebook photo Facebook

      We are working to build community through open source technology. NB: members must have two-factor auth.

    • Microsoft photo Microsoft

      Open source projects and samples from Microsoft.

    • Google photo Google

      Google ❤️ Open Source for everyone.

    • D3 photo D3

      Data-Driven Documents codes.