스프링 입문 - MVC와 템플릿 엔진
MVC란, Model, View, Controller 의 약자이다.
View는 화면을 그리는데에 모든 역량을 집중해야한다.
Controller나 Model과 관련된 부분에서는 비즈니스 로직과 관련이 있거나, 뭔가 내부적인 것을 처리하는데 집중해야 한다.
그래서 Model, View, Controller를 쪼갠 것이다.
View는 화면과 관련된 일만,
비즈니스 로직과 서버 뒷단에 관련된 것은, Controller나, 뒷단 비즈니스 로직에서 전부 처리하고,
화면에서 필요한 관련된 것들을 Model에다가 담아서 화면쪽에 넘겨주는 패턴을 많이 사용한다.
HelloController에 추가해보자.
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
이전에는 spring에서 파라미터를 직접 받았는데,
이번에는 외부에서(웹에서) url로 파라미터(name)를 받을 것이다.
model.addAttribute("name", name) 을 사용해서 파라미터로 넘어온 name을 넘겨주자.
그리고 return을 "hello-template" 라고 하자.
return을 "hello-template"로 한다고 했으므로, template 폴더에서 "hello-template"라는 이름의 html을 만들자.
강의 안에 있는 html을 복사 붙여넣기 하자.
thymeleaf 템플릿 엔진을 사용해야 한다.
이 부분을 보면, hello! empty는 뭐냐고 궁굼할 수 도 있는데,
해당 문구는 없어도 된다. 역할이 뭐냐면,
thymeleaf의 장점과 연관된 것인데,
hello-template.html의 Path를 복사해서 웹브라우저에 띄우면,
파일을 열어준다. 그리고 소스보기를 하면,
이렇게 소스도 나온다.
thymeleaf의 장점은, html을 서버없이 그대로 열어봐도,
껍데기를 볼 수 있다.
이 부분을 볼 수 있고, 코드의 hello! empty 부분이 보여지는 것이다.
그런데, 이게 template engine으로서 동작을 하게되면,
"'hello ' + ${name}" 값으로 hello! empty내용이 치환되게 된다.
즉, 저 부분에 내용을 넣어 놓는 것은, 서버 없이 그냥 html을 만들어서 볼 때, 뭔가 값을 적어 놓고 볼 수 있도록 하는 것이다.
하지만 앞서 말했듯, 실제로 서버를 타게 되면, "'hello ' + ${name}" 값으로 hello! empty내용이 치환되게 된다.
이제, 서버를 돌려보자.
localhost:8080/hello-mvc 로 접속하면, 에러 페이지가 뜬다.
왜에러가 날까?
서버의 로그를 보면,
에러가 낫으므로 warning이 떳다.
그리고 내용을 살펴보면,
"Required request parameter 'name' for method parameter type String is not present"
라는 내용을 확인할 수 있다.
매개변수로 'name'이 있어야 하는데, 없어서 발생한 것이다.
파라미터에 커서를 놓고 cmd+p를 누르면 파라미터의 옵션을 볼 수 있다.
만약 required옵션을 false로 해주면 넘기지 않아도 된다.
이렇게 옵션을 주고, 다시 localhost:8080/hello-mvc로 접속해보면,
에러페이지가 아니라, 페이지가 잘 뜨는데, 'name' 부분이 값을 주지 않았으므로 null로 표시된다.
다시 원래 코드로 돌아와서 보면,
디폴트 값이 ture이기 때문에 디폴트로 하면, 'name'을 무조건 넘겨야 한다.
그래서 url을 통해 파라미터를 넘겨주면서 접속해보자.
"http://localhost:8080/hello-mvc?name=spring!"
http get 방식에서 "?"로 and를 이용해서 name=spring!! 이라고 넘겨주는 것이다.
위 사진처럼, 'name'에 url파라미터를 준, spring!! 이 잘들어가서 정상적으로 접속 된 것을 확인할 수 있다.
동작 방식을 알아보자.
"http://localhost:8080/hello-mvc?name=spring!" 이라고 주게되면,
Controller에서 name이 spring! 이라고 바뀐다.
그리고, 이것이 model담긴다.
그리고 template로 넘어가면,
${name}이 spring! 으로 바뀐다.
$에 표시되어 있는 것은 모델에서 값을 꺼내는 것이다.
${name} 은 모델에서 key가 name인 것의 value를 꺼내는 것이다.
그리고 서버를 돌리면 치환해서 보여준다.
이 과정을 간단한 그림으로 알아보자.
웹 브라우저에서 localhost8080/hello-mvc를 넘기면, springboot를 띄울 때, 같이 띄우는 내장 톰켓 서버를 거친다.
내장 톰켓 서버는 hello-mvc라는게 왔어! 라고 스프링한테 던진다.
스프링은 helloController에 hello-mvc 메서드가 매핑이 되어있네? 라고하며 hello-mvc 메서드를 호출해준다.
그런데, return을 해줄 때, 이름을 hello-template, 그리고 model(그림기준)에는 key는 name, value는 spring이라고 지정했으므로 이것을 스프링한테 넘겨준다.
그러면 스프링에 있는 viewResolver라는 화면과 관련된 해결자가 동작을 한다.
viewResolver는 view를 찾아주고, 템플릿 엔진을 연결시켜준다.
그러면 viewResolver가 templates폴더에서 hello-teampalte라는 앞의 return의 이름과 똑같은 html을 찾아서 thymeleaf 템플릿 엔진에게 처리해달라고 넘긴다.
그러면, 템플릿 엔진이 랜더링을 해서 html로 변환을 해서 웹브라우저에 반환해준다.
정적일때는 변환을 하지않고 그대로 반환을 해주었지만,
이러한 템플릿 엔진에서는 변환을 해서 웹브라우저에 반환한다.
참고로, false로 해주면 넘기지 않아도 된다.
이렇게 옵션을 주고, 다시 localhost:8080/hello-mvc로 접속해보면,
에러페이지가 아니라, 페이지가 잘 뜨는데, 'name' 부분이 값을 주지 않았으므로 null로 표시된다.
'Spring' 카테고리의 다른 글
스프링 입문 - 비즈니스 요구사항 정리 (0) | 2022.05.17 |
---|---|
스프링 입문 - API (0) | 2022.05.16 |
스프링 입문 - 정적 컨텐츠 (0) | 2022.05.16 |
스프링 입문 - 빌드하고 실행하기 (0) | 2022.05.15 |
스프링 입문 - View 환경설정 (0) | 2022.05.14 |
댓글
이 글 공유하기
다른 글
-
스프링 입문 - 비즈니스 요구사항 정리
스프링 입문 - 비즈니스 요구사항 정리
2022.05.17 -
스프링 입문 - API
스프링 입문 - API
2022.05.16 -
스프링 입문 - 정적 컨텐츠
스프링 입문 - 정적 컨텐츠
2022.05.16 -
스프링 입문 - 빌드하고 실행하기
스프링 입문 - 빌드하고 실행하기
2022.05.15