1학기가 끝나기까지 약 한달이 남았다.
비동기 작업 성능을 높여보고
.. Swagger로 API 문서를 자동화
하고.. Redis를 도입
하는 등의 작업을 했지만..
사실상 이메일 발송
을 제외한 대부분의 기능들이 CRUD다!
따라서 새로운 기능이 도입되었으면 했고, 생각해 본 바로는 아래와 같다.
Spring Batch
를 이용해 대용량 데이터를 일괄처리하기
결제 시스템 만들어보기
Slack 챗봇 연동
우선, 2번의 결제 시스템을 먼저 도입해보기로 했다!
<aside> 💡 결제 진행 흐름
</aside>
@PostMapping("/{id}")
public ResponseEntity<?> savePayment(
@RequestBody final Map<String, Object> model,
@PathVariable(value = "id") final Long appointmentId) throws JSONException, IOException {
//응답 header 생성
final HttpHeaders responseHeaders = makeHttpHeader();
final String impUid = (String) model.get("imp_uid");
final String merchantUid = (String) model.get("merchant_uid");
final boolean success = (boolean) model.get("success");
final String errorMsg = (String) model.get("error_msg");
if (!success) {
log.error(errorMsg);
return new ResponseEntity<>(errorMsg, responseHeaders, HttpStatus.OK);
}
try {
//해당 예약이 이미 결제 상태인지는 아닌지 확인
validateAppointmentPayStatus(appointmentId);
final var iamportClient = new IamportClient(API_KEY, API_SECRET);
final Payment payment = extractPayment(impUid, iamportClient);
return new ResponseEntity<>(paymentService.save(appointmentId, payment), responseHeaders, HttpStatus.OK);
} catch (IamportResponseException | IOException e) {
log.error("{}", e);
//예외 발생시 결제를 취소
//뒤에서 구현할 예정
return ResponseEntity.badRequest().build();
}
}
private Payment extractPayment(final String imp_uid, final IamportClient iamportClient) throws IamportResponseException, IOException {
return iamportClient.paymentByImpUid(imp_uid).getResponse();}
private void validateAppointmentPayStatus(final Long appointmentId) {
final Appointment appointment = appointmentService.findById(appointmentId);
if (appointment.getPayStatus() == PayStatus.COMPLETED) {
throw new IllegalValueException("이미 결제된 예약입니다.", ErrorCode.ILLEGAL_STATE);
}
private HttpHeaders makeHttpHeader() {
final HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "application/json; charset=UTF-8");
responseHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
return responseHeaders;
}
}