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());
}
}
스레드 컨텍스트나 로깅 컨텍스트는 그냥 전체 흐름으로 생각하면 될 듯
'Spring > Springboot' 카테고리의 다른 글
[Springboot] Redis를 In-memory DB로 사용하기(1) (0) | 2024.01.23 |
---|---|
[Spring boot] MDC(Mapped Diagnostic Context) 적용 (0) | 2024.01.06 |
[Springboot] 그라파나(grafana) 공유 대시보드 활용 (0) | 2024.01.05 |
[Springboot] 그라파나(grafana) 대시보드 만들기 (0) | 2024.01.05 |
[Springboot] 그라파나(grafana)-프로메테우스 연동 (1) | 2024.01.05 |