- 파일을 그대로 웹 브라우저에 전달하는 방식
- 스프링 부트 정적 컨텐츠 기능 (관련 설명)
- resources/static/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>
- 실행: http://localhost:8080/hello-static.html
- 동작 원리
- 웹 브라우저에서 localhost:8080/hello-static.html 요청
- 내장 톰켓 서버가 해당 요청을 받아서 스프링 컨테이너에 넘김
- 스프링은 먼저 컨트롤러에서 hello-static이 있는지 찾아봄 (컨트롤러가 우선순위를 가짐)
- 없다면 내부의 resources 안에 있는 static/hello-static.html을 찾아서 있다면 그대로 반환
- 서버에서 변형을 해서 html을 동적으로 바꿔서 전달하는 방식
- MVC: Model, View, Controller
- Controller (HelloController에 추가)
@Controller public class HelloController { @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model) { // 파라미터를 받음 model.addAttribute("name", name); // 키와 값 return "hello-template"; } }
- View (resources/template/hello-template.html)
<html xmlns:th="http://www.thymeleaf.org"> <body> <p th:text="'hello ' + ${name}">hello! empty</p> </body> </html>
- 실행: http://localhost:8080/hello-mvc?name=spring!!!
- 동작 원리
- 웹 브라우저에서 localhost:8080/hello-mvc 요청
- 내장 톰켓 서버가 해당 요청을 받아서 스프링 컨테이너에 넘김
- 스프링은 helloController에 매핑되어있는 해당 메소드 호출, hello-template을 return
- 스프링의 viewResolver가 return과 똑같은 이름을 찾아서 templates/hello-template.html 파일을 Thymeleaf 템플릿 엔진에게 처리해달라고 넘김
- 템플릿 엔진이 렌더링을 해서 변환한 html 파일을 웹 브라우저에 반환
- @ResponseBody 문자 반환
@Controller public class HelloController { @GetMapping("hello-string") @ResponseBody public String helloString(@RequestParam("name") String name) { return "hello " + name; } }
@ResponseBody
- 뷰 리졸버(viewResolver)를 사용하지 않음
- HTTP의 BODY에 문자 내용을 직접 반환하겠다는 의미 (HTML BODY TAG 아님)
- 실행: http://localhost:8080/hello-string?name=spring
- @ResponseBody 객체 반환
@Controller public class HelloController { @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; } } }
@ResponseBody
를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨- 실행: http://localhost:8080/hello-api?name=spring
- {"name":"spring"}
@ResponseBody
동작 원리- 웹 브라우저에서 localhost:8080/hello-api 요청
- 내장 톰켓 서버가 해당 요청을 받아서 스프링 컨테이너에 넘김
- 스프링은 helloController에 매핑되어있는 해당 메소드 호출
@ResponseBody
가 붙어 있으므로, HTTP의 BODY에 문자 내용을 직접 반환viewResolver
대신에HttpMessageConverter
동작- 기본 문자처리:
StringHttpMessageConverter
- 기본 객체처리:
MappingJackson2HttpMessageConverter
- 객체가 오면, 디폴트가 JSON 방식으로 데이터를 만들어서 반환하도록 되어있음
- JSON 값
{"name":"spring"}
웹 브라우저에 반환
- 참고: byte 처리 등등 기타 여러
HttpMessageConverter
가 기본으로 등록되어 있음