정적 컨텐츠 : 서버에서 따로 개입하지 않고 파일을 그대로 웹브라우저에 내려주는 방식
MVC와 템플릿 엔진 : 가장 많이 사용하는 방식. JSP, PHP(대표적인 템플릿 엔진)와 같이 서버에서 프로그래밍 해 html을 동적으로 바꿔 내려주는 방식
API : JSON 데이터 포맷으로 클라이언트에 데이터 내려주는 방식
스프링부트는 기본적으로 정적 컨텐츠를 자동으로 제공함.
resources/static 폴더에 파일 작성하면 파일명과 같은 url에 해당 파일의 내용이 렌더링 됨. -> 동적 프로그래밍은 불가능
View : 화면을 그리는 데 집중
Controller, Model : 비즈니스 로직과 관련 있거나 내부적인 것들 처리하는 데 집중
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name")String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
-> viewResolver라는 템플릿 엔진이 view를 html로 변환해 웹브라우저에 넘겨줌
@GetMapping("hello-string")
@ResponseBody //http에서 응답 body부에 return 데이터를 직접 넣어주겠다는 의미
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
-> 템플릿 엔진과의 차이 : view없이 return 데이터가 그대로 클라이언트에 넘어감.
@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;
}
}
-> 클라이언트에 response 데이터가 JSON 포맷으로 넘어감
spring에서 객체를 반환, @ResponseBody를 사용했다면 기본으로 객체를 JSON 포맷으로 바꿔서 넘겨줌 (HttpMessageConverter의 JsonConverter가 작동)
@ResponseBody의 작동원리
@ResponseBody 를 사용
HTTP의 BODY에 문자 내용을 직접 반환
viewResolver 대신에 HttpMessageConverter 가 동작
기본 문자처리: StringHttpMessageConverter
기본 객체처리: MappingJackson2HttpMessageConverter
byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
참고: 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서
HttpMessageConverter 가 선택된다.