diff --git a/apps/user-service/Dockerfile b/apps/user-service/Dockerfile index e3fb24a4..b9ac7b3e 100644 --- a/apps/user-service/Dockerfile +++ b/apps/user-service/Dockerfile @@ -6,4 +6,4 @@ COPY build/libs/*.jar app.jar EXPOSE 8080 -CMD ["java", "-jar", "app.jar"] +CMD ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/config/WebConfig.java b/apps/user-service/src/main/java/com/gltkorea/icebang/config/WebConfig.java new file mode 100644 index 00000000..1ed10098 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/config/WebConfig.java @@ -0,0 +1,26 @@ +package com.gltkorea.icebang.config; + +import java.time.Duration; + +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class WebConfig { + + @Bean + public RestTemplate restTemplate(RestTemplateBuilder builder) { + // 1. SimpleClientHttpRequestFactory 객체를 직접 생성 + SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + + // 2. 타임아웃 설정 (이 메서드들은 deprecated 아님) + requestFactory.setConnectTimeout(Duration.ofSeconds(5)); + requestFactory.setReadTimeout(Duration.ofSeconds(5)); + + // 3. 빌더에 직접 생성한 requestFactory를 설정 + return builder.requestFactory(() -> requestFactory).build(); + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/filter/LoggingFilter.java b/apps/user-service/src/main/java/com/gltkorea/icebang/filter/LoggingFilter.java new file mode 100644 index 00000000..e8dda321 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/filter/LoggingFilter.java @@ -0,0 +1,43 @@ +package com.gltkorea.icebang.filter; + +import java.io.IOException; +import java.util.UUID; + +import org.slf4j.MDC; +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; + +@Component +public class LoggingFilter extends OncePerRequestFilter { + + public static final String TRACE_ID_HEADER = "X-Request-ID"; + + @Override + protected void doFilterInternal( + HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + // 다른 시스템에서 이미 전달한 Trace ID가 있는지 확인 + String traceId = request.getHeader(TRACE_ID_HEADER); + + // 없다면 새로 생성 (요청의 시작점) + if (traceId == null || traceId.isEmpty()) { + traceId = UUID.randomUUID().toString(); + } + + MDC.put("traceId", traceId.substring(0, 8)); + + // ⭐️ 요청 객체에 attribute로 traceId를 저장하여 컨트롤러 등에서 사용할 수 있게 함 + request.setAttribute("X-Request-ID", traceId); + + // 응답 헤더에 traceId를 넣어주면 클라이언트가 추적하기 용이 + response.setHeader(TRACE_ID_HEADER, traceId); + + filterChain.doFilter(request, response); + } +} diff --git a/apps/user-service/src/main/resources/log4j2-develop.yml b/apps/user-service/src/main/resources/log4j2-develop.yml index 4734a1ce..63f4c280 100644 --- a/apps/user-service/src/main/resources/log4j2-develop.yml +++ b/apps/user-service/src/main/resources/log4j2-develop.yml @@ -9,10 +9,10 @@ Configuration: value: "UTF-8" # 통일된 콘솔 패턴 - 모든 로그에 RequestId 포함 - name: "console-layout-pattern" - value: "%highlight{[%-5level]} [%X{id}] %d{MM-dd HH:mm:ss} [%t] %n %msg%n%n" + value: "%highlight{[%-5level]} [%X{traceId}] %d{MM-dd HH:mm:ss} [%t] %n %msg%n%n" # 파일용 상세 패턴 - RequestId 포함 - name: "file-layout-pattern" - value: "[%X{id}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" + value: "[%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" # 로그 파일 경로들 - name: "info-log" value: ${log-path}/user-service/info.log diff --git a/apps/user-service/src/test/resources/sql/create-schema.sql b/apps/user-service/src/test/resources/sql/create-schema.sql index 5980c3ab..115603f8 100644 --- a/apps/user-service/src/test/resources/sql/create-schema.sql +++ b/apps/user-service/src/test/resources/sql/create-schema.sql @@ -34,6 +34,7 @@ CREATE TABLE "USER" ( PRIMARY KEY ("user_id") ); + CREATE TABLE "GROUP_INFO" ( "group_info_id" BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, "name" VARCHAR(255) NULL, @@ -95,4 +96,4 @@ CREATE TABLE "ROLE_PERMISSION" ( FOREIGN KEY ("role_id") REFERENCES "ROLE" ("role_id"), FOREIGN KEY ("permission_id") REFERENCES "PERMISSION" ("permission_id"), UNIQUE ("role_id", "permission_id") -); \ No newline at end of file +); diff --git a/docker/local/init-scripts/create-schema.sql b/docker/local/init-scripts/create-schema.sql index 5980c3ab..0e2467df 100644 --- a/docker/local/init-scripts/create-schema.sql +++ b/docker/local/init-scripts/create-schema.sql @@ -8,7 +8,6 @@ DROP TABLE IF EXISTS "GROUP_INFO"; DROP TABLE IF EXISTS "USER"; --- 사용자 정보 (외부 노출 가능성 높음 -> UUID) CREATE TABLE "USER" ( "user_id" VARCHAR(36) NOT NULL, "name" VARCHAR(100) NULL,