diff --git a/src/main/java/com/bio/bio_backend/global/filter/HttpLoggingFilter.java b/src/main/java/com/bio/bio_backend/global/filter/HttpLoggingFilter.java
index fd525b7..0bd92b0 100644
--- a/src/main/java/com/bio/bio_backend/global/filter/HttpLoggingFilter.java
+++ b/src/main/java/com/bio/bio_backend/global/filter/HttpLoggingFilter.java
@@ -6,6 +6,7 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
+import org.springframework.core.annotation.Order;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
@@ -14,9 +15,11 @@ import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;
+import org.slf4j.MDC;
@Slf4j
@Component
+@Order(2)
public class HttpLoggingFilter extends OncePerRequestFilter {
private static final int MAX_LOG_BODY = 10 * 1024; // 10 KB
@@ -38,7 +41,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
: new ContentCachingResponseWrapper(response);
log.info("********************************************************************************");
- log.info("* [START] HTTP LOGGING");
+ log.info("* [START] HTTP LOGGING | TRACE ID: {}", getCurrentTraceId());
log.info("* Method: {} | URI: {}", wrappedRequest.getMethod(), wrappedRequest.getRequestURI());
log.info("* Headers: {}", getRequestHeaders(wrappedRequest));
log.info("********************************************************************************");
@@ -151,4 +154,13 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
|| path.equals("/favicon.ico")
|| path.startsWith("/actuator/health");
}
+
+ /**
+ * 현재 스레드의 TRACE ID를 반환합니다.
+ * @return TRACE ID 또는 "N/A"
+ */
+ private String getCurrentTraceId() {
+ String traceId = MDC.get("traceId");
+ return traceId != null ? traceId : "N/A";
+ }
}
diff --git a/src/main/java/com/bio/bio_backend/global/filter/TraceIdFilter.java b/src/main/java/com/bio/bio_backend/global/filter/TraceIdFilter.java
new file mode 100644
index 0000000..b91647e
--- /dev/null
+++ b/src/main/java/com/bio/bio_backend/global/filter/TraceIdFilter.java
@@ -0,0 +1,51 @@
+package com.bio.bio_backend.global.filter;
+
+import org.slf4j.MDC;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.UUID;
+
+@Component
+@Order(1)
+public class TraceIdFilter extends OncePerRequestFilter {
+
+ private static final String TRACE_ID_HEADER = "X-Trace-Id";
+ private static final String TRACE_ID_MDC_KEY = "traceId";
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws ServletException, IOException {
+
+ try {
+ // 헤더에서 TRACE ID를 가져오거나 새로 생성
+ String traceId = request.getHeader(TRACE_ID_HEADER);
+ if (traceId == null || traceId.trim().isEmpty()) {
+ traceId = generateTraceId();
+ }
+
+ // MDC에 TRACE ID 설정
+ MDC.put(TRACE_ID_MDC_KEY, traceId);
+
+ // 응답 헤더에 TRACE ID 추가
+ response.addHeader(TRACE_ID_HEADER, traceId);
+
+ filterChain.doFilter(request, response);
+
+ } finally {
+ // 요청 처리 완료 후 MDC 정리
+ MDC.remove(TRACE_ID_MDC_KEY);
+ }
+ }
+
+ private String generateTraceId() {
+ // UUID 기반 TRACE ID 생성 (8자리로 축약)
+ return UUID.randomUUID().toString().substring(0, 8);
+ }
+}
diff --git a/src/main/java/com/bio/bio_backend/global/utils/TraceIdUtils.java b/src/main/java/com/bio/bio_backend/global/utils/TraceIdUtils.java
new file mode 100644
index 0000000..27c3187
--- /dev/null
+++ b/src/main/java/com/bio/bio_backend/global/utils/TraceIdUtils.java
@@ -0,0 +1,27 @@
+package com.bio.bio_backend.global.utils;
+
+import org.slf4j.MDC;
+
+/**
+ * TRACE ID 관리를 위한 유틸리티 클래스
+ */
+public class TraceIdUtils {
+
+ private static final String TRACE_ID_KEY = "traceId";
+
+ /**
+ * 현재 스레드의 TRACE ID를 반환합니다.
+ * @return TRACE ID 또는 null
+ */
+ public static String getCurrentTraceId() {
+ return MDC.get(TRACE_ID_KEY);
+ }
+
+ /**
+ * TRACE ID가 존재하는지 확인합니다.
+ * @return TRACE ID 존재 여부
+ */
+ public static boolean hasTraceId() {
+ return getCurrentTraceId() != null;
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 31078e2..faefe87 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -32,7 +32,7 @@ spring.jpa.hibernate.ddl-auto=none
spring.jpa.open-in-view=false
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format_sql=true
-spring.jpa.properties.hibernate.highlight_sql=true
+spring.jpa.properties.hibernate.highlight_sql=false
spring.jpa.properties.hibernate.use_sql_comments=false
# 배치 처리 설정
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index 1eab898..64c736d 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -3,7 +3,7 @@
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n
@@ -21,7 +21,7 @@
1GB
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n
@@ -40,7 +40,7 @@
500MB
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n