T_era

HTTP Message Body 방식 본문

Programing/Spring

HTTP Message Body 방식

블스뜸 2025. 5. 7. 13:34

REST API 구축 시, Server에서 Client로 HTML 대신 데이터를 HTTP Message Body에 JSON 형식으로 담아 전달하는 것이 일반적이다. 정적 HTML이나 View Template 역시 HTTP Message Body에 담겨 전송될 수 있지만, 여기서는 직접 HTTP Response Message를 생성하여 전달하는 경우를 설명한다.

1. HttpServletResponse 사용

@Controller
public class ResponseBodyController {

    @GetMapping("/v1/response-body")
    public void responseBodyV1(
            HttpServletResponse response
    ) throws IOException {

        response.getWriter().write("data");

    }
}

response.getWriter().write()를 통해 "data"라는 문자열이 Response Body에 직접 입력되어 응답된다. 이는 기존 Servlet 처리 방식과 유사하다.

2. ResponseEntity<> 사용

@GetMapping("/v2/response-body")
public ResponseEntity<String> responseBodyV2() {

    return new ResponseEntity<>("data", HttpStatus.OK);
}

Response Body에 "data"라는 문자열과 HttpStatus.OK에 해당하는 상태 코드를 함께 반환한다. ResponseEntity는 HttpEntity를 상속받아 HTTP Message의 Header와 Body 정보를 모두 포함할 수 있다.

3. @ResponseBody (TEXT, JSON) 사용

@Data
@NoArgsConstructor // 기본 생성자
@AllArgsConstructor // 전체 필드를 인자로 가진 생성자
public class Tutor {

    private String name;
    private int age;

}

// TEXT 데이터 통신
@ResponseBody
@GetMapping("/v3/response-body-text")
public String responseBodyText() {

    return "data"; // HTTP Message Body에 "data"
}

// JSON 데이터 통신
@ResponseBody
@GetMapping("/v3/response-body-json")
public Tutor responseBodyJson() {
    Tutor tutor = new Tutor("wonuk", 100);
    return tutor; // HTTP Message Body에 Tutor Object -> JSON
}

@ResponseBody를 사용하면 View를 거치지 않고 HTTP Message Converter를 통해 HTTP Message Body에 직접 데이터를 입력할 수 있다. 이는 ResponseEntity와 유사한 기능을 제공한다.

@ResponseStatus 어노테이션을 사용하여 상태 코드를 지정할 수 있지만, 응답 코드를 조건에 따라 동적으로 변경하는 것은 불가능하다.

4. ResponseEntity<Object> (JSON)

@ResponseBody
@GetMapping("/v5/response-body")
public ResponseEntity<Tutor> responseBody() {
    Tutor tutor = new Tutor("wonuk", 100);
    return new ResponseEntity<>(tutor, HttpStatus.OK);
}

ResponseEntity<>의 두 번째 파라미터에 HttpStatus Enum 값을 사용하여 응답 상태 코드를 설정할 수 있다. HTTP Message Converter를 통해 Tutor 객체가 JSON 형태로 변환되어 반환된다.

5. 동적 응답 코드 변경

@ResponseBody
@GetMapping("/v5/response-body")
public ResponseEntity<Tutor> responseBody() {

    Tutor tutor = new Tutor("wonuk", 100);

    if (조건) {
        return new ResponseEntity<>(tutor, HttpStatus.OK);
    } else {
        return new ResponseEntity<>(tutor, HttpStatus.BAD_REQUEST);
    }

}

ResponseEntity<>를 사용하면 조건에 따라 응답 상태 코드를 동적으로 변경할 수 있다. ResponseEntity는 HttpEntity를 상속받았으므로 HTTP Header 정보도 함께 설정할 수 있다.