
Spring Boot에서 웹 애플리케이션은 크게 3가지 방식으로 응답을 제공한다.
각 유형별 상세한 동작방식을 알아보자!
Spring Boot는 정적 컨텐츠 제공 기능을 기본으로 지원한다.
지난 포스팅에서 작성한 Welcome Page와 같은 정적 컨텐츠를 실행하는 과정은 아래와 같다.
(/resources/static)에서 동일한 이름의 파일이 있는지 탐색한다.즉, Spring Boot는 항상 Controller를 먼저 탐색하고, 없을 경우 정적 리소스로 fallback하는 구조를 가진다.
MVC란 Model, View, Controller의 약자이다.
과거에는 View와 Controller가 분리되지 않은 구조를 사용했으며, 화면과 로직이 뒤섞이는 문제가 있었다.
이후 역할과 책임을 분리하기 위해 MVC 패턴이 등장했고, 아래와 같이 사용되고있다.
Controller 예시
@Controller
pulic 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>
Model은 View에서 필요로하는 것들을 담아서 전달해준다.
http://localhost:8080/hello-mvc?name=nogglee로 접근하면:
1. name 파라미터가 Controller 메서드의 name 변수에 저장된다.
2. 해당 값이 Model에 담긴다.
3. Thymeleaf 템플릿에서 ${name} 표현식을 통해 Model 값을 꺼내 HTML을 완성한다.
Controller와 View의 흐름을 정리하면 아래와 같다.
1. 웹브라우저가 URL 요청
2. 요청한 URL이 내장된 톰캣에 전달됨
3. 톰캣 서버는 해당 경로로 매핑된 컨트롤러가 있는지 확인
4. 매핑된 컨트롤러는 Model에 데이터를 담고 View 이름을 반환
5. ViewResolver가 템플릿 파일을 찾음
6. Thymeleaf가 HTML을 렌더링
7. 완성된 HTML이 브라우저로 반환됨
API 방식은 별도의 View 없이 데이터를 직접 반환한다.
Controller 예시
// 해당 클래스는 Getter와
static class Hello
{
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name)
{
Hello hello = new Hello();
hello.setName(name);
return hello;
}
@ResponseBody는 return 값을 View가 아닌 HTTP Body에 직접 실어 보내겠다는 의미이다.
API에서 ResponseBody 동작 방식
@ResponseBody가 존재하면 ViewResolver를 거치지 않음