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개의 댓글

Powered by GraphCDN, the GraphQL CDN