프로젝트내의 송금 서비스 기능이 잘 동작하는지 수행해보았다.
@SpringBootTest
@Transactional
class BankAccountServiceTest {
@Autowired
private BankAccountRepository bankAccountRepository;
@Autowired
private LogRepository logRepository;
@Autowired
private BankService bankService;
@Autowired
private UserService userService;
@Autowired
private BankAccountService bankAccountService;
@Autowired
private UserRepository userRepository;
@Test
@Rollback(false)
void testTransferUsingExistingDatabaseUsers() {
// Arrange
String senderAccountNumber = "9824"; // Replace with actual sender account number in DB
String recipientAccountNumber = "1131"; // Replace with actual recipient account number in DB
Long transferAmount = 2L;
// Fetch sender and recipient from the database
BankAccount senderAccount = bankAccountRepository.findByAccountNumber(senderAccountNumber);
BankAccount recipientAccount = bankAccountRepository.findByAccountNumber(recipientAccountNumber);
assertNotNull(senderAccount, "Sender account not found in the database");
assertNotNull(recipientAccount, "Recipient account not found in the database");
Long initialSenderBalance = senderAccount.getBalance();
Long initialRecipientBalance = recipientAccount.getBalance();
TransferDto transferDto = TransferDto.builder()
.amount(transferAmount)
.sender_banknumber(senderAccountNumber)
.recipient_banknumber(recipientAccountNumber)
.sender_name(senderAccount.getUser().getUsername())
.recipient_name(recipientAccount.getUser().getUsername())
// .user()
.senderAccount(senderAccount)
.recipientAccount(recipientAccount)
.build();
// Act
bankAccountService.transferToUser(transferDto, senderAccount.getUser());
// Assert
BankAccount updatedSenderAccount = bankAccountRepository.findByAccountNumber(senderAccountNumber);
BankAccount updatedRecipientAccount = bankAccountRepository.findByAccountNumber(recipientAccountNumber);
assertEquals(initialSenderBalance - transferAmount, updatedSenderAccount.getBalance());
assertEquals(initialRecipientBalance + transferAmount, updatedRecipientAccount.getBalance());
// [추가] Log 테이블 직접 조회
List<Log> logs = logRepository.findAll();
System.out.println("Log count: " + logs.size());
logs.forEach(System.out::println);
}
}
우선 이렇게 테스트 코드를 작성하여 송금 로직이 제대로 동작하는 지 확인해 보았다.
a 가 b 에게 2원을 송금하는 시나리오를 가정하고 작성해보았다.
디비 조회시 이렇게 정상적으로 송금한 결과를 확인할수 있다.
송금시 송금한 로그 뿐아니라 입금받은 사람의 로그도 추가해서 , 입금 받은 사람의 계좌내역을 조회할떄 해당 로그를 확인할 수 있도록 하였다.
redis caching 사용.
로그 조회시 좀 더 빠르게 조회하기 위해서 레디스 캐싱 전략을 사용하였다.
/**
* 캐시된 로그 조회
*/
@Cacheable(value = "logCache", key = "#userId + '-' + #bankNumber", unless = "#result == null")
public List<LogDto> getLogs(String userId, String bankNumber) {
log.info("Cache miss: Fetching logs for user={} bankNumber={}", userId, bankNumber);
return getLogsWithoutCache(userId, bankNumber);
}
유저 아이디(userId)와 계좌 번호(bankNumber) 를 조합해서
로그 캐시의 식별 키로 사용하였다.