본문 바로가기

Spring/Springboot

[Springboot] MDC(Mapped Diagnostic Context) 개념

 

 

1. MDC(Mapped Diagnostic Context)

  • 로깅 코드에서 특정 데이터를 쉽게 사용할 수 있도록 하는 메커니즘
  • 한 스레드에서 실행되는 작업 간에 로깅 코드를 통해 데이터를 전파할 수 있음
  • 스프링부트에서 MDC는 주로 로깅 프레임워크에서 제공하는 기능을 활용하며 주로 SLF4J와 함께 사용됨
  • MDC를 사용하면 로그 메시지에 특정 컨텍스트 정보를 쉽게 추가할 수 있음

 

2. MDC 저장소

  • MDC가 실제로 사용하는 저장소, 로깅 컨텍스트 정보를 스레드 로컬 기반의 Map으로 관리
  • 로깅 프레임워크(주로 SLF4J)에서 제공하는 자바 ThreadLocal 클래스를 사용
  • 각 스레드는 자체적인 MDC 저장소를 가지고 있으며, 이 저장소에는 특정 작업이나 트랜잭션과 관련된 추가적인 컨텍스트 정보를 저장할 수있음 
  • ThreadLocal이기 때문에 하나의 스레드에서 저장한 정보는 같은 스레드 내에서만 접근 가능, 다른 스레드에는 영향을 미치지 않음
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MDCExample {
    private static final Logger logger = LoggerFactory.getLogger(MDCExample.class);

    public static void main(String[] args) {
        MDC.put("user", "john_doe"); // MDC에 정보 추가

        logger.info("Logging an example message");

        MDC.clear(); // MDC 초기화
    }
}

 

 

3. 스레드 로컬(ThreadLocal)

  • 자바에서 제공하는 스레드 간 데이터를 공유하지 않고 유지하는 메커니즘
  • 스레드 로컬 변수는  TheradLocal 클래스를 사용하여 생성하고 관리되며, 각 스레드에게 독립적으로 할당되어 한 스레드에서 설정한 값은 다른 스레드에서는 직접 접근할 수 없으므로 멀티 스레드 환경에서 각 스레드 간에 데이터를 안전하게 유지하고 공유하는데 사용됨
  • ThreadLocal 변수는 특히 웹 애플리케이션에서 사용자 세션과 관련된 정보, 트랜잭션 컨텍스트, 보안/인증 등과 같이 각 스레드에 한정된 데이터를 관리할 때 유용하게 활용됨
public class ThreadLocalExample {
    private static ThreadLocal<String> threadLocalVariable = new ThreadLocal<>();

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            threadLocalVariable.set("Value set by Thread 1");
            printVariable();
        });

        Thread thread2 = new Thread(() -> {
            threadLocalVariable.set("Value set by Thread 2");
            printVariable();
        });

        thread1.start();
        thread2.start();
    }

    private static void printVariable() {
        System.out.println("Thread: " + Thread.currentThread().getId() +
                           ", Variable: " + threadLocalVariable.get());
    }
}

 

 

스레드 컨텍스트나 로깅 컨텍스트는 그냥 전체 흐름으로 생각하면 될 듯