문제 상황
- 기능: 리뷰 수정 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에서 기대한 대로 동작함
'트러블슈팅,기술적의사결정' 카테고리의 다른 글
| 분노의삽질 postgreSQL 재설치 에러 극복기 (1) | 2025.07.18 |
|---|---|
| 리뷰 조회 성능 개선 : JPA N+1 문제 해결을 통한 리뷰 조회 성능 개선 (3) | 2025.07.10 |
| 좋아요 많은 리뷰 Top 10 캐싱 처리 (Redis)를 통한 성능 개선과 부하테스트 결과 (기술적 의사 개선 트러블 슈팅) (3) | 2025.07.09 |
| 일정관리디벨롭 CalendarDevelop 프로젝트 회고와 트러블 슈팅 (0) | 2025.04.04 |
| 일정관리 앱 만들기 프로젝트 README와 트러블슈팅 (1) | 2025.03.26 |