소근소근

[Spring] 정적 컨텐츠 , MVC 와 템플릿 엔진 , API 본문

Spring

[Spring] 정적 컨텐츠 , MVC 와 템플릿 엔진 , API

JJureng 2022. 4. 10. 15:44
728x90
반응형
SMALL

(김영한님의 인프런 스프링 입문 강의 정리를 보고 정리한 글입니다)

 

 

1. 스프링 부트의 정적 컨텐츠 

 

프로젝트의 static폴더에 index.html이 있다면 서버를 실행시켰을 때 기본적으로 이 페이지가 렌더링 된다. 

이는 데이터를 받아서 렌더링 하는게 아니라 단지 정적으로 html파일을 그냥 보여주는 것이다.

 

2. Model View Controller : MVC

 

# Controller

@Controller
public class HelloController {

    @GetMapping("hello") //web application에서 /hello 로 들어오면 이 메소드가 호출된다
    public String hello(Model model){
        model.addAttribute("data","hello!"); //모델을 넘긴다
        return "hello"; //hello.html 로 가서 렌더링 하라
    }

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

컨트롤러에서는 인자로 model을 받는다. 이 모델을 view(html 파일)로 넘겨줘서 원하는 것을 렌더링할 수 있다.

model.addAttribute로 key값과 value값을 넘겨준다. 

return "hello" 의 의미는 templates폴더 내에 hello.html 파일에게 모델을 넘기고 렌더링하라는 것이다. 

 

- @RequestParam : url으로 데이터를 받을 수도 있다. 이 경우 /hello-mvc/?name="hihi" 를 받으면 model 에hihi 값을 넣어 hello-template.html로 보내게 된다. 

 

#View (templates/hello.html)

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Hello</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
    <p th:text="'안녕하세요. ' + ${name}" >안녕하세요. 손님</p>
    </body>
</html>

hello.html에서는 컨트롤러부터 모델을 넘겨 받는다. 위에서 key값이 name인 데이터를 받아 html에 띄운다.

이때 html에 받은 데이터를 렌더링하기 위해서는 thymeleaf와 같은 라이브러리를 사용하면 된다. 

 

3. API

위에서는 컨트롤러가 모델을 view에게 넘겨 데이터를 띄웠다. 

그런데 여기서 @ResponseBody annotation을 추가하게 되면, view없이 바로 응답할 수 있다.

@Controller
public class HelloController {
    @ResponseBody //http body 부의 데이터 직접 넣어준다 view(template/html)없이 문자 그대로 내보낸다
    @GetMapping("hello-string")
    public String helloString(@RequestParam("name") String name){
        return "hello" + name;
    }

    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello; //json 형식으로 보여준다 {"name" : "..."}
    }
    static class Hello {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

}

- helloString

RequestParam으로 데이터를 받아 string을 리턴한다. 이 경우 @ResponseBody 어노테이션때문에 이는 html파일을 부르는 것이 아니라 바로 데이터를 반환한다. 이 경우 페이지에 그냥 문자열이 렌더링 된다. 

- helloApi

만약 응답하는 데이터가 객체라면 어떻게 될까? 아래 정의한 Hello 클래스를 생성하여 리턴한다. 이 경우에는 json형식으로 반환을 할 수가 있다. (만약 요청header에 원하는 응답 형식이 있다면 그에 맞게 리턴할 수도 있다.) 

현재는 json을 객체 반환 형태로 많이 사용한다.

 

[ 동작 방식 ]

 

1. 위 2번의 MVC 와 템플릿 방식에서 동작 방식

- @GetMapping 만 있을 때

- 웹 브라우저에서 요청을 보내면, 스프링 부트의 컨트롤러가 모델을 viewResolver에게 전달하고, 뷰 리졸버가 화면을 찾아서 처리한다. html파일 내부에서는 thymeleaf와 같은 템플릿 엔진 처리를 통해 받은 데이터를 렌더링 하게 된다. 

 

2. api에서 @ResponseBody

- http 의 body 부에 내용을 직접 반환한다. (View가 없다)

- 1번에서의 viewResolver가 아니라  스프링 부트의 HttpMessageConverter가 동작을 하게 된다.

- 문자, 객체 등 처리하는 대상에 따라 세부 컨버터는 다르게 호출된다. (JsonConverter , StringConverter .... )

- 언급한 것 처럼, 만약 요청 헤더에서 반환 타입을 지정했다면 이를 참조하여 컨버터가 선택된다. 

728x90
반응형
LIST

'Spring' 카테고리의 다른 글

Spring boot 시작하기 , 윈도우 빌드하기  (0) 2022.04.10