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

[3주차] 송금 서비스 구현 #1

Open
wants to merge 1 commit into
base: feature/subin
Choose a base branch
from

Conversation

subin-Jeong
Copy link

@subin-Jeong subin-Jeong commented Feb 18, 2024

송금 서비스를 구현합니다.

작업 내용

  • 헥사고날 아키텍처를 사용하여 송금 서비스를 구현합니다.
  • 사용 도메인
    • 사용자 : 계좌를 소유한 사용자
    • 계좌 : 거래를 위한 계좌
    • 거래 : 계좌 간 거래내역
  • 계좌 생성 시 1000원을 잔액으로 설정합니다.
  • 계좌 간 송금 발생 시, 출금계좌와 입금계좌 간 끝나지 않은 거래가 있는 경우 송금할 수 없습니다. (중복 송금 방지)

TODO

  • 유즈케이스에 대한 테스트 코드 작성이 필요합니다.
  • 송금 처리 시, 트랜잭션이 올바르게 커밋되지 않는 현상 수정이 필요합니다.
    • 잔액이 줄어들지 않고 있음
  • 송금 내역 관리를 위한 스케줄러가 필요합니다.
  • 해당 내용 구현
    • 송금 내역은 5개월동안 보장되고 그 이후의 내역은 삭제되어야 한다.
  • 출금계좌와 입금계좌 간 끝나지 않은 거래가 계속해서 처리되지 않는 경우에 대한 처리가 필요합니다.
    • 처리하지 않을 경우 끝나지 않은 거래가 있으면 특정 출금계좌와 입금계좌간 송금이 계속해서 불가합니다.

@this-is-spear
Copy link
Collaborator

this-is-spear commented Feb 18, 2024

헉!! 이거 소스 코드 외 파일이 추가 됐습니다!! 저는 gitignore 사이트 에서 코틀린, 인텔리제이, 그레들 종속성을 제거해서 사용하고 있습니다 ㅎㅎ

import com.example.estpayments.common.Constant.ZERO_BALANCE

@JvmInline
value class Money(val value: Long) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

저는 값 객체를 만들 때 내부 값은 외부에 참조할 수 없게 private으로 생성하려고 노력해요 ㅎㅎ 만약 내부 값을 비교하거나 더해야하는 상황이 있다면 메서드로 만들어 값 객체 자체가 의미가 있을 수 있도록 합니다!

만약 10,000 이라는 값이 있는지 비교하고 싶다면 Money(10,000L) 객체와 비교하게 되는거죠 ☺️


fun isGreaterThan(money: Money): Boolean = value > money.value

fun minus(money: Money): Money = Money(value.minus(money.value))
Copy link
Collaborator

Choose a reason for hiding this comment

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

kotlin 에는 operator 라는 키워드를 사용하면 - 기호로 코드를 표현 할 수 있습니다!
아래 처럼 사용했다면,

operator fun minus(amount: Money) = Money(value.minus(money.value))

아래처럼 사용할 수 있게 됩니다 ㅎㅎ

val zero = Money(1_000L) - Money(1_000L)

zero == Money(0L) // true!!

value class Money(val value: Long) {
fun isPositive(): Boolean = value > ZERO_BALANCE

fun isGreaterThan(money: Money): Boolean = value > money.value
Copy link
Collaborator

Choose a reason for hiding this comment

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

compareTo 를 사용하면 > 기호로 코드를 표현 할 수 있습니다!

operator fun compareTo(amount: Money) = this.amount.compareTo(amount.amount)

아래처럼 사용 할 수 있습니다!

Money(100L) < Money(200L) // true
Money(100L) > Money(200L) // false

val senderAccountId: AccountId,
val receiverAccountId: AccountId,
val amount: Money,
val transactionDate: LocalDateTime? = LocalDateTime.now(),
Copy link
Collaborator

Choose a reason for hiding this comment

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

저는 거래 시간을 어떻게 결정해야할지 고민이더라구요..! 사용자가 거래한 시점으로 결정을 해야할지, 아니면 데이터가 만들어진 시점을 고려해야할지 고민이 됐습니다!

저는 리트라이가 되면 사용자가 원했던 거래시간과는 괴리가 생길듯 해서 클라이언트에게 거래 시간을 전달받을 수 있도록 강제했습니다. ㅎㅎ

val userId: UserId,
var balance: Money,
) {
fun withdrawable(money: Money): Boolean = balance.isPositive() && balance.isGreaterThan(money)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Moneyinit에서 값이 0보다 큰지 비교하는건 어떨까요? 그럼 Money 객체는 현실의 돈과 유사한 상태를 가질 수 있어보이고 Money 객체를 사용할 때마다 값을 검증할 일이 적어보여요 ㅎㅎ

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.

2 participants