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
)
'📒 TIL - Today I Learned' 카테고리의 다른 글
20231219 / Spring Bean / Bean Scope (0) | 2023.12.19 |
---|---|
20231218 / Spring 입문 / DI / IoC / 생성자 주입 방식 (2) | 2023.12.18 |
20231215 / Spring 예습 독학 (0) | 2023.12.15 |
20231215 / 컬렉션 ( List, Set, Map ) / 배열과 리스트 / 특강) 클래스 (2) | 2023.12.15 |
20231214 / 배열 ( Array ) (0) | 2023.12.14 |
블로그의 정보
꿈틀꿈틀 개발일기
jeongminy