꿈틀꿈틀 개발일기

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

활동하기