diff --git a/src/main/java/com/swyp/picke/global/common/exception/GlobalExceptionHandler.java b/src/main/java/com/swyp/picke/global/common/exception/GlobalExceptionHandler.java index aab3438..f636a71 100644 --- a/src/main/java/com/swyp/picke/global/common/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/swyp/picke/global/common/exception/GlobalExceptionHandler.java @@ -8,6 +8,7 @@ import org.springframework.security.access.AccessDeniedException; // 추가 import org.springframework.security.authorization.AuthorizationDeniedException; // 추가 import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; @@ -40,6 +41,7 @@ public ResponseEntity> handleValidation(MethodArgumentNotValid @ExceptionHandler({ HttpMessageNotReadableException.class, MethodArgumentTypeMismatchException.class, + MissingServletRequestParameterException.class, ConstraintViolationException.class, IllegalArgumentException.class }) diff --git a/src/test/java/com/swyp/picke/domain/ad/controller/AdApiIntegrationTest.java b/src/test/java/com/swyp/picke/domain/ad/controller/AdApiIntegrationTest.java index 7cc7131..63a2723 100644 --- a/src/test/java/com/swyp/picke/domain/ad/controller/AdApiIntegrationTest.java +++ b/src/test/java/com/swyp/picke/domain/ad/controller/AdApiIntegrationTest.java @@ -119,6 +119,15 @@ void recordImpressions_accumulatesIntoSameDailyRow() throws Exception { .isEqualTo(2L); } + @Test + @DisplayName("필수 파라미터가 빠지면 500이 아니라 400을 준다") + void findAds_missingRequiredParamIsBadRequest() throws Exception { + // 전역 핸들러가 MissingServletRequestParameterException 을 잡지 못해 500 으로 새던 자리다. + // 광고 전용 문제가 아니라 필수 쿼리 파라미터를 쓰는 모든 API 가 같이 영향을 받는다. + mockMvc.perform(get("/api/v1/ads")) + .andExpect(status().isBadRequest()); + } + @Test @DisplayName("노출 집계는 한 번에 밀어 넣을 수 있는 소재 수를 제한한다") void recordImpressions_rejectsOversizedBatch() throws Exception {