트러블슈팅,기술적의사결정

리뷰 수정 시 존재하지 않는 리뷰인데 500에러 발생(트러블 슈팅)

ysrec328 2025. 7. 9. 20:16

문제 상황

  • 기능: 리뷰 수정 API (PUT /api/contents/{contentId}/reviews/{reviewId})
  • 문제: 존재하지 않는 reviewId로 수정 요청 시, 클라이언트가 받아야 할 404 Not Found 대신 500 Internal Server Error 발생
  • 기대 동작: 존재하지 않는 리뷰인 경우, "해당 리뷰를 찾을 수 없습니다."와 함께 404 상태 코드로 응답해야 함

원인 분석

1. 서비스 로직 확인

ReviewService.updateReview(...) 내 로직:

java
복사편집
Review review = reviewRepository.findByContentIdAndId(contentId, reviewId)
    .orElseThrow(() -> new ReviewException(ErrorCode.REVIEW_NOT_FOUND));

  • Review가 존재하지 않을 경우 ReviewException을 던지도록 구현되어 있음

2. 글로벌 예외 처리기 확인

초기에는 ReviewException을 처리하는 예외 핸들러가 GlobalExceptionHandler에 등록되지 않았음

  • 예외는 발생했지만 명시적으로 처리되지 않아 Spring이 이를 미처리 예외로 인식
  • 그 결과, HTTP 500 응답 발생

해결 방법

1. ReviewException 전용 핸들러 추가

GlobalExceptionHandler.java에 다음 코드 추가:

java
복사편집
@ExceptionHandler(ReviewException.class)
public ResponseEntity<BaseResponse<?>> handleReviewException(ReviewException ex) {
    ErrorCode errorCode = ex.getErrorCode();
    log.warn("[{}] {} - {}", DomainType.REVIEW, errorCode.getHttpStatus().value(), errorCode.getMessage());
    return ResponseEntity
        .status(errorCode.getHttpStatus())
        .body(BaseResponse.fail(errorCode));
}

  • 도메인 정보, HTTP 상태 코드, 에러 메시지를 로깅
  • 클라이언트에 일관된 형식의 에러 응답 반환

개선 결과

  • 존재하지 않는 리뷰에 대한 수정 요청 시, 이제 404 상태 코드와 명확한 메시지 반환
  • 예시 응답:
json
복사편집
{
  "status": 404,
  "message": "해당 리뷰를 찾을 수 없습니다.",
  "data": null}


개선 효과

항목 변경 전 변경 후

응답 코드 500 Internal Server Error 404 Not Found
사용자 경험 서버 오류처럼 보임 클라이언트 오류로 명확히 인식 가능
디버깅 용이성 원인 파악 어려움 로그와 응답 메시지로 빠른 확인 가능
유지보수 예외 케이스 혼재 위험 도메인별 일관된 처리 가능

회고

  • 예외를 세분화하여 정의하는 것만으로는 충분하지 않음
  • 발생한 예외는 반드시 @ExceptionHandler로 명시적으로 처리해줘야 REST API에서 기대한 대로 동작함