프로젝트내의 송금 서비스 기능이 잘 동작하는지 수행해보았다.

 
@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원을 송금하는 시나리오를 가정하고 작성해보았다.

결과

image.png

디비 조회시 이렇게 정상적으로 송금한 결과를 확인할수 있다.

송금시 송금한 로그 뿐아니라 입금받은 사람의 로그도 추가해서 , 입금 받은 사람의 계좌내역을 조회할떄 해당 로그를 확인할 수 있도록 하였다.

개선사항

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) 를 조합해서

로그 캐시의 식별 키로 사용하였다.