본문 바로가기

프로그래밍/오류

[Spring Boot / Error Handling] 에러 핸들링 중, Response가 출력 되지 않는 현상, HttpMediaTypeNotAcceptableException

 

MSA 공부를 위해, 간단한 Spring Boot 프로젝트를 생성하여 구현하던 중 "에러 핸들링"을 하며 마주친 에러들에 대해 정리

 

💣 org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation

ResponseDto 를 따로 구현하면서 생긴 문제

 

👉 응답 결과의 형식이 다음과 같길 원했기 때문에 구현

{ 
	"message" : "",
    "data" : ""
}

 

 

기존에 구현했던 ResponseDto.java 코드
package com.example.ticket.dto;

import lombok.*;

@AllArgsConstructor
@NoArgsConstructor
public class ResponseDto<T> {
    String message;
    T data;

    public static <T> ResponseDto<T> create(String message) {
        return new ResponseDto<>(message, null);
    }

    public static <T> ResponseDto<T> create(String message, T data) {
        return new ResponseDto<>(message, data);
    }
}

 

 

위와 같이 구현하고 실행시켜 보니, 제목과 같은 에러가 발생함

 

Class HttpMediaTypeNotAcceptableException

→ Exception thrown when the request handler cannot generate a response that is acceptable by the client.

 

번역해보면 클라이언트가 수용할 수 있는 응답을 요청 핸들러가 생성할 수 없을 때 발생하는 예외라는 뜻인데, 결국은 

출력할 때 변수에 접근을 못해서 생긴 예외로 추정된다.

 

코드를 다시 살펴보니, @Getter 어노테이션이 누락된 것을 확인했고 추가해주니 정상 작동 되었다.

 

 

 

💣 Response가 출력 되지 않음

 

RestControllerExceptionHandler.java
package com.example.ticket.exception;

import com.example.ticket.dto.ResponseDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice(annotations = RestController.class)
@Slf4j
public class RestControllerExceptionHandler {

    @ExceptionHandler(NotFoundException.class)
    public ResponseEntity<?> handleNotFoundException(NotFoundException exception) {
        log.info("Not found Exception : {}", exception.getMessage());
        return new ResponseEntity<>(ResponseDto.create(exception.getMessage()), HttpStatus.NO_CONTENT);
    }
}

 

 

구현한 코드를 살펴보면, 잘못된 부분이 없는 것 같은데 Response에서는 exception.getMessage()를 출력하지 않아 의아했음

이전에 다른 프로젝트에서는 정상 작동했던 것으로 보아 코드 상으로 문제가 없음을 확신했고, 다른 점은 return 하는 http 상태 코드였음

 

따라서 상태 코드를 400번대, 200번대로 바꿔서 다시 실행시켜 본 결과 정상적으로 메시지를 응답해줌

 

👉 204 : No Content

이 상태 코드가 의미하는 바가 클라이언트에게 보내 줄 데이터가 없다는 상태 코드인지는 알고 있었으나, 정말로 데이터를 안보여주는 줄은 몰랐다.. 

 

데이터가 없을 때, 반환해줘야 하는 응답코드를 200, 204, 404 중 고민을 하다가 204를 했지만 메시지를 클라이언트에게 보여줄 수 없다는 문제가 있어 204를 제외

404는 어쨌든 정상적으로 동작한 상황이므로 맞지 않다고 생각되어 200 을 응답 시키게 하고 마무리 지었다.

 

Recent Posts
Popular Posts