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