스프링에서 응답 데이터를 만드는 3가지 방법
1. 정적 리소스 : 웹브라우저에 정적인 HTML, CSS, JS 제공할 때는 정적 리소스 사용
2. 뷰 템플릿 사용 : 웹브라우저에 동적인 HTML 제공할 때는 뷰 템플릿 사용
3. HTTP 메시지 사용 : HTTP API를 제공하는 경우에는 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 보냄
정적 리소스
정적 리소스 경로 : src/main/resources/static
파일 경로가 src/main/resources/static/basic/hello-form.html라면
웹브라우저에서 다음을 실행하면 된다. http://localhost:8080/basic/hello-form.html
뷰 템플릿
뷰 템플릿 경로 : src/main/resources/templates
@Controller
public class ResponseViewController {
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
ModelAndView mav = new ModelAndView("response/hello")
.addObject("data", "hello!");
return mav;
}
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("data", "hello!");
return "response/hello";
}
@RequestMapping("/response/hello")
public void responseViewV3(Model model) {
model.addAttribute("data", "hello!");
}
}
1. String을 반환하는 경우
@ResponseBody가 없으면 response/hello로 뷰 리졸버가 실행되고 뷰를 찾고, 렌더링 됨.
@ResponseBody가 있으면 HTTP 메시지 바디에 resonse/hello라는 문자가 직접 입력됨
2. Void를 반환하는 경우(권장되는 방법이 아님)
@Controller가 있고, HttpServletResponse, OuntputStream(Writer) 같은 HTTP 메시지 바디를 처리하는 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용하게 됨
HTTP API - 메시지 바디에 직접 입력
v1. HttpServletResponse 객체에 직접 메시지를 담아 전달
@GetMapping("/response-body-string-v1")
public void responseBodyV1(HttpServletResponse response) throws IOException {
response.getWriter().write("ok");
}
v2. HttpEntity를 상속받는 ResponseEntity를 사용 - 메시지뿐만 아니라 응답 코드도 설정 가능
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() {
return new ResponseEntity<>("ok", HttpStatus.OK);
}
v3. @ResponseBody 사용
@ResponseBody
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
return "ok";
}
JSON
v1. ResponseEntity 사용 : 후에 HTTP 메시지 컨버터가 JSON 형식으로 바꿔줌
@GetMapping("/response-body-json-v1")
public ResponseEntity<HelloData> responseBodyJsonV1() {
HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);
return new ResponseEntity<>(helloData, HttpStatus.OK);
}
v2. ResponseEntity는 안쓰고 싶은데 응답코드는 넣고 싶다면? => @ResponseStatus 어노테이션을 사용
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2() {
HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);
return helloData;
}
*@RestController
해당 컨트롤러에 모두 @ResponseBody가 적용됨. 따라서 뷰 템플릿을 사용하는 것이 아니라, HTTP 메시지 바디에 직접 데이터를 입력한다. 이름 그대로 Rest API(HTTP API)를 만들 때 사용하는 컨트롤러이다.
---------------
참고: 인프런 김영한님 강의(스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술)
댓글