[작성일: 2023. 05. 10]
정적 컨텐츠
- 스프링 부트 정적 컨텐츠 기능
- 서버에서 하는 거 없이 파일을 그대로 웹 브라우저에 내려주는 것
- 웹브라우저에서 hello-static.html을 검색하면 제일 처음 내장 톰캣 서버가 요청을 받는다.
- 스프링은 컨트롤러에서 hello-static 컨트롤러가 있는지 찾는다.
- 없다면 내부(resource/static)에 있는 hello-static.html을 찾는다.
- html이 있다면 그대로 반환해 준다.
<!DOCTYPE HTML>
<html>
<head>
<title>static</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠입니다. 그대로 반환됩니다.
</body>
</html>
MVC와 템플릿 엔진
- JSP, PHP 같은 템플릿 엔진이 서버에서 동적인 처리를 하고 웹 브라우저를 내려줌
- 웹브라우저에서 hello-mvc를 넘기면 내장 톰캣 서버를 먼저 거친다.
- 스프링에게 넘겨주면 helloController를 찾는다.
- 컨트롤러가 있다면 메서드를 호출한다.
- retrun 시 hello-template으로 return
- viewResolver가 hello-template을 찾아서 타임리프에게 넘기고, 변환을 한 HTML을 웹 브라우저에 반환해 준다.
Controller
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
hello-template
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
- getMapping("hello-mvc")은 주소로 입력할 값
- RequestParam("name")은 외부에서 받을 값 (hello-mvc?name="spring!" 이런 식으로)
- model.addAttribute("name", name); 에서 첫 번째 "name"은 html의 ${name}과 이름이 같아야 한다. 두 번째 name의 값이 html의 ${name}으로 치환된다.
- return "hello-template";
API
- HTML이 아니라 JSON 데이터 포맷으로 클라이언트에게 전달
- @ResponseBody를 사용하면 뷰 리졸버(viewResolver)를 사용하지 않음.
- 대신 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님)
@ResponseBody
- 웹 페이지에서 페이지 원본보기(소스) 하면 html 코드 없이 "hello spring"만 보이게 된다.
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello" + name;
// 웹 페이지에서페이지 원본보기(소스) 하면 html 소스 없이 "hello spring"만 달랑 보임.
}
Controller
- @ResponseBody를 사용하고 객체를 반환하게 되면 객체가 JSON 형태로 변환해 준다.
// api 방식 -> {"name" : "spring!!"} 형식으로 출력됨.
// JSON 방식 -> 키, 밸류로 이루어진 구조 (심플)
@GetMapping("hello-api")
@ResponseBody // JSON으로 반환하는 게 디폴트로 되어있음.
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello();
hello.setName(name);
return hello;
}
// 객체 생성 해보기 위해 Hello 클래스 생성
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- HTTP의 BODY에 문자 내용을 직접 반환
- viewResolver 대신에 HttpMessageConverter가 동작
- 기본 문자 처리: StringHttpMessageConverter
- 기본 객체 처리: MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음.
- 참고: 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보를 조합해서 HttpMessageConverter가 선택됨.
🐣 출처: 인프런 김영한님 강의
이 글은 인프런의 김영한님 스프링 강의를 보고 작성한 글입니다.
강의를 들으면서 정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.