[log] Spring 체험하기(2)

RINM·2023년 3월 4일
0

Spring

목록 보기
2/2

Spring 정적 컨텐츠

렌더링이나 별도의 서버 동작 없이 정적인 파일을 브라우저에게 그대로 전달하는 방식. Spring에서는 /resources/static 폴더에 저장된 파일을 파일명을 경로로하여 웹 페이지에 표현한다.

해당 파일에 대한 요청이 들어오면 톰켓 서버가 이를 받아 스프링 컨테이너에게 먼저 전달한다. 해당 페이지에 대한 controller가 없는 경우, resources/static 폴더에서 해당 파일을 찾아 웹 브라우저에 전달한다.

MVC & Template Engine

서버에서 html 파일을 변형하여(렌더링) 전달하는 방식.

MVC : Model, View, Controller


View는 화면 구성과 관련된 부분, Controller는 비즈니스 로직과 관련된 부분이다. View는 resources/template 폴더에 작성한다. 해당하는 페이지에 대한 요청이 들어오면 톰켓 서버가 이를 스프링 컨테이너에 전달한다. 스프링 컨테이너에서 해당 페이지에 지정된 Controller를 찾아 호출한다. 페이지 구성과 관련된 값들은 model에 담아 view에게 전달한다. viewResolver는 넘겨 받은 값들을 활용하여 html을 변환한다. viewResolver가 템플릿 엔진을 호출하여 이루어진다.

controller에서는 정적인 값을 넘겨줄 수도 있고 파라미터처럼 요청에서 받은 값을 넘겨줄 수도 있다. 아래 코드는 hello-mvc 페이지의 파라미터로 name 변수를 받아 hello-template에 전달한다.

@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
 model.addAttribute("name", name);
 return "hello-template";
}

resources/template/hello-template.html에 다음과 같은 html을 작성한다.

<html xmlns:th="http://www.thymeleaf.org">
	<body>
		<p th:text="'hello ' + ${name}">hello! empty</p>
	</body>
</html>

이때 "hello! empty"는 템플릿 엔진이 작동하지 않고 html 파일을 단독으로 열람했을 때 나오는 문구이다. Spring에서 이 파일에 접근하면 템플릿 엔진이 작동하여 전달받은 name 파라미터를 사용하여 페이지가 만들어진다. Controller에서 required 값을 false로 주면 파라미터가 없어도 페이지가 표시되지만 따로 지정하지 않으면 파라미터가 없어 페이지가 표시되지 않는다.

API

서버에서는 json 형식의 데이터만 전달하고 클라이언트가 페이지를 렌더링하는 방식

@Controller
public class HelloController {
 @GetMapping("hello-string")
 @ResponseBody
 public String helloString(@RequestParam("name") String name) {
 return "hello " + name;
 }
}

@ResponseBody를 사용하면 viewResolver를 사용하지 않고 직접 response의 body에 값을 삽입하여 브라우저에게 넘겨줄 수 있다.
이 방식의 좋은 점은 java 객체를 직접 전달할 수 있다는 점이다. 객체는 json으로 변환되어 반환된다. json 방식은 key : value의 맵핑으로 이루어진 데이터 형식이다.

요청받은 페이지의 controller에 @ResponseBody가 사용된 경우 HttpMessageConverter가 호출된다. 반환 값이 객체인 경우 jsonConverter를, 문자열인 경우 StringConverter를 기본으로 사용하여 값을 변환하여 전달한다. 이외에도 다양한 데이터 타입에 대한 HttpMessageConverter가 등록되어 있다. HttpMessageConverter는 controller의 반환값 타입 뿐만아니라 클라이언트의 HTTP Accept 해더 정보를 사용하여 결정된다. 보통 json이 사용된다고 생각하면 편하다.

0개의 댓글