JSCODE Logo
블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] 실습을 위한 웨이팅 API 코드 수정

JSCODE 시니
JSCODE 시니
2026. 03. 03.
author
JSCODE 시니
category
Logging Monitoring
createdAt
Mar 5, 2026 06:46 PM
isPublic
isPublic
series
로그관리와 모니터링 - ELK 프로메테우스 그라파나편
slug
modifying-waiting-api-for-practice
type
post
updatedAt
Mar 3, 2026 09:00

✅ 1. Controller 코드 수정

public class WaitingController { private final WaitingService waitingService; @PostMapping public ResponseEntity<String> register(@RequestBody WaitingRequest request) { try { log.info("[api 호출] 웨이팅 등록 요청 들어옴"); String result = waitingService.registerWaiting(request.getName(), request.getPhone()); return ResponseEntity.ok(result); } catch (IllegalArgumentException e) { log.warn("[api 경고] 웨이팅 등록 실패 : {}", e.getMessage()); // 400 Bad Request를 반환하도록 수정 return ResponseEntity.badRequest().body("웨이팅 등록에 실패했습니다: " + e.getMessage()); } } @GetMapping public String getWaitingStatus(@RequestBody WaitingRequest request) { String phone = request.getPhone(); try { log.info("[api 호출] 웨이팅 순번 조회 요청 들어옴 - 연락처: {}", phone); int waitingNumber = waitingService.getWaitingNumber(phone); return "현재 대기 순번은 " + waitingNumber + "번입니다."; } catch (IllegalArgumentException e) { log.warn("[api 경고] 웨이팅 조회 실패 (미등록 번호) : {}", phone); return "조회 실패: " + e.getMessage(); } catch (Exception e) { log.error("[api 오류] 웨이팅 조회 중 서버 에러 발생 : {}", e.getMessage()); return "서버 오류가 발생했습니다. 잠시 후 다시 시도해주세요."; } } }
 
 

✅ 2. Service 코드 수정

public class WaitingService { private int currentWaitingCount = 0; // 현재 대기 번호 private final Map<String, Integer> waitingStore = new HashMap<>(); public String registerWaiting(String name, String phone) { String maskedPhone = maskPhoneNumber(phone); // 1. [INFO] : 일반적인 비즈니스 흐름 기록(요청 수신) log.info("[웨이팅 요청] 이름 : {}, 연락처 : {}", name, maskedPhone); // 2. [WARN] : 비즈니스 오류(중복 등록 시도) - Map의 containsKey 활용 if (waitingStore.containsKey(phone)) { log.warn("[웨이팅 실패] 중복 등록 시도 발생! 연락처 : {}", maskedPhone); throw new IllegalArgumentException("이미 대기 등록된 연락처입니다."); } // 3. [WARN] 시스템 경고 (대기열 마감임박) if (currentWaitingCount >= 2) { log.warn("[웨이팅 경고] 대기열 마감 임박! 현재 대기 인원: {}명", currentWaitingCount); } currentWaitingCount++; // 명단에 전화번호와 발급된 번호표 숫자를 함께 저장! waitingStore.put(phone, currentWaitingCount); // 4. [INFO] 비즈니스 정상 처리 완료 log.info("[웨이팅 완료] 대기번호 {}번 발급 완료 (고객명 : {})", currentWaitingCount, name); return name + "님, 대기번호 " + currentWaitingCount + "번이 발급되었습니다."; } // 전화번호 마스킹 메서드 (예: 010-1234-5678 -> 010-****-5678) private String maskPhoneNumber(String phone) { if (phone == null || phone.length() < 13) return "****"; return phone.substring(0, 4) + "****" + phone.substring(8); } // 5. 내 대기 번호 조회 public int getWaitingNumber(String phone) { // 등록되지 않은 번호인지 먼저 확인 if (!waitingStore.containsKey(phone)) { log.warn("[웨이팅 조회 실패] 미등록 번호 조회 시도 : {}", maskPhoneNumber(phone)); throw new IllegalArgumentException("웨이팅 명단에 없는 연락처입니다. 먼저 등록해주세요."); } // Map에서 전화번호로 검색해서, 저장해 뒀던 대기 번호를 뽑아옴 return waitingStore.get(phone); } }
 
 

✅ 3. Postman으로 테스트

notion image
 
notion image
author
category
Logging Monitoring
createdAt
Mar 6, 2026 08:35 AM
isPublic
isPublic
series
로그관리와 모니터링 - ELK 프로메테우스 그라파나편
slug
type
series-footer
updatedAt
Mar 3, 2026 09:00
📎
이 글은 로그관리와 모니터링 - ELK, 프로메테우스, 그라파나 강의의 수업 자료 중 일부입니다.