컨텐츠를 전달하는 방법에는 크게 두 가지가 있다
여기서 알아볼 API방식은 View 즉 html 같은 것이 없다.
우선, 달랑 스트링만 반환할 수 있게 해보자. html 템플릿 말고!
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data", "hello!!");
return "hello";
}
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model){
model.addAttribute("name", name);
return "hello-template";
}
// 달랑 스트링만 반환하는 방식
@GetMapping("hello-juststring")
@ResponseBody // 반드시 붙여주어야 한다. HTTP의 Body 에 담아 응답하겠다는 뜻
public String helloJustString(@RequestParam("name") String name){
return "hello " + name; // "hello seoyeon"
}
}
http://localhost:8080/hello-juststring?name=seoyeon
위 주소로 들어가면, html 페이지를 응답받는 것이 아닌, 그냥 달랑 스트링만 응답받게 된다.
정말 그런지 페이지 소스를 봐보자
정말 그렇다.
지금부터는, 정말 데이터를 반환할 수 있게 해보자.
json 을 반환해보자!
@Controller
public class HelloController {
...
// 달랑 스트링만 반환하기
@GetMapping("hello-juststring")
@ResponseBody
public String helloJustString(@RequestParam("name") String name){
return "hello " + name; // "hello seoyeon"
}
// 객체 반환
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
http://localhost:8080/hello-api?name=서연이
스프링에서 객체를 반환하면, 기본적으로 json 형식으로 반환해준다.
전에, 템플릿을 전달해주는 방식에서는 뷰 리졸버에게 던져주었으나, @ResponseBody가 붙어있는 경우에서는 HttpMessageConverter 에게 던져준다. 즉 @ResponseBody가 붙어있으면 HttpMessageConverter 가 동작하는 것이다.
단순 스트링이라면, StringConverter가 동작하고, 객체라면 JsonConverter가 동작하게 된다.
정리하자면,
viewResolver
대신 HttpMessageConverter
가 동작StringHttpMessageConverter
MappingJackson2HttpMessageConverter
세가지를 알아봤다
1. 정적 컨텐츠: 그냥 html 파일을 내려줌
2. mvc와 템플릿 엔진: 모델, 뷰, 컨트롤러 방식으로 쪼개서 html을 프로그래밍화 할 수 있음
3. api방식: 클라이언트에게 뷰 없이 객체(json형식의 데이터 등)를 반환할 수도 있다
클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 이 둘을 조합해서
HttpMessageConverter
가 선택된다. 더 자세한 내용은 스프링 MVC강의에서!