목차
- 개요
- HttpStatus 간략 설명
- RestResult, RestError 코드
- 컨트롤러 구현
개요
Spring Boot에서 클라이언트에게 어떻게 일관적인 응답을 줄 것인가?
Spring Boot로 개발을 했던 사람이라면 INTERNAL_SERVER_ERROR
라는 에러를 만나봤을 것이다.
BAD_REQUSET
인 경우에도 개발자가 예외처리를 하지 않으면 INTERNAL_SERVER_ERROR
로 나오기도 한다.
HttpStatus 간략 설명
HttpStatus 코드는 성공과 실패 케이스로 나뉜다.
자주 볼 수 있는 실패 케이스는 다음과 같다.
HttpStatus | Code | 설명 |
---|---|---|
OK |
200 | 성공 |
BAD_REQUEST |
400 | 클라이언트가 요청 인자를 잘못 보냈을 때 |
UNAUTHORIZED |
401 | 인증 실패 |
FORBIDDEN |
403 | 인가 실패 |
NOT_FOUND |
404 | 데이터 없음 |
METHOD_NOT_ALLOWED |
405 | 잘못된 HTTP 메소드 사용. |
INTERNAL_SERVER_ERROR |
500 | 서버 에러 |
특별히 예외 처리를 해주지 않는다면 400번대 에러도 INTERNAL_SERVER_ERROR
로 나온다.
RestResult, RestError 코드
클라이언트에게 상황에 맞는 일관적인 응답을 주기 위해서 내 애플리케이션에는 클라이언트에게 응답을 주는 성공 케이스인 RestResult
클래스와 실패 케이스인 RestError
클래스를 추가해줬다.
@Getter
@NoArgsConstructor
public class RestResult {
private Object data;
public RestResult(Object data) {
this.data = data;
}
}
HttpStatus가 성공 케이스(200)인 경우 data를 전달한다.
JSON 응답 예시
{
"data": {
"userId": "hyerin9",
"refreshToken": "refresh token value"
}
}
@Getter
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RestError {
private HttpStatus code;
private String message;
public RestError(HttpStatus code, String message) {
this.code = code;
this.message = message;
}
}
HttpStatus가 실패 케이스(400, 401, 403, 404, 405, 500, …)인 경우 해당 에러 Code와 Message를 전달한다.
JSON 응답 예시
{
"code": "BAD_REQUEST",
"message": "Invalid format."
}
컨트롤러 구현
@RestController
@RequestMapping("/refresh-tokens")
@RequiredArgsConstructor
@Validated
public class CacheRefreshTokenController {
private final CacheRefreshTokenService cacheRefreshTokenService;
@GetMapping
public RestResult getAll() {
return new RestResult(cacheRefreshTokenService.getAll());
}
}
데이터의 반환 타입을 RestResult
로 설정해줬다. 그러면 성공 케이스에서는 RestResult
포맷으로 클라이언트에게 응답을 하게 된다.
실패 케이스 구현은 다음 글을 참고하길 바란다.
(곧 작성 예정)
'Software Engineering > [BE] Spring Boot (Java)' 카테고리의 다른 글
[Spring Boot] API 응답에 null 값 포함 안 시키는 어노테이션 (1) | 2024.06.22 |
---|---|
[Spring Boot] Query DSL 설정 (1) | 2024.06.22 |
[Spring Boot] H2GIS와 QueryDSL을 사용한 단위 테스트 (0) | 2024.06.22 |