Spring-MVC와 템플릿 엔진

snowball moon·2023년 9월 30일
0

Spring-입문

목록 보기
6/14
post-thumbnail

MVC: Model, View, Controller

MVC란 Model-View-Controller를 의미한다.
과거에는 Controller와 View가 따로 분리되어 있지 않았다.
요즘은 View는 화면을 그리는데 모든 역량을 집중하고 Controller는 로직과 관련된 내부적인 부분을 처리하는데 집중할 수 있도록 Model, View, Controller로 쪼갠 MVC 패턴을 사용한다.

Controller 추가

@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을 쓴다.(웹사이트에서 url 파라미터로 바꿀 것이다.)

model.addAttribute("name", name);

key와 name이다.

View 추가

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

resources/templates에서 hello-template.html을 추가해준다.

copy path를 해서 경로를 열어보면 파일이 바로 열리는데

thymeleaf의 장점은 html을 쓰고 파일을 서버 없이 열어도 바로 볼 수 있다는 것이다.

<p th:text="'hello ' + ${name}">hello! empty</p>

템플릿 엔진으로 동작 하면 "'hello ' + ${name}" 값이 hello! empty 이 내용으로 치환된다.
(내용을 넣어 놓은 이유는 서버 없이 html을 만들어서 볼 때 값을 적어 놓고 보려고 한 것이다.
실제 서버를 타서 돌면 "'hello ' + ${name}" 여기 있는 값으로 내용물이 바뀐다.)

Localhost:8080/hello-mvc로 들어가면

에러 메세지가 뜨는데 Required String Parameter 'name'이 없다고 뜬다.

(windows 기준) Ctrl+p를 눌러서 파라미터 정보를 확인해 준다

파라미터로 "name"에 SpringMVC 값을 전달
@RequestParam(name 값) String 값을 담을 변수

Required 부분을 보면 default가 true이기 때문에 기본으로 값을 넘겨야 한다.
(파라미터 값 필수 여부, true가 default라서 파라미터가 없을 시 에러가 발생한다.)

required를 false로 설정하면 파라미터 값이 필수가 아니며 에러가 발생하지 않지만 null값으로 넘어온다.

defaultValue는 파라미터가 없을 경우 기본으로 들어갈 값이고 설정 시 파라미터 값이 비어 있다면 defaultValue 값으로 설정한다.

http://localhost:8080/hello-mvc?name=spring

컨트롤러에서 name은 spring으로 바뀌고 모델에 담긴다.

소스 페이지를 보면 변환되었다.

동작 방식

http://localhost:8080/hello-mvc?name=spring
->name은 spring이라고 넘어가면
controller에서

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

name은 spring으로 바뀌고 모델에 담긴다.
그 다음 템플릿으로 넘어가면

<p th:text="'hello ' + ${name}">hello! empty</p>

${name}는 model에서 값을 보내는 것인데 model에서 key값이 name인 것에서 값을 꺼낸 후 치환해준다.

웹브라우저에서 localhost:8080에 hello-mvc를 넘기면 SpringBoot가 내장 톰켓 서버를 먼저 거치는데 내장 톰켓 서버는 hello-mvc가 왔다고 Spring한테 던져준다.
Spring은 helloController에 메서드에 mapping이 되어있다고 메서드를 호출해준다.
return을 해줄 때 hello-tamplate라고 model에는 key를 name으로 값은 spring으로 넣었는데 이것을 spring한테 넘겨준다.
spring은 viewResolver 즉 화면과 관련된 해결자가 동작을 하는데 view를 찾아주고 템플릿을 연결 시켜 준다.

viewResolver는 hello-template라는 return에서 string name과 똑같은 것을 찾고 thymeleaf 템플릿 엔진에서 처리하라고 넘겨준다.

그러면 템플릿 엔진에서 렌더링 하고 변환한 HTML을 웹브라우저에 반환한다.(정적컨텐츠에서는 변환하지 않았다.)

0개의 댓글