웹 개발 (정적 컨텐츠, MVC, API 방식)
✔ 정적 컨텐츠, MVC 방식
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
}
◼ Web Application 에서 첫번째 진입점: Controller
◼ localhost:8090/hello 라고 들어오면, 서버에서 받아서 Spring 한테 물어봄
그럼 Spring이 '/hello'와 매칭되는 게 있는지 Controller 먼저 찾아봄(Controller가 우선순위를 가짐)
→ ① 매핑되는 컨트롤러가 있으면, 해당 컨트롤러의 메서드 실행
→ ② 매핑되는 컨트롤러가 없으면, resouces > static 폴더 안에 해당 파일 있는지 찾아봄
◼ 매개변수 Model model : 스프링이 model을 만들어서 넣어줌
model.addAttribute("key", value);
◼ return hello;
→ Controller에서 return 값으로 문자를 반환하면, ViewResolver가 화면을 찾아서 처리한다.
+) viewResolver: view를 찾아주고, 템플릿 엔진을 연결시켜줌
→ resources > templates 에 있는 hello.html을 찾아서 렌더링한다.
▶ viewResolver가 hello라는 view찾아서 thymeleaf 템플릿 엔진에게 처리를 넘겨줌
thymeleaf가 렌더링해서 변환한 HTML을 웹 브라우저에게 넘겨줌
(정적 컨텐츠일 때는, 변환하지 않고 웹 브라우저에 넘겨줌)
✔ API 방식
◼ @ResponseBody: 응답 body 부분에 데이터를 직접 넣어주겠다.
→ View 이런 거 없이 그냥 해당 데이터를 그대로 반환
◼ 현재 Spring에서는,
객체를 반환하고 + @ResponseBody라고 되어 있으면,
default로 Json 형태로 반환해준다.
◼ @ResponseBody가 없을 때에는 viewResolver가 동작했는데,
@ResponseBody가 있을 때에는 HttpMessageConverter가 동작한다.
→ 단순 문자면, StringHttpMessageConverter가 동작
→ 객체면, 기본적으로 MappingJackson2HttpMessageConverter(JsonConverter)가 동작
// 문자열 반환
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
chrome에서 localhost:8090/hello-string&name=hellooooo~ 해서 페이지 소스 확인해보면,
그냥 정말 '문자열' 데이터만 넘어온 거 확인할 수 있다.
// 객체 반환
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
chrome에서 localhost:8090/hello-api&name=hellooooo~ 해서 페이지 소스 확인해보면,
객체가 json 형태로 바뀌어서 반환된 거 확인할 수 있다.