본문 바로가기
BackEnd/Project

[Loan] Ch06. 대출 상환 수정 기능 구현

by 개발 Blog 2024. 9. 14.

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

 

이번 장에서는 대출 상환 내역을 수정하는 기능을 구현한다. 이를 위해 필요한 컨트롤러, 서비스, DTO, 그리고 리포지토리 메서드를 추가하였다.

 

1. InternalController 메서드 추가

상환 내역을 수정할 수 있도록 InternalController에 PUT 메서드를 추가하였다. 이 메서드는 특정 repaymentId에 대한 상환 내역을 수정하며, 수정된 데이터를 반환하는 역할을 한다.

@PutMapping("/repayments/{repaymentId}")
public ResponseDTO<RepaymentDTO.UpdateResponse> update(@PathVariable Long repaymentId, @RequestBody RepaymentDTO.Request request) {
    return ok(repaymentService.update(repaymentId, request));
}

 

2. RepaymentDTO 클래스에 UpdateResponse 추가

상환 내역 수정 시 클라이언트에게 전달할 데이터를 정의하기 위해 RepaymentDTO 클래스에 UpdateResponse라는 새로운 내부 클래스를 추가하였다. 이 클래스는 신청 ID, 수정 전 상환 금액, 수정 후 상환 금액, 잔액, 생성일, 수정일 정보를 포함하고 있다.

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
public static class UpdateResponse {

    private Long applicationId;

    private BigDecimal beforeRepaymentAmount;

    private BigDecimal afterRepaymentAmount;

    private BigDecimal balance;

    private LocalDateTime createdAt;

    private LocalDateTime updatedAt;
}

 

3. RepaymentService 메서드 추가

비즈니스 로직을 처리하는 RepaymentService에 상환 내역 수정 기능을 위한 update 메서드를 추가하였다. 이 메서드는 repaymentId에 따라 상환 금액을 수정하고, 잔액을 업데이트하는 역할을 한다.

UpdateResponse update(Long repaymentId, Request request);

 

4. RepaymentServiceImpl 구현체 추가

RepaymentServiceImpl 클래스에서 update 메서드를 구현하였다. 

@Override
public UpdateResponse update(Long repaymentId, Request request) {
    Repayment repayment = repaymentRepository.findById(repaymentId).orElseThrow(() -> {
        throw new BaseException(ResultType.SYSTEM_ERROR);
    });

    Long applicationId = repayment.getRepaymentId();
    BigDecimal beforeRepaymentAmount = repayment.getRepaymentAmount();

    balanceService.repaymentUpdate(applicationId,
            BalanceDTO.RepaymentRequest.builder()
                    .repaymentAmount(beforeRepaymentAmount)
                    .type(RepaymentType.ADD)
                    .build()
    );
    repayment.setRepaymentAmount(request.getRepaymentAmount());
    repaymentRepository.save(repayment);

    BalanceDTO.Response updatedBalance = balanceService.repaymentUpdate(applicationId, builder()
            .repaymentAmount(request.getRepaymentAmount())
            .type(RepaymentType.REMOVE)
            .build());

    return UpdateResponse.builder()
            .applicationId(applicationId)
            .beforeRepaymentAmount(beforeRepaymentAmount)
            .afterRepaymentAmount(request.getRepaymentAmount())
            .balance(updatedBalance.getBalance())
            .createdAt(repayment.getCreatedAt())
            .updatedAt(repayment.getUpdatedAt())
            .build();
}

이 메서드는 다음 과정을 통해 상환 내역을 수정한다.

  1. repaymentId로 상환 정보를 조회하고, 기존 상환 금액을 확인한다.
  2. 기존 상환 금액을 더하는 방식으로 잔액을 업데이트한 후, 새로운 상환 금액으로 업데이트한다.
  3. 잔액을 다시 한번 업데이트하여 최종 잔액을 반영한다.
  4. 수정된 상환 내역과 함께 잔액 정보를 담아 클라이언트에게 반환한다.

이와 같이 대출 상환 수정 기능이 구현되었으며, 이를 통해 사용자는 기존 상환 내역을 수정할 수 있게 된다.

 

5. 실행 테스트

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

 

1) 대출 상환 조회

처음 대출을 받은 후, 100만 원을 상환한 기록이 조회되었다. 조회된 상환 내역은 repaymentId, repaymentAmount, createdAt, updatedAt 등의 정보를 포함하고 있으며, 첫 상환 금액이 제대로 반영되었음을 확인할 수 있었다.

 

2) 상환 금액 수정

처음 100만 원으로 상환했던 금액을 200만 원으로 수정하였다. 수정 요청 후 응답에서는 beforeRepaymentAmount가 100만 원, afterRepaymentAmount가 200만 원으로 정상적으로 수정되었음을 확인할 수 있다. 또한, 잔액도 업데이트된 상환 금액을 반영하여 수정되었다.

이 테스트를 통해 상환 내역 수정 기능이 정상적으로 동작하며, 상환 금액과 잔액이 올바르게 수정되는 것을 확인할 수 있었다.