본문 바로가기
BackEnd/Project

[Loan] Ch05. 대출 계약 기능 구현

by 개발 Blog 2024. 9. 13.

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

 

대출금을 집행해 주기 전에 최종적으로 신청한 대출 정보에 대해 심사를 받은 후 계약을 체결하는 과정이 먼저 선행되어야 한다. 이로 인해 대출 계약 기능을 먼저 구현한 후, 집행 기능을 구현하는 흐름으로 작업을 진행한다.

 

1. ApplicationController 메서드 추가

대출 계약을 체결하는 API를 추가한다. 해당 API는 PUT 요청으로 대출 신청 ID를 받아 해당 대출 신청에 대한 계약을 체결하는 역할을 한다.

@PutMapping("/{applicationId}/contract")
public ResponseDTO<Response> contract(@PathVariable Long applicationId) {
    return ok(applicationService.contract(applicationId));
}
  • @PutMapping("/{applicationId}/contract"): 대출 신청 ID를 받아 해당 대출 신청에 대한 계약을 체결한다.
  • applicationService.contract(applicationId): 서비스 계층에서 실제 계약 체결 로직을 처리하는 메서드를 호출한다.

2. 서비스 인터페이스 메서드 추가

서비스 인터페이스에 계약 체결을 처리하는 메서드를 추가한다.

Response contract(Long applicationId);
  • contract(Long applicationId): 해당 대출 신청에 대해 계약을 체결하는 메서드이다.

3. 서비스 구현체 필드, 메서드 추가

대출 계약 체결을 위해 필요한 필드 및 로직을 서비스 구현체에 추가한다.

private final JudgmentRepository judgmentRepository;

@Override
public Response contract(Long applicationId) {
    // 신청 정보 있는지
    Application application = applicationRepository.findById(applicationId).orElseThrow(() -> {
        throw new BaseException(ResultType.SYSTEM_ERROR);
    });

    // 심사 정보 있는지
    judgmentRepository.findAllByApplicationId(applicationId).orElseThrow(() ->{
        throw new BaseException(ResultType.SYSTEM_ERROR);
    });

    // 승인 금액 > 0
    if (application.getApprovalAmount() == null
            || application.getApprovalAmount().compareTo(BigDecimal.ZERO) == 0) {
        throw new BaseException(ResultType.SYSTEM_ERROR);
    }

    // 계약 체결
    application.setContractedAt(LocalDateTime.now());
    Application updated = applicationRepository.save(application);

    return modelMapper.map(updated, Response.class);
}
  • 신청 정보 확인: applicationRepository.findById(applicationId)를 통해 해당 신청 정보가 있는지 확인한다. 없을 경우 예외를 발생시킨다.
  • 심사 정보 확인: judgmentRepository.findAllByApplicationId(applicationId)로 해당 대출 신청이 심사를 받았는지 확인한다. 심사 정보가 없으면 예외를 발생시킨다.
  • 승인 금액 확인: 승인된 대출 금액이 0보다 큰지 확인한다. 승인 금액이 없거나 0일 경우 예외를 발생시킨다.
  • 계약 체결: 모든 조건이 충족되면 현재 시간을 계약 체결 시간으로 설정하고 데이터를 저장한다.

3. 실행 테스트

대출 계약 기능을 성공적으로 구현한 후, 대출 계약 프로세스가 정상적으로 동작하는지 테스트를 진행했다. 테스트는 다음 순서대로 이루어졌다.

  1. 대출 신청 등록: 먼저 사용자가 대출을 신청하는 기능을 통해 대출 신청을 등록했다.
  2. 심사 등록: 등록된 대출 신청에 대해 심사를 진행하여 심사 정보를 입력했다.
  3. 한도 부여: 심사가 완료된 후, 대출에 대해 승인 금액(한도)을 부여했다.
  4. 대출 계약 체결: 마지막으로, 승인된 대출에 대해 계약을 체결하는 API를 호출했다.

아래는 Postman을 이용해 PUT /applications/{applicationId}/contract 경로로 대출 계약을 요청한 화면이다.

 

대출 계약 체결까지의 모든 과정이 순조롭게 진행되었고, 최종적으로 계약이 성공적으로 처리되었음을 테스트를 통해 확인했다.