danDevlog

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

Spring 입문

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

단데기이 2022. 3. 21. 16:29
728x90

정적 컨텐츠는 서버에서 무언가 작업하는거 없이 바로 웹 브라우저로 띄어준다.

동작 방식

웹 브라우저 -> hello.html요청 -> 톰캣서버 요청 접수 후 스프링에게 넘김 -> 스프링은 hello라는 컨트롤러를 찾음 -> 관련 컨트롤러가 없으면 resources/static/hello.html이라는 정적 콘텐츠를 찾아서 웹 브라우저에게 반환


Model1 에서는 JSP가 모든 model, contorller, view 의 역할을 수행해서 파일 하나에 상당한 코드가 있었다.

Model2 에서부터 Model, Controller, View가 따로 나누어져서 역할을 수행한다.

Model은 data 정보들의 가공 / View는 사용자게에 보여지는 부분 / Controller는 모델과 뷰 사이를 이어주는 다리 역할

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

웹브라우저에서 localhost:8080/hello-mvc 를 요청하면 내부 Tomcat서버가 이를 스프링에게 알려준다.

 

그러면 관련된 Controller에서 GetMapping으로 적혀진 내용과 일치하면 매핑된 해당 메소드를 실행한다.

 

@RequestParam으로 매개변수를 입력받는다. 해당 어노테이션을 사용하면 반드시 웹브라우저 주소창에서 매개변수를 넘겨주어야 한다. 

 

브라우저에서 localhost:8080/hello-mvc?name=spring 을 입력하면 name 부분에 spring이 들어간다.

 

modek에서 name:spring 이라는 데이터를 꺼내어 hello-template과 함께 return 한다.

 

그 후 ViewResolver가 hello-template이라는 이름의 view가 있는지 찾고 찾았으면 view에 템플릿 엔진 처리를 완료한 후, 웹 브라우저에 전달한다.

 

 


-Html을 내리냐 / API로 내리냐

정적 컨텐츠를 제외하면 스프링의 동작 방식에는,

mvc 패턴으로  html을 내려주는 방식 / API를 사용하는 방식(html X) 의 두 가지 방법이 있다.

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name){
        return "hello " + name; // "hello spring"
    }

@ResponseBody 어노테이션은 http통신 프로토콜의 body부에 데이터를 직접 넣어주겠다라는 뜻이다.

name=string으로 했기때문에 return값이 hello string이 된것이다.

api방식
mvc템플릿 방식

해당 페이지에서 페이지 소스보기를 하면 html태그같은것이 전혀 없이 hello string 만 나오게된다.

즉, api 방식을 사용하면 return시에 view(html)가 필요없이 정말 데이터 그대로 반환된다.

 

단순 문자열이 아닌 데이터를 반환할 때는 어떨까

    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }

    static class Hello{
        private String name;

        public String getName() {
            return name;
        }

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

Hello라는 객체를 만들고 이름을 정하고 이를 반환한다.

객체를 반환하면, 다음과 같이 JSON 형태인 key와 value 형태로 반환이 된다.

  • viewResolver 대신에 HttpMessageConverter가 동작
  • HTTP의 BODY에 문자 내용을 직접 반환 (HTML BODY TAG를 말하는 것이 아니다)

 

웹브라우저 http://localhost:8080/hello-api를 요청 -> 톰캣 내장서버가 스프링에게 알려줌 ->

@ResponseBodt 어노테이션을 통해서 HttpMessageConverter가 해당 데이터를 자료형에 맞게 변환하여 http body에 붙여 응답

 

 

-정리-

 

정적컨텐츠 : 파일을 그대로 바로 내려준다.

 

MVC와 템플릿 엔진 : 템플릿 엔진을 Model View Controller 방식으로 쪼개서 View를 렌더링해줘서 클라이언트에게 전달해준다.

 

API : 객체 반환. / HttpMessageConverter를 통해서 JSON방식으로 변경해서 반환을 해줌 View같은거 없이 바로 httpResponse에 넣어서 반환해줌

Comments