Hamutaro - Hamtaro 4

Backend/Spring

[SpringBoot] MDC์™€ TraceId๋กœ ์š”์ฒญ ๋‹จ์œ„ ๋กœ๊ทธ ์ถ”์ ํ•˜๊ธฐ

carsumin 2026. 2. 17. 15:49
๋ฌธ์ œ ์ƒํ™ฉ

 
Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋‹ค ๋ณด๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๋™์‹œ์— ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๋“ค์–ด์˜ด
  • Controller, Service, Repository, Filter, ExceptionHandler์—์„œ ๋กœ๊ทธ๊ฐ€ ์ฐํž˜
  • ๋กœ๊ทธ๊ฐ€ ์„œ๋กœ ์„ž์ž„
๋กœ๊ทธ์ธ ์„ฑ๊ณต - memberId=1
ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต - memberId=3
๋‹‰๋„ค์ž„ ์ค‘๋ณต
JWT ์ธ์ฆ ์„ฑ๊ณต

 
-> ์–ด๋–ค ์š”์ฒญ์—์„œ ๋ฐœ์ƒํ•œ ๋กœ๊ทธ์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Œ
 
 

ํ•ด๊ฒฐ ์ „๋žต - ์š”์ฒญ ๋‹จ์œ„ Trace ID
  • ์š”์ฒญ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ID๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ์š”์ฒญ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๋กœ๊ทธ์— ๋™์ผํ•œ ID๋ฅผ ํฌํ•จ์‹œ์ผœ์„œ ํ•ด๊ฒฐ
  • ์ด๋ฅผ Correlation ID, TraceId ๋ผ๊ณ  ํ•จ
  • ์Šคํ”„๋ง์—์„œ๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด MDC๋ฅผ ์‚ฌ์šฉ

 

MDC๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  • MDC (Mapped Diagnostic Context)๋Š” SLF4J์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ
  • ThreadLocal ๊ธฐ๋ฐ˜ (JVM ๋‚ด๋ถ€์— ์ €์žฅ๋จ)
  • ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— key-value ๋ฐ์ดํ„ฐ ์ €์žฅ
  • ๋กœ๊ทธ ํŒจํ„ด์—์„œ %X{key}๋กœ ์ถœ๋ ฅ ๊ฐ€๋Šฅ
MDC.put("traceId", "abc123");

 
-> ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ ์ฐํžˆ๋Š” ๋กœ๊ทธ์— traceId๋ฅผ ์ž๋™์œผ๋กœ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
 
 

TraceIdFilter ๊ตฌํ˜„
  • OncePerRequestFilter
    • ์š”์ฒญ๋‹น ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰
  • MDC.put()
    • ํ˜„์žฌ ์š”์ฒญ ์Šค๋ ˆ๋“œ์— traceId ์ €์žฅ
  • MDC.clear()
    • ๋ฐ˜๋“œ์‹œ finally์—์„œ ์ œ๊ฑฐ (ํ†ฐ์บฃ ์Šค๋ ˆ๋“œ๋Š” ์žฌ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ)
@Component
public class TraceIdFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain chain
    ) throws ServletException, IOException {

        try {
            String traceId = UUID.randomUUID()
                                 .toString()
                                 .replace("-", "");

            MDC.put("traceId", traceId);

            chain.doFilter(request, response);

        } finally {
            MDC.clear();
        }
    }
}

 
 

๋กœ๊ทธ ํŒจํ„ด ์„ค์ •
  • application.yml์— traceId ์ถœ๋ ฅ ์„ค์ •์„ ์ถ”๊ฐ€
logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId}] %-5level %logger - %msg%n"

 
-> %X{traceId} ์„ค์ •์ด ์žˆ์–ด์•ผ MDC์— ์ €์žฅ๋œ traceId๊ฐ€ ์ถœ๋ ฅ๋จ
 
 

์‹ค์ œ ๋กœ๊ทธ ์ถœ๋ ฅ ์˜ˆ์‹œ
  • ์šด์˜ ์ค‘ ํŠน์ • ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ
    • traceId ๊ธฐ์ค€์œผ๋กœ ๋กœ๊ทธ ๊ฒ€์ƒ‰
    • ์š”์ฒญ ํ๋ฆ„ ์ „์ฒด ์ถ”์  ๊ฐ€๋Šฅ
2026-02-17 12:30:01 [http-nio-8080-exec-1] [a8f3c9e1d4...] INFO  MemberService - ๋กœ๊ทธ์ธ ์„ฑ๊ณต - memberId=1
2026-02-17 12:30:01 [http-nio-8080-exec-1] [a8f3c9e1d4...] DEBUG JwtFilter - JWT ์ธ์ฆ ์„ฑ๊ณต