파일을 그대로 웹 브라우저(클라이언트)에 전달하는 방식.
기본적으로 Spring Boot에서는 정적 컨텐츠를 /static or /public or /resources or /META-INF/resources 폴더에서 찾아 제공한다.
예제
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>static content</title>
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
static 폴더에 이와 같이 hello-static.html을 만든다.
- 정적 컨텐츠가 돌아가는 방식
- 웹 브라우저에서 http://localhost:8080/hello-static.html을 치면 내장 톰캣 서버가 이 요청을 받는다.
- 내장 톰캣 서버는 이 요청을 스프링에 넘긴다.
- 스프링은 hello-static과 관련된 컨트롤러가 있는지 찾아본다.
- 만약 맵핑된 컨트롤러가 없다면 resources: static 내부에 있는 hello-static.html을 찾는다.
- 해당 hello-static.html이 있으므로 그것을 웹 브라우저에 반환해준다.
서버에서 html을 변형하여 웹 브라우저(클라이언트)에 전달하는 방식.
MVC: Model, View, Controller
Model: Model에 화면에 필요한 것들을 담아서 화면쪽에 넘겨준다.
View: 화면을 그리는 데 모든 영향을 집중한다.
Controller: 비즈니스 로직과 서버 뒷단에 관련된 일을 처리한다.
과거에는 View, Controller가 따로 분리되어 있지 않았다고 한다.(View에서 다 처리. 이를 소위 Model1 방식이라고 하며, jsp로 많이 했음.)
현재에는 MVC 방식으로 많이 진행된다.
예제
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model){
model.addAttribute("name", name);
return "hello-template";
}
HelloController.java에 다음과 같이 helloMvc() 메서드를 만든다.
@RequestParam: 외부에서 파라미터를 받을 때 사용.
@RequestParam의 required는 true가 디폴트이다. 따라서 무조건 파라미터를 넣어주어야 한다.(현 예제에서는 url을 통해 파라미터를 전달한다.)
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
templates 폴더에는 위와 같이 hello-template.html을 작성한다.
- thymeleaf의 장점
thymeleaf의 장점은 html을 그대로 서버없이 열어봐도 껍데기를 볼 수 있다는 것이다.
즉, 절대경로를 그대로 웹 브라우저에 입력하면 hello! empty가 뜨는 것을 볼 수 있다. 그런데 이 html이 템플릿 엔진으로 동작(서버를 통해 동작)하면 hello! empty가 'hello ' + ${name}로 치환된다.
결과1: 절대경로로 접속
결과2: url로 접속(파라미터로 Level0 전송)
- MVC와 템플릿 엔진의 작동 방식
- 웹 브라우저에서 http://localhost:8080/hello-mvc을 치면 내장 톰캣 서버가 이 요청을 받는다.
- 내장 톰캣 서버는 이 요청을 스프링에 넘긴다.
- 스프링은 HelloController에 hello-mvc라는 메서드가 있는 것을 보고 해당 메서드를 호출해준다.
- 이 메서드에서 return은 hello-template, model에는 (name:Level0)를 넣어 스프링에 넘겨준다.
- 스프링에서 viewResolver(화면 관련 해결자)는 view를 찾아 템플릿 엔진을 연결시켜준다. 따라서 viewResolver가 templates/hello-template.html을 찾아 Thymeleaf 템플릿 엔진에게 처리를 해달라고 넘겨준다.
- Thymeleaf 템플릿 엔진이 렌더링을 하여 변환한 html을 웹 브라우저에 반환한다.(정적과 반대)
JSON 포맷으로 웹 브라우저(클라이언트)에 데이터를 전달하는 방식.(통상적으로 요즘의 API 방식이라 함은 이를 의미한다.)
예제
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello "+ name;
}
}
@ResponseBody: http의 응답 body에 "hello "+ name 데이터를 직접 넣어주겠다는 의미이다.
ex) return "hello "+ name에서 name이 Level0라면 "hello Level0"라는 문자가 요청한 클라이언트에 그대로 내려간다.
템플릿 엔진과의 차이는 view가 없이 문자가 그대로 내려간다는 것이다.
@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;
}
}
}
- API 작동방식
- 웹 브라우저에서 localhost:8080/hello-api?name=Level0를 입력하여 내장 톰캣 서버에 요청을 넘긴다.
- 톰캣 내장 서버에서는 이 요청을 스프링에 넘긴다.
- 스프링은 @ResponseBody 애노테이션이 붙어있으므로 HttpMessageConverter가 동작하며, 단순 문자라면 StringConverter가 객체라면 JsonConverter가 기본으로 동작한다.
- 데이터의 스타일이 바뀌어 http 응답으로 반환된다.(단순 문자라면 http 응답에 그대로 이 데이터를 넘기는 것으로 동작, 객체라면 JSON 방식으로 데이터 스타일을 바꾸어 동작)
@ResponseBody란?
http의 body에 문자 내용을 직접 반환하겠다는 의미이다.
viewResolver 대신에 HttpMessageConverter가 동작한다.
기본 문자처리: StringHttpMessageConverter
기본 객체처리: MappingJackson2HttpMessageConverter
byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있다.
@ResponseBody를 하고 객체를 반환하는 것은 JSON으로 반환하는 것이 기본으로 세팅되어 있다.
본 포스팅은 inflearn 김영한 강사님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 강의에 기반하여 작성되었습니다.
강의 링크
좋은 정보 감사합니다 ^^