스프링부트는 정적 컨텐츠 기능을 자동으로 제공.
기본적으로 /static에서 파일을 찾아 제공.
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>
localhost:8080/hello-static.html
(파일확장자 포함 파일명까지 적어야 함)

1) localhost:8080/hello-static.html
2) 톰캣 : hello-static이 입력되었다고 스프링한테 알려줌
3) 스프링 : 컨트롤러 쪽에서 hello-static 관련 컨트롤러가 있는지 찾아 봄
4) 컨트롤러가 없으므로, resources/static/hello-static.html 파일을 찾아 바로 반환
MVC : Model, View, Controller
💡 View와 Controller를 나눠 작성하는 방식
- View : 화면을 그리는데 모든 역량을 집중.
- Controller: 로직과 관련, 내부적인 걸 처리하는데 집중.
- Model : 화면에 필요한 데이터를 담아가지고 화면에 전달.
과거에는 Controller와 View를 따로 분리하지 않고, View에 모든 걸 다 하는 Model1 방식으로 많이 개발했으나, 요새 개발 트렌드는 MVC방식.
main/java/hello.hellospring.controller/HelloController.class > helloMvc 메소드 추가
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
resources/templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
❗️Error
org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present@RequestParam(value = "name", required=false) 로 설정하면 값을 넘기지 않아도 되지만, 디폴트가 required=true이기 때문에 지금은 값을 반드시 넘겨줘야 하는 상황💡 해결방법
HTTP GET 방식으로 ?를 사용해 파라미터를 넘겨준다.

1) localhost:8080/hello-mvc?name=spring
2) 톰캣 : hello-mvc이 입력되었다고 스프링한테 알려줌
3) 스프링 : helloController에 매핑되어 있으므로 메소드를 호출하고, 리턴 템플릿과 모델을 넘김
4) viewResolver : template를 찾고, Thymeleaf 템플릿 엔진에게 처리 요청
5) Thymeleaf 템플릿 엔진 : 렌더링을 해서 변환을 한 HTML을 웹브라우저에 반환 (정적일 때는 변환 x)
💡 과거에는 XML방식(HTML태그 사용)을 많이 썼는데 최근에는 거의 JSON 방식으로 통일. 스프링도 @ResponseBody+객체 반환 시, JSON으로 치환하도록 디폴트 세팅되어있음.
main/java/hello.hellospring.controller/HelloController.class > helloString 메소드 추가
@ResponseBody : viewResolver를 사용하지 않고, http 통신 프로토콜 중 바디부에 return값을 직접 반환. return 값(데이터 자체가)이 요청한 클라이언트에 그대로 내려감.@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
main/java/hello.hellospring.controller/HelloController.class > 객체 생성을 위해 static 클래스 Hello 생성 및 helloApi 추가
@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;
}
}
}

1) localhost:8080/hello-api?name=spring
2) 톰캣 : hello-api가 입력되었다고 스프링한테 알려줌
3) 스프링 : helloController에서 hello-api 메소드를 찾음. 메소드에 @responseBody가 없으면 viewResolver한테, 있으면 HTTP응답에 데이터를 넣어 동작. 문자가 아니고 객체라면 JSON방식으로 데이터를 만들어서 응답에 반환하는 게 기본 정책.
@ResponseBody: HTTP의 BODY에 문자 내용을 직접 반환, ㄴviewResolver대신에HttpMessageConverter가 동작
4) HttpMessageConverter 동작 : 단순 문자라면 StringConverter가, 객체라면 JsonConverter(객체를 JSON으로 바꿔주는 유명한 라이브러리 : Jackson(스프링에서 기본적으로 탑재), Gson(구글) 등)가 동작.
HttpMessageConverter
- 기본 문자처리:
StringHttpMessageConverter- 기본 객체처리:
MappingJackson2HttpMessageConverter- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있고, 실무에서도 거의 손대지 않고 기본 세팅으로 사용
💡 정적 컨텐츠를 제외하면, 서버-클라이언트 전달 방식은 크게 2가지 :
- MVC : HTML로 전달, MVC로 나눠서 작성
- API : 객체 반환, 데이터로 전달