diff --git a/backend-spring/src/main/java/com/erp/config/GlobalExceptionHandler.java b/backend-spring/src/main/java/com/erp/config/GlobalExceptionHandler.java index 0650f57a..1085973e 100644 --- a/backend-spring/src/main/java/com/erp/config/GlobalExceptionHandler.java +++ b/backend-spring/src/main/java/com/erp/config/GlobalExceptionHandler.java @@ -33,13 +33,7 @@ public class GlobalExceptionHandler { public ResponseEntity> handleException(Exception e, HttpServletRequest request) { log.error("Unhandled exception", e); - // QA 진단 임시 — root cause class + message 노출 (안정화 후 원복 예정) - String detail = e.getClass().getSimpleName() + ": " + (e.getMessage() != null ? e.getMessage() : "no message"); - Throwable cause = e.getCause(); - if (cause != null) { - detail += " | caused by " + cause.getClass().getSimpleName() + ": " + cause.getMessage(); - } return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(ApiResponse.error("[DEBUG] " + detail, request.getRequestURI())); + .body(ApiResponse.error("서버 내부 오류가 발생했습니다.", request.getRequestURI())); } } diff --git a/backend-spring/src/main/java/com/erp/config/JacksonConfig.java b/backend-spring/src/main/java/com/erp/config/JacksonConfig.java index ff6f11b4..c58c33a7 100644 --- a/backend-spring/src/main/java/com/erp/config/JacksonConfig.java +++ b/backend-spring/src/main/java/com/erp/config/JacksonConfig.java @@ -1,8 +1,9 @@ package com.erp.config; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,6 +14,11 @@ public class JacksonConfig { public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); + // Java 8 date/time (OffsetDateTime, LocalDateTime 등) 직렬화 지원. + // 커스텀 ObjectMapper 빈이 있으면 Spring Boot 자동 구성 모듈 등록이 적용되지 + // 않으므로 명시적으로 등록한다. + mapper.registerModule(new JavaTimeModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; } }