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);
}
}