정적 컨텐츠
서버에서 어떠한 작업 없이 파일을 그냥 내려주는 것
웹브라우저에서 localhost:8080/hello-static.html라고 요청이 왔다.
톰캣 서버가 이러한 요청이 왔다고 스프링에게 전달한다.
스프링은 컨테이너에 hello-static이라는 컨트롤러가 있는지 찾아본다. (컨트롤러에 우선순위가 있음)
없으면 resources안에 요청파일을 찾아서 반환한다.
MVC와 템플릿 엔진
html을 서버에서 무언가를 동적으로 바꿔서 내려주기 위해 MVC 패턴으로 개발하는 것을 뜻함.
Model, View, Controller
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model){
model.addAttribute("name",name);
return "hello-template";
}
}
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
웹 브라우저가 /hello-mvc를 던지면 내장 톰캣 서버가 스프링에 던진다.
스프링은 hello-mvc가 매핑된 컨트롤러의 메서드로 연결한다.
메서드 로직에 따라 넘어온 name은 모델에 담겨 hello-template를 리턴한다.
뷰를 찾아서 템플릿을 연결해주는 viewResolver가 리턴한 문자열과 같은 이름의 파일을 찾아서 넘겨준다.
thymeleaf 템플릿 엔진은 html로 변환하여 웹 브라우저에 반환한다.
API
- json이라는 데이터 포맷으로 클라이언트에게 전달하는 것
- 데이터를 내려주면 프론트에서 알아서 보여준다.
ResponseBody
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody //응답부 바디에 직접 넣어준다.
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
http에서 response의 body영역에 직접 리턴값을 넣어주겠다는 의미이다.
view 없이 리턴 값 그대로 돌려준다.
JSON으로 반환
@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;
}
}
}
위처럼 getter,setter 방식으로 만들어서 private인 name에 바로 접근하지 않고 public 메서드로 접근하는 것을 '자바 빈 표준 방식' 혹은 '프로퍼티 접근 방식'이라고 한다.
웹브라우저에서 요청이 들어오면 톰캣이 스프링에 던진다.
-> 스프링은 hello-api라는 컨트롤러를 찾는다.
-> 찾은 컨트롤러에 @ResponseBody라는 애너테이션이 붙어있다.
->@ResponseBody가 없으면 원래 viewResolver에게 던지는데 이제는 http response를 그대로 넘긴다.
->근데 넘길 값이 String이 아니라 Hello라는 객체이니 json방식으로 만들기 위해 HttpMessageConverter가 동작한다.
(단순 String이라면 StringConverter , json이라면 JsonConverter가 동장)
->{"name":"tony"}처럼 객체로 반환한다.
정리
HttpMessageConverter
StringHttpMessageConverter : 기본 문자 처리
MappingJackson2HttpMessageConverter : 기본 객체 처리, json으로 반환해주는 라이브러리
어떤 컨버터가 선택될지는 클라이언트의 HTTP Accept 헤더와 서버 컨트롤러의 반환 타입 정보를 조합하여 선택한다.
@ResponseBody
http의 body에 문자 내용을 직접 반환한다.
'Spring' 카테고리의 다른 글
@Component와 @Configuration (0) | 2022.09.25 |
---|---|
스프링 빈과 의존 관계 (2) | 2022.09.25 |
사용중인 포트 죽이기 (1) | 2022.09.24 |
Spring과 Spring Boot (0) | 2022.09.02 |
좋은 객체 지향 설계의 5가지 원칙(SOLID) (0) | 2022.08.24 |