정적컨텐츠 : 파일을 그대로 브라우저에 내려받는 것입니다.
스프링 공식문서 > https://bit.ly/3IhQ8O0
<-> 동적인 컨텐츠 : JSP나 PHP처럼 서버에서 가공해서 동적으로 바꾸어서 브라우저에 내려받는 것입니다.
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
MVC(Model, Controller, View)와 템플릿 엔진
keyword : 역할과 책임, 관심사 분할
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'안녕하세요. ' + ${name}" ></p>
</body>
</html>
@GetMapping("hello-mvc")
/*@RequestParam("name") 을 사용했다면,
브라우저 주소창에 http://localhost:8080/hello-mvc에 추가로
?name=이랑 함께 출력시키고 싶은 내용
(이 내용이 name에 담겨서 html에 전달 됨)을 입력
(이게 get방식에서 ?&&~.. 라고 설명하심)*/
public String helloMvc(@RequestParam("name") String name, Model model){
model.addAttribute("name", name);
return "hello-template";
}
API : JSON데이터 포멧으로 클라이언트에게 전달하고, 화면은 클라이언트가 알아서 그려서 구성합니다.
(xml보다 가볍고 가독성 및 코드 작성효율이 좋은
json방식이 좀 더 많이 쓰이는 추세입니다.)
@GetMapping("hello-string")
@ResponseBody //http프로토콜의 head와 body가 있는데 그 body에 이 내용을 직접 넣어주겠다.
//뷰가 없고 이거 자체로 전달되어 화면이 그려짐. 하려면 html태그를 넣을 수는 있지만 비효율적이다.
public String helloString(@RequestParam("name") String name){
return "hello " + name;
}
//uri에 hello-api가 감지되면 톰캣에서 해당 코드로 매핑
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello(); //객체 생성
hello.setName(name);
return hello;//객체를 반환
}
//getter와 setter, 자바 beanr규약, 객체 property 접근 방식
static class Hello{
private String name;
//꺼낼때
public String getName() {
return name;
}
//넣을때
public void setName(String name) {
this.name = name;
}
}
?name=입력값 없이 요청 할 경우 -> 에러 발생
?name=입력값을 입력하여 요청할 경우 -> 정상적인 페이지 확인
참고 : 클라이언트의 HTTP Accept해더와 서버의 컨트롤러 반환 타입 정보를 조합해서 HttpMessageConverter가 선택된다.