본문 바로가기

Framework/Spring

MVC와 템플릿 엔진

MVC: Model, View, Controller

 

프로그래밍을 할 때에는 관심사를 분리해야 한다. 역할과 책임. View는 화면을 그리는 데에 모든 역량을 집중해야 한다. 반면 Controller나 Model과 관련된 부분들은 비즈니스 로직과 관련이 있거나, 무언가 내부적인 것을 처리하는 데에 집중해야 한다. 그래서 Model, View, Controller를 나누는 것이다. 요즘에는 Controller와 View를 쪼개는 것이 기본이다. 요즘에는 이러한 방식으로 웹 개발을 많이 한다.

 

 

웹 브라우저에서 localhost:8080/hello-mvc를 넘기면, 일단 스프링 부트가 띄울 때 같이 띄우는 내장 톰캣 서버를 먼저 거친다. 내장 톰캣 서버는 "어, hello-mvc라는 것이 왔어"라고 하면서 스프링에게 던진다.

 

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

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

 

그러면 스프링은 "얘가 helloController에 저 메소드가 매핑이 되어 있네"하면서 그 메소드를 호출해준다. 이 컨트롤러에서 @RequestParam("name")  String name은 외부에서 파라미터를 받을 수 있게 설정해둔 것이다.

 

그런데 리턴을 할 때 이름을 "hello-template"이라고 해놨고, 모델에 key는 "name"으로, value는 "spring"으로 값을 넣어놨다. 그러면 스프링의 viewResolver, 즉 화면과 관련된 해결자가 동작을 한다. 이 해결자는 view를 찾아주고 템플릿 엔진을 연결해주는 기능을 한다.

 

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

 

viewResolver가 templates의 hello-template이라는 리턴의 String name과 똑같은 것을 찾아서 Thymeleaf 템플릿 엔진에게 처리해달라고 넘긴다. 그러면 Thymeleaf 템플릿 엔진이 렌더링 해서 변환을 한 html을 웹브라우저에 반환을 해준다. 정적(static)일 때에는 변환을 하지 않고 그대로 반환했었다.

 

이런 템플릿 엔진에서는 변환을 해서 웹브라우저에 넘겨준다. 만약 '?name=~~~'를 기입하지 않으면, 콘솔에 에러 메세지가 뜬다.

 

 

위 사진을 보면 아래쪽에 "Required request parameter 'name' for method parameter type String is not present"라고 에러 메세지가 나타나는 것이다.

 

?name=MVC~~~라고 입력하면, 컨트롤러에서

 

 

위 사진의 초록색 음영 처리된 name들의 값이 "MVC~~~"로 바뀐다. 그리고 이것이 모델(model)에 담긴다. 그리고 templates에 넘어가면, ${name}이 "MVC~~~"로 바뀐다. (여기서 $표시는 model에서 key값이 "name"인 것에서 value값을 꺼내서 치환해주는 것이다.)

'Framework > Spring' 카테고리의 다른 글

API  (0) 2022.11.29
정적 컨텐츠 (Static Content)  (0) 2022.11.29
스프링 부트 (Spring Boot) 동작 환경  (0) 2022.11.28