SPRING 입문 [ 코드로 배우는 스프링 부트 ]

[스프링 입문] 섹션 2.2 스프링 웹 개발 기초 (MVC와 템플릿 엔진)

wlalsu_u 2023. 1. 7. 17:08

2.2.1  MVC 란 ?

 

MVCModel View Controller 를 의미한다.

 

 

과거에는 View와 Controller가 통합되어 있어, View에서 모두 접근하였지만 (Model1 방식),

View 파일이 너무 거대해진다는 단점이 있다.

 

따라서 다음과 같이 작업을 나누어 수행하도록 하였다.

 

- View : 화면에 관련된 작업만 수행

- Controller / Model : 내부적인 것을 처리하거나, 비즈니스 모델 관련 작업 수행

 

최근에는 이러한  MVC 컨셉을 주로 사용한다.

 

 

섹션 2.1 의 정적 컨텐츠에서는 서버에서의 변형이 불가능했지만, 
MVC 와 템플릿 엔진을 사용하면, html을 동적으로 바꿀 수 있다.

 

 


 

2.2.2  HelloController.java 작성하기

 

앞서 섹션 1.3에서 작성한 HelloController파일HelloController 클래스에 다음의 코드를 작성하였다.

 

( hello.hellospring  >  hello.hellospring.controller 패키지  >  HelloController.java)

 

 

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

 

 

코드에 대해 하나씩 자세히 살펴보자.

 

 

@GetMapping("hello-mvc")

 

http://localhost:8080/hello-mvc 를 통해 접속할 수 있다.

 

 

 

@RequestParam("name") String name, Model model

 

- @RequestParam 을 통해 파라미터를 받을 수 있다.

key 값은 "name" 이 된다.

-  Model 에 담으면, 외부에서 렌더링할 때 사용된다.

 

 

 

return "hello-template" 

 

리턴 값에 해당하는 html 파일로 넘어간다.

즉, hello-template.html 로 넘어가게 된다.

 

 

 


 

 

2.2.3  hello-template.html 작성하기

 

 

templates 폴더hello-template.html 을 생성하고 다음과 같이 작성하였다.

 

 

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

 

코드를 하나씩 살펴보자.

 

 

<html xmlns : th = "http://www.thymeleaf.org">

 

thymeleaf 를 사용하여, html을 변경할 수 있도록 한다.

 

 

 

${name}

 

${name} 는 앞서 파라미터를 통해 전달받은 name key value 값으로 치환된다.

 

예를들어, name 값을 spring 으로 주면

Controller 의 name 이 spring 으로 변한 되고,  model 에 담긴다.

이후, html 파일은 model 의 key = name 인 값을 찾고 치환한다.

 

 

 

hello! empty

 

템플릿 엔진으로 동작하면, hello + ${name} 의 값이 치환되어 화면에 표시되는데,

hello! empty 는 어떤 기능을 수행할까?

 

 

thymeleaf 템플릿의 장점은 파일의 path를 복사한 후, 경로를 열면

서버 없이 html 파일을 열어 볼 수 있다는 것이다.

 

 

따라서 서버 없이 html 을 확인할 때 필요한 내용을 사이에 적어 넣을 수 있다.

 

실제로 경로를 복사한 후, 경로를 열면 다음과 같은 화면을 볼 수 있다.

 

 

 


 

2.2.4  파라미터 값 전달받기

 

 

단순히 http://localhost:8080/hello-mvc 로 접속하면 다음과 같은 에러 화면이 나타난다.

 

 

IntelliJ 의 경고 메시지를 확인하면,

Required request parameter 'name' for method parameter type String is not present

라고 뜨는 것을 확인 할 수 있다.

 

 

이는 앞서 작성한 @RequestParam 의 required 의 디폴트가 true 이지만,

파라미터 값을 넘기지 않아 생기는 오류이다.

 

 

따라서, http://localhost:8080/hello-mvc?name=spring! 과 같이

? name = (넣을 값) 을 덧붙여 접속해야 한다.

 

 

 

정적 컨텐츠에서는 변환 없이, 단순히 html 파일을 표시하는 것 과는 달리,

thymeleaf 템플릿 엔진에 의해 값이 동적으로 변환되어 넘어가는 것을 볼 수 있다.

 

 

실제 페이지 소스를 확인해보면, 값이 변환되었음을 알 수 있다.

 

 

<!DOCTYPE HTML>
<html>
<body>
<p >hello spring!</p>
</body>
</html>

 

 


 

2.2.5  MVC와 템플릿 엔진 동작 원리

 

 

1) 웹 브라우저에서 localhost:8080/hello-mvc?name=spring! 에 접속

 

2) 톰캣 내장 서버가 요청을 받음

 

3) Spring 에게 넘어가고, Controller 에 mapping 되어 있음을 확인

 

4) modelreturn 값을 확인

     - model ->  name : spring! 이 담겨져 있음.

     - return  ->  hello-template.html

 

5) ViewResolver 는 View 를 찾고, thymeleaf 템플릿 엔진을 연결

 

6) ViewResolver 는 templates/hello-template.html 을 찾고,

    템플릿 엔진이 값을 변환한 html 을 웹 브라우저에 넘김

 

 

 

 

 

 

 

 

김영한 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의를 기반으로 작성하였습니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard