본문 바로가기
SPRING

[SPRING] HTTP 응답의 다양한 방법

by steadyMan 2022. 3. 30.

HTTP 요청에 대한 응답을 처리하는 여러 방식과  HTTP 바디에 직접 원하는 데이터를 주입하여

응답하는 주제에 대한 학습내용을 정리합니다. 

 

개인적인 학습의 정리 글입니다. 


아래와 같이 컨트롤러에서 View(HTML파일)을 리턴하면 HTTP 응답 메시지 바디에 HTML 파일의 내용이 담겨 리턴됩니다. 

 

이처럼 HTTP 응답 메세지에 원하는 데이터를 담는 다양한 방법들이 있습니다. 

@GetMapping("/admin/game/regist")
public String gameRegistPage(HttpServletRequest reqeust) {
	return "game/gameRegist";
}

1. PrintWriter

@GetMapping("/response-body-writer")
public void responseBodyV1(HttpServletResponse response) throws IOException {
    //response.setCharacterEncoding("UTF-8"); 한글출력을 위한 인코딩
    PrintWriter writer = response.getWriter();
    writer.write("OK");
}

HttpServletResponse에서 PrintWriter객체를 리턴 받아 사용합니다.

write메서드에 전달한 문자열이 HTTP 메시지 바디에 입력되어 응답되는데 Stream기반이므로 한글 입력 시

설정된 인코딩타입으로 인코딩해야 정상적으로 출력됩니다.

2. HttpEntity, ResponseEntity

@GetMapping("/response-body-entity")
public ResponseEntity<String> responseBody() throws IOException {
	return new ResponseEntity<>("Ok", HttpStatus.OK);
}

리턴 타입이 HttpEntity, ResponseEntity일 경우 Spring HTTP 메시지 컨버터에 의해 view파일을 찾지 않고

해당 객체에 주입한 데이터가 HTTP 메시지 바디에 주입되어 리턴됩니다.

3. @ResponseBody

@ResponseBody
@GetMapping("/response-body-anno")
public String responseBodyAnno() {
    return "OK";
}

ResponseBody 애노테이션을 사용하면 HttpEntity, ResponseEntity와 동일하게 작동합니다.

 

HttpEntity(ResponseEntity), @ResponseBody를 사용하고 자바 빈즈를 리턴할 경우

HTTP 메세지 컨버터에 의해 JSON형식으로 파싱 되며 리턴 형식은 변경이 가능하다!

@GetMapping("/response-body-json")
public ResponseEntity<HelloData> responseBodyJson() {
	HelloData helloData = new HelloData();
	helloData.setAge(20);
	helloData.setUsername("jang");    
	return new ResponseEntity<>(helloData, HttpStatus.OK);
}

 

@ResponseBody는 HTTP 응답 코드를 설정하기 까다롭지만 스프링에서 @ResponseStauts 애노테이션을 제공하여

HTTP응답코드를 설정할 수 있다.

//@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json2")
public HelloData responseBodyJson2() {
    HelloData helloData = new HelloData();
    helloData.setAge(20);
    helloData.setUsername("jang");
    return helloData;
}

 

 

ResponseEntity, @ResponseBody의 응답결과

댓글