✅ 1. MDC 필터를 만드는 이유

✅ 2. 필터 생성

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

}

✅ 3. Controller 수정

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

        }
    }
}

✅ 4. 로그 확인

image.png