스프링 부트는 정적 컨텐츠 기능을 자동으로 제공해준다.
web에서 어떤 url을 입력했을 때, 그 url을 처리해주는 controller가 없으면 resources/static에서 html 파일을 찾는다.
파일을 그대로 웹 브라우저에 전달해준다.
hello-static.html
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html"; charset=UTF-8"/>
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
웹브라우저에서 localhost:8080/hello-static.html 들어가면 내장 톰캣 서버가 처음 받아서 스프링한테 넘기면 스프링은 먼저 controller가 우선순위를 갖기 때문에 controller에서 hello-static을 찾아서 없으면 resource:static/hello-static.html을 찾아서 반환해준다.
MVC : Model, View, Controller
Controller, Model : 비지니스 로직과 관련있거나 내부적인것을 처리한다.
View : 화면을 그리는 것
서버에서 변형을 해서 전달해주는 방식이다.
HelloController
@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";
}
}
hello-template.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}"> hello! empty</p>
</body>
</html>
localhost:8080/hello-mvc?name=spring!!!!!라고 url에 치면
hello spring!!!!이라고 뜬다.
웹브라우저에서 localhost:8080/hello-mvc를 들어가면 내장 톰캣 서버가 스프링한테 넘기면 스프링은 conroller에서 hello-mvc를 찾고 있으면 해당 메소드를 호출하고 model(name:spring)을 뷰 리졸버(뷰 찾아주고 템플릿 엔진 연결 시켜줌)한테 넘기면 templates:hello-template.html을 찾아서 템플릿 엔진인 변환하고 해당 템플릿을 반환해준다.
json 데이터 구조로 전달해준다.
HelloController
@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-spring")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello"+name;
}
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello{
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
}
@ResponseBody : http의 바디쪽에 이 데이터들을 직접 넣겠다는 의미이다.
웹 브라우저에서 localhost:8080/hello-api를 들어가면 내장 톰켓 서버가 스프링에 알려주서 helloController에서 해당 메소드를 찾는다. 해당 메소드에 @ResponseBody(객체로 데이터를 받으면)가 있으면 httpMessageConverter가 동작해서 json형식으로 만들어서 http에 응답한다.
@ResponseBody
를 사용viewResolver 대신에
HttpMessageConverter`가 동작한다.StringHttpMessageConverter
MappingJackson2HttpMessageConverter