spring web 개발은 크게 세가지로 나누어 볼 수 있다
- 정적 컨텐츠
- MVC와 템플릿 엔진
- API
@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";
}
}
controller에 존재하는 @GetMapping 어노테이션이 가지는 이름과 url에 전달된 이름을 매핑하여 일치하는 메소드를 실행한다.
메소드 내에서 비즈니스 로직을 처리하고 뷰로 전달할 데이터를 Model에 담는다.
spring 컨테이너의 viewResolver는 리턴한 문자열에 해당하는 뷰를 templates 경로에서 찾는다.
템플릿 엔진은 리턴한 문자열의 이름을 갖는 html파일을 templates 경로에서 찾아 모델안의 데이터를 적용하여 렌더링하고 변환된 html을 웹 브라우저로 리턴한다.
@ResponseBody 어노테이션을 사용하면 데이터를 바로 리턴할 수 있다.
- 실행된 메소드에서 문자열 또는 객체를 리턴한다.
- ResponseBody 를 사용하면 viewResolver 대신 HttpMessageConverter가 동작한다.
- HttpMessageConverter는 리턴할 데이터를 변환하여 http 응답의 body에 담는다.
- 3-1. 반환 데이터가 문자열인 경우
- StringConverter가 문자열을 http응답 데이터에 담아서 리턴- 3-2. 반환 데이터가 객체인 경우
- JsonConverter가 객체의 데이터를 json 형식으로 만들고 http 응답에 넣어서 리턴
기본문자처리: StringHttpMessageConverter
기본객체처리: MappingJackson2HttpMessageConverter