Spring PATCH API에서 MissingServletRequestParameterException 문제 해결기

dejeong·2025년 5월 28일

에러 해결 일지

목록 보기
3/7
post-thumbnail

🔍 문제 상황

그룹 초대 응답 API를 만들면서 PATCH /api/groups/invites/{requestId} 요청을 호출했을 때
클라이언트에서 토큰도 정상적으로 포함되어 있었고, 인증도 통과된 것처럼 보였는데… 요청이 실패했다..

❗ 로그 메시지

Resolved [org.springframework.web.bind.MissingServletRequestParameterException: 
Required request parameter 'accept' for method parameter type boolean is not present]

이 메시지를 처음 보았을 때 "토큰 문제인가?" 싶었지만 실제 원인은 accept 파라미터 누락이었다..! 두둥탁

✅ 원인 분석

📌 API 정의

@PatchMapping("/invites/{requestId}")
public ResponseEntity<GroupInviteResponse> respondToInvite(
        @PathVariable Long requestId,
        @RequestParam boolean accept,
        HttpServletRequest request) {

    Long userId = (Long) request.getAttribute("userId");
    GroupInviteResponse response = groupService.respondToInvite(requestId, userId, accept);
    return ResponseEntity.ok(response);
}

이 API는 accept 파라미터를 boolean 타입으로 받고 있어, 해당 값이 요청에 반드시 포함되어야 한다.
하지만 클라이언트에서 다음과 같은 형태로 요청이 들어온다면? 두둥탁2

PATCH /api/groups/invites/1

accept 파라미터가 누락되었기 때문에 Spring은 MissingServletRequestParameterException 예외를 발생시키게 된다.

나는 왜 토큰 문제로 착각했을까?

처음 로그에서 이런 메시지가 같이 나왔다.

MissingServletRequestParameterException: Required request parameter 'accept' for method parameter type boolean is not present
Securing PATCH /api/groups/invites/1
User ID extracted from token: 2

이 로그는 Spring Security의 인증 필터가 요청을 보호하고 있고, 토큰에서 userId를 정상적으로 추출했다는 의미이다. 보안 관련 로그와 PATCH 요청이라는 특성 때문에 인증 실패로 착각하게 되었다.

🛠 해결 방법

1. 클라이언트 요청 수정
PATCH 요청을 보낼 때 반드시 accept 파라미터를 포함하도록 수정한다.

✅ 초대 수락 시

PATCH /api/groups/invites/1?accept=true

❌ 초대 거절 시

PATCH /api/groups/invites/1?accept=false

accept 파라미터가 빠졌을 때 기본값을 false로 처리할 수도 있다.

@RequestParam(required = false, defaultValue = "false") boolean accept

하지만 다른 블로그를 찾아봤을 때 기본적으로 거절 처리 될 수 있으니 신중하게 사용하라고 해서 안넣었다. 후후

💡 배운 점

제발! 로그를 정확히 읽고 예외 메세지를 분석하자. 피곤하다면 조금 쉬었다가 다시 보자.. 에헴..

MissingServletRequestParameterException은 파라미터 누락 문제이다.

인증 문제는 401 또는 403 상태코드와 함께 나타나므로 구분이 가능하다

profile
룰루

0개의 댓글