Spring/Sample Project

[Spring Boot] Custom Response (Http, Restful API)

shininghyunho 2023. 10. 11. 17:33

해당 포스팅에서는 Response를 어떻게 처리할지 관한 포스팅이다.


먼저 계락적인 Http, Restful 에 관한 설명이다.

HTTP

해당 프로젝트에서 기본적으로 응답은 HTTP 프로토콜을 기반으로 응답한다.

HTTP 는 기본적으로 Header, Body, Method(요청), Path(요청), Version(요청) Status Code(응답) 으로 이루어져 있다.

요청시
응답시

HTTP 자체만으로도 훌륭한 프로토콜이지만

현재의 웹에서는 Restful 아키텍처를 추가로 사용하여 데이터를 주고받는다.

 

Restful API

Restful 의 핵심은 Resource(자원)이다.

Resource를 Method(GET, POST, PUT, DELETE, OPTION), URL(id 기반) 만으로 표현하는 방식이다.

 

다음은 Google Cloud API 문서 일부다.

어떤 리소스를 주고받는지를 규격화하여 주고받는다.

{"originWidth":945,"originHeight":470,"style":"alignCenter","caption":"리소스 중심 디자인

 


기존 Controller에서 응답은

Method가 GET 이면 data를 넘기고

POST면 생성된 Id를 넘겼다.

 

프론트 입장에서는 이밖에 응답이 발생한 시간과 그밖에 구체적인 메시지가 (또는 메타데이터) 있으면

좀더 이해가 쉬울것이다.


그래서 일관적인 Custom Respone를 설계하였다.

 

일단 내가 사용할 Response 유형은 2가지다.

1. Success Response - 오류가 없는 정상적인 응답이다. 상태코드 1xx, 2xx 에 해당한다.

2. Error Response - 오류가 발생한 응답이다. 상태코드 4xx, 5xx 에 해당한다.

 

이 2가지 응답을 Spring에서 제공하는 ResponseEntity 클래스로 변환하여 프론트에 제공하기로 했다.

 

2가지 유형을 1개의 공통된 추상클래스와 확장 클래스를 통해 구현하였다.

// 공통된 추상클래스
abstract class CustomBody (
    val timestamp: LocalDateTime = LocalDateTime.now(),
    val status: Int,
    val message: String?,
)

// 성공 바디
class SuccessBody(
    val data: Any? = null,
    status: HttpStatus,
    message: String?
) : CustomBody(status = status.value(), message = message)

// 에러 바디 
class ErrorBody (
    errorCode: ErrorCode,
    message: String? = null
) : CustomBody(status = errorCode.status.value(), message = message)

 

 

결론적으로 Controller에서는 다음과 같이 사용하면 된다.

@GetMapping("/items")
    fun get(@RequestParam id: Long) : ResponseEntity<CustomBody> {
        return CustomResponse(
            body = SuccessBody(
                data = itemService.getItemGetResponse(id),
                status = HttpStatus.OK,
                message = "아이템 조회 성공"
            )
        ).toResponseEntity()
    }

 

다음 포스팅에서 예외 핸들링에 관한 기술하겠다.