웹 개발에는 크게 정적 컨텐츠, MVC와 템플릿 엔진, API의 세가지 방법이 있다.
- 내장 톰캣 서버가 요청을 받고 스프링에게 넘김
- 먼저 컨트롤러쪽에서 hello-static이 있는지 확인 (컨트롤러가 우선순위 가짐)
- 해당 컨트롤러가 없으면 내부에 있는 resources/static에서 hello-static.html이 있는지 찾음
- 있으면 반환
화면에서 필요한 것들을 담아서 화면에 넘겨줌
화면에 관련된 일 처리
비지니스 로직과 서버 관련된 일 처리
java/hello/hellospring/controller/HelloController.java
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@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";
}
}
resources/templates/hello-template.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}" >hello! empty</p>
</body>
</html>
- 내장 톰캣 서버가 hello-mvc 요청을 받고 스프링에게 넘김
- 스프링은 컨트롤러에 맵핑이 되어있는 것을 확인하고 메서드를 호출
- hello-template을 리턴
- viewResolver
뷰를 찾아주고 템플릿 엔진을 연결
가 templates 위치에서 리턴된 값과 똑같은 파일을 찾아서 Thymeleaf 템플릿에게 처리해달라고 넘김- 템플릿 엔진이 렌더링을 해서 변환을 한 html을 웹 브라우저에 반환
json 데이터 구조 포맷으로 클라이언트에게 데이터를 전달하는 방식
@ResponseBody 문자 반환
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@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-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello "+name;
}
}
@ResponseBody 객체 반환
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@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-string")
@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{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
}
jsonkey, value로 이루어진 구조
방식으로 반환
@ResponseBody 사용 원리
- 내장 톰캣 서버가 hello-api 요청을 받고 스프링에게 넘김
- 스프링은 컨트롤러에서 GetMapping, ResponseBody 애너테이션 확인
- viewResolver대신 HttpMessageConverter가 동작
- 리턴값이 문자일 경우 : 문자값을 http 응답에 넣어서 반환 (StringHttpMessageConverter 동작)
- 리턴값이 객체일 경우 : default는 json방식으로 데이터를 만들어서 http 응답에 반환 (MappingJackson2HttpMessageConverter 동작)
- 요청한 웹 브라우저나 서버에 반환