본문 바로가기
BackEnd/Project

[Loan] Ch06. 대출 상환 삭제 기능 구현

by 개발 Blog 2024. 9. 14.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

이번 장에서는 대출 상환 내역을 삭제하는 기능을 구현한다. 상환 내역은 완전히 삭제되는 것이 아니라, 소프트 삭제(soft delete) 방식으로 처리되며, 삭제된 상환 내역의 금액은 잔액에 다시 반영된다.

 

1. InternalController 메서드 추가

대출 상환 내역을 삭제할 수 있도록 InternalController에 DELETE 메서드를 추가하였다. 이 메서드는 특정 repaymentId에 해당하는 상환 내역을 삭제하는 역할을 하며, 반환 값은 Void로 설정되어 있다.

@DeleteMapping("/repayments/{repaymentId}")
public ResponseDTO<Void> deleteRepayment(@PathVariable Long repaymentId) {
    repaymentService.delete(repaymentId);
    return ok();
}

 

2. RepaymentService 메서드 추가

비즈니스 로직을 처리하는 RepaymentService에 상환 내역 삭제를 위한 delete 메서드를 추가하였다. 이 메서드는 repaymentId를 받아 해당 상환 내역을 삭제하는 역할을 한다.

void delete(Long repaymentId);

 

3. RepaymentServiceImpl 구현체 추가

RepaymentServiceImpl 클래스에서 delete 메서드를 구현하였다. 삭제 과정은 다음과 같이 이루어진다:

  • repaymentId로 상환 정보를 조회한 후, 해당 상환 금액을 잔액에 다시 더하는 방식으로 잔액을 업데이트한다.
  • 상환 내역은 물리적으로 삭제되지 않고, isDeleted 플래그를 true로 설정하는 방식으로 소프트 삭제된다.
@Override
public void delete(Long repaymentId) {
    Repayment repayment = repaymentRepository.findById(repaymentId).orElseThrow(() -> {
        throw new BaseException(ResultType.SYSTEM_ERROR);
    });

    Long applicationId = repayment.getApplicationId();
    BigDecimal removeRepaymentAmount = repayment.getRepaymentAmount();

    balanceService.repaymentUpdate(applicationId,
            BalanceDTO.RepaymentRequest.builder()
                    .repaymentAmount(removeRepaymentAmount)
                    .type(RepaymentType.ADD).build());

    repayment.setIsDeleted(true);
    repaymentRepository.save(repayment);
}

 

4. 실행 테스트

작성한 코드를 실행하고 Postman을 통해 테스트를 진행한다.

처음에 100만 원을 상환했으나, 잘못된 상환 금액이었다. 이후 해당 상환 내역을 삭제한 뒤, 200만 원을 다시 상환하였다. 테스트 결과, 삭제와 재상환 모두 정상적으로 처리되었으며, 잔액 또한 올바르게 반영되었다.