MVC 프레임워크 16

Mar 12, 2023

3 mins read

HTTP 메시지 컨버터

  • 정적 리소스나 뷰 템플릿을 거치지 않고, 직접 HTTP 응답 메시지를 전달하는 경우
  • HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.
  • hello.springmvc.basic.response 패키지에 ResponseBodyController 클래스 생성.
package hello.springmvc.basic.response;

import java.io.IOException;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import hello.springmvc.basic.HelloData;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

@Slf4j
//@Controller
//@ResponseBody
@RestController //@Controller 대신 사용하면 @ResponseBody가 포함되어있다.
public class ResponseBodyController {

	/*
	 * HttpServletResponse 객체를 통해서 HTTP 메시지 바디에 직접 ok 응답 메시지를 전달한다.
	 */
	@GetMapping("/response-body-string-v1")
	public void responseBodyV1(HttpServletResponse response) throws IOException {
		response.getWriter().write("ok");
	}
	
	/*
	 * ResponseEntity 엔티티는 HttpEntity 를 상속 받았는데, HttpEntity는 HTTP 메시지의 헤더, 바디
	 * 정보를 가지고 있다. ResponseEntity 는 여기에 더해서 HTTP 응답 코드를 설정할 수 있다.
	 */
	@GetMapping("/response-body-string-v2")
	public ResponseEntity<String> responseBodyV2() {
		return new ResponseEntity<>("ok", HttpStatus.OK);
	}
	
	/*
	 * @ResponseBody 를 사용하면 view를 사용하지 않고, HTTP 메시지 컨버터를 통해서 HTTP 메시지를 직접 입력할 수 있다.
     * ResponseEntity 도 동일한 방식으로 동작한다.
	 */
	//@ResponseBody
	@GetMapping("/response-body-string-v3")
	public String responseBodyV3() {
		return "ok";
	}
	
	/*
	 * ResponseEntity 를 반환한다. HTTP 메시지 컨버터를 통해서 JSON 형식으로 변환되어서 반환된다.
	 */
	@GetMapping("/response-body-json-v1")
	public ResponseEntity<HelloData> responseJsonV1() {
		HelloData helloData = new HelloData();
		helloData.setUsername("aroong");
		helloData.setAge(30);
		return new ResponseEntity<>(helloData, HttpStatus.OK);
	}
	
	/*
	 * @ResponseStatus(HttpStatus.OK) 애노테이션을 사용하면 응답 코드도 설정할 수 있다.
	 * 애노테이션이기 때문에 응답 코드를 동적으로 변경할 수는 없다. 프로그램 조건에 따라서 동적으로
	 * 변경하려면 ResponseEntity 를 사용하면 된다.
	 */
	@ResponseStatus(HttpStatus.OK)
	//@ResponseBody
	@GetMapping("/response-body-json-v2")
	public HelloData responseJsonV2() {
		HelloData helloData = new HelloData();
		helloData.setUsername("aroong");
		helloData.setAge(30);
		return helloData;
	}
	
}
  • @RestController : @Controller 대신에 @RestController 애노테이션을 사용하면, 해당 컨트롤러에 모두 @ResponseBody 가 적용된다.
    뷰 템플릿을 사용하는 것이 아니라, HTTP 메시지 바디에 직접 데이터를 입력한다.
    @ResponseBody가 클래스 레벨로 적용된다.