MdcLoggingFilter.java
package com.hi.waiting_api;
import jakarta.servlet.*;
@Component
public class MdcLoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 1. 요청이 들어오면 고유한 8글자 Trace ID를 생성
String traceId = UUID.randomUUID().toString().substring(0, 8);
// 2. MDC라는 곳에 해당 아이디를 보관
MDC.put("traceId", traceId);
try {
// 3.Controller로 요청을 넘김.
chain.doFilter(request, response);
} finally {
// 요청 처리가 끝나면 반드시 비워줘야 함
// 톰캣은 재사용되기 때문에, 안 비우면 다음 사람 로그에 이전 사람 ID가 섞일 수 있음
MDC.clear();
}
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
WaitingController.java
package com.hi.waiting_api;
@RestController
@RequestMapping("/api/waiting")
@RequiredArgsConstructor
@Slf4j
public class WaitingController {
private final WaitingService waitingService;
@PostMapping
public String register(@RequestBody WaitingRequest request) {
try {
log.info("[api 호출] 웨이팅 등록 요청 들어옴");
return waitingService.registerWaiting(request.getName(), request.getPhone());
} catch (IllegalArgumentException e) {
log.error("[api 오류] 웨이팅 등록 중 문제 발생 : {}", e) ;
return "웨이팅 등록에 실패했습니다: " + e.getMessage();
}
}
}
