꿈틀꿈틀 개발일기

20231217 / Spring 입문 / 정의 / Framework / Library / Layered Architecture / DTO / Domain Model

by jeongminy

 

 

 

TransferService.kt

package transfer

import org.example.transfer.BankAccount

class TransferService {

    private val bankAccounts = listOf<BankAccount>(
        BankAccount(address = "abc", balance = 100, userId = "a"),
        BankAccount(address = "abcd", balance = 200, userId = "b")
    )

    fun transfer(request: TransferRequest): TransferResponse {
        // 인증, 인가
        val senderAccount = getBankAccountByAddress(request.fromAddress)
        if (!authenticate(senderAccount, request.userId)){
            return TransferResponse(success = false, message = "Unauthorized")
        }

        // 보내는 금액 확인
        if (request.amount < 0) {
            return TransferResponse(success = false, message = "Invalid amount")
        }

        // 보내는 주소, 받는 주소를 확인

        if (!isValidAddress(request.fromAddress) || !isValidAddress(request.toAddress)) {
            return TransferResponse(success = false, message = "Invalid address")
        }

        // 잔액 확인
        if (isSufficientBalance(senderAccount, request.amount)) {
            return TransferResponse(success = false, message = "No sufficient balance")
        }

        val receiverAccount = getBankAccountByAddress(request.toAddress)
        senderAccount.balance -= request.amount
        receiverAccount.balance += request.amount // 중요!! 줄어들고 더해지는 부분이 한번에 처리가 되어야 함. 하나의 큰 작업단위(Transaction)

        return TransferResponse(success = true, message = "Succeeded!!!")
    }

    private fun authenticate(bankAccount: BankAccount, userId: String): Boolean{
        return bankAccount.userId == userId
    }

    private fun isValidAddress(address: String): Boolean {
        // any함수는 중괄호블록 안에 있는 조건들중 하나라도 만족하면 true를 리턴함
        return bankAccounts.any { it.address == address }
    }

    private fun isSufficientBalance(bankAccount: BankAccount, amount: Int): Boolean {
        return bankAccount.balance >= amount
    }

    private fun getBankAccountByAddress(address: String): BankAccount {
        return bankAccounts.first { it.address == address }
    }
}

 

BankAccount.kt

data class BankAccount(val address: String, var balance: Int, val userId: String)

 

TransferRequest.kt

data class TransferRequest ( // DTO(data transfer object)
    val amount: Int,
    val fromAddress: String,
    val toAddress: String,
    val userId: String
    )

 

TransferResponse.kt

data class TransferResponse ( // DTO(data transfer object)
    val success: Boolean,
    val message: String
)

 

 

 

 

블로그의 정보

꿈틀꿈틀 개발일기

jeongminy

활동하기