정적 컨텐츠
- 서버에서 뭐 하는 것 없이 그저 파일을 웹브라우저에 내려주는 것
- 내장 톰캣 서버가 요청을 받아서 요청이 왔다는 것을 스프링에게 넘긴다.
- Controller에서 hello-static 이라는 것이 있는지 서치함 (컨트롤러가 우선순위를 가진다는 의미.)
- hello-static 과 관련된 컨트롤러가 없네?
=> resource: static/hello-static.html을 찾는다.
- 있으니까 반환함.
MVC와 템플릿 엔진
MVC: Model
, View
, Controller
- View는 화면을 그리는 것에, Controller는 로직이나 내부적으로 돌아가는 방식에 집중
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("names") String name, Model model) {
model.addAttribute("name", name);
return "hello-mvc";
}
- @GetMapping("hello-mvc"): Get 요청의 의미. localhost:8080/hello-mvc
- @RequestParam(”names”): 서버 요청시 변수 추가, localhost:8080/hello-mvc?names=example
- model.addAttribute(”name”, name)
- name: view에 전달할 값의 키 값.
- name: view에 전달할 값. helloMvc 함수에서의 변수값
- return “hello-mvc”: templates/hello-mvc.html 로 전달
API
@ResponseBody 문자 반환
- http의 body부에 데이터를 직접 넣어주겠다! 는 의미.
- view를 거치거나 하는 것 없이 그대로 전달됨. ⇒ viewResolover를 사용하지 않음.
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
@ResponseBody 객체 반환
@Controller
public class HelloController {
@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;
}
}
}
@ResponseBody 동작 원리
- 내장 톰캣 서버가 요청을 받아서 요청이 왔다는 것을 스프링에게 넘긴다.
- Controller에서 hello-api라는 것이 있는지 서치함 (컨트롤러가 우선순위를 가진다는 의미.)
- hello-api와 관련된 컨트롤러가 있네?
@ResponseBody
라는 annotation이 붙어있다? ⇒ viewResolver 대신 HttpMessageConverter
가 동작 if) 반환되는 것이 ..
- 객체라면, JsonConverter 동작 ⇒ json 형식으로 응답
- 문자라면, StringConverter 동작