[http] 응답코드가 없다면 어떤 일이 일어날까?

선호·2024년 1월 22일

백에서 응답을 제대로 해주지 않는다면?

프론트랑 협업을 하여 통신을 하게 되면 프론트에서 요청을 했을 때 서버측에서 마땅한 응답을 해줘야 프론트는 그 응답에 대해 마땅한 대응을 할 수 있다.

그렇기에 요청에 따라 문제가 발생하면 그에 걸맞는 응답코드를 보내줘야 한다.

예를 들어서 프론트에서 아래와 같은 요청을 하였다고 가정을 해보자

GET http://localhost:8080/api/schedule/4

그렇다면 백에서는 위와 같은 api를 확인해서 그에 걸맞는 행동을 할 것 이다.
크게 두가지의 경우가 있을 것 이다.

  • 4에 맞는 데이터를 찾아서 응답
  • 4가 없다면 없다고 응답

에러 없이 4에 해당되는 데이터를 가지고 있다면 아래와 같이 출력을 할 것 이다.

200 OK

{
    "id": 4,
    "title": "title",
    "contents": "contents",
    "manager": "manager",
    "createAt": "2024-01-19T19:10:54"
}

근데 만약에 데이터를 가지고 있지 않다면 아래와 같이 출력이 되어야 한다.

{
    "timestamp": "2024-01-22T07:16:28.987+00:00",
    "status": 404
    ...
}
404 Not Found

서버는 요청받은 리소스를 찾을 수 없습니다. 브라우저에서는 알려지지 않은 URL을 의미합니다. 이것은 API에서 종점은 적절하지만 리소스 자체는 존재하지 않음을 의미할 수도 있습니다. 서버들은 인증받지 않은 클라이언트로부터 리소스를 숨기기 위하여 이 응답을 403 대신에 전송할 수도 있습니다. 이 응답 코드는 웹에서 반복적으로 발생하기 때문에 가장 유명할지도 모릅니다.
-mdn-

그런데 서버측에서 이와 같은 응답코드를 처리를 안해준다면 프론트는 아래와 같은 응답을 받을 것이다.

{
    "timestamp": "2024-01-22T07:18:38.009+00:00",
    "status": 500
    ...
}

프론트가 위와 같은 응답을 받는다면 내가 보낸 api가 잘못된건지, 서버에서 오류가 발생한건지 알 수 가없다.

그렇기에 정확한 소통을 하려면 서버측에서는 에러에 따른 정확한 오류코드를 프론트측에 전달을 하여야 된다.

지금부터 이와 같은 응답을 처리해주는 법을 알아보자.

해결방안

Spring boot에서는 api요청에 의해 에러가 발생하면 자동적으로 요청에 대한 응답을 500으로 통일을 해서 프론트에게 응답을 해준다.

그렇게 되면 프론트 측에서는 뭐가 잘못됐는지를 알 수가 없기에 정확한 응답을 해줘야 한다.

이를 해결하기 위해서 HttpStatus 기술이 고안되었다.

HttpStatus

spring boot에서 에러에 맞는 응답을 보내주기 위해 사용되는 기술.

@ResponseStatus

메서드 또는 예외 클래스를 반환해야 하는 상태 코드를 표시해준다.
HttpStatus를 사용하기 위해 선언되어야 하는 어노테이션이며 예외클래스에 걸어주면 속성값에 맞는 응답을 해준다.

속성 값으로는 ( HttpStatus.Enum )을 가지며 아래와 같이 가지고 있다.

사용방법

예외클래스를 정의한 뒤 아래와 같이 어노테이션과 예외가 발생했을 시 상황에 맞는 HttpStatus를 정의해 준다.

아래의 상황은 일치하는 id가 없으면 "존재하지 않습니다"라는 메세지와 함께 해당 항목을 찾을 수 없다라는 404코드를 보내주는 예외처리문이다.

@ResponseStatus(HttpStatus.NOT_FOUND)  
public class ScheduleNotFoundException extends RuntimeException {  
    public ScheduleNotFoundException(String message){  
        super(message);  
    }  
}
public ScheduleResponseDto getScheduleById(Long id) {  
    Schedule schedule = scheduleRepository.findById(id).orElseThrow(() ->  
            new ScheduleNotFoundException(String.format("id: %s는 존재하지 않습니다.",id))  
    );  
    return new ScheduleResponseDto(schedule);  
}

이와 같이 처리 해주면 아래와 같이 응답코드가 전송된다.

{
    "timestamp": "2024-01-22T07:39:29.037+00:00",
    "status": 404
    "error": "Not Found"
    "message": "id: 5는 존재하지 않습니다."
    "path": "/api/schedule/5"
}

응답코드가 이제는 500이 아니라 정확하게 서버에 존재하지 않는 데이터라고 보여주는 404를 보여줌으로써 프론트는 이해하기가 편해졌다.

이제 프론트는 위와 같은 응답메세지를 보고 그에 걸맞는 행동을 취할 수 있어 한결 더 유연하게 행하는 것이 가능해졌다.

profile
개발을 하더라도 탄탄하게

0개의 댓글