오늘은 몰랐으면 내일은 알면 된다

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

Java/Spring

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

마스터피쓰 2022. 9. 19. 15:59

자세한건 추후 MVC 강의를 들을 때 정리하도록 하고, 지금은 개괄적인 것만 이해하도록 해보자.

<정적 컨텐츠>

정적 컨텐츠는 말 그대로 '정적' 인 컨텐츠를 의미하는데, 단순히 html 파일을 제공한다는 뜻이다.

1. 톰캣이 요청을 받아서 스프링에 넘겨주면, 해당 컨트롤러가 있는지 먼저 확인한다.

2. 해당되는 컨트롤러가 없는 경우, resource에서 찾아서 해당 파일을 넘긴다.

 

<MVC와 템플릿 엔진>

MVC: Model, View, Controller 의 줄임말이다.

 

화면은 화면을 표시하는 역할에 충실해야한다. 그리고 서버쪽은 비스니스 로직을 처리하고 데이터를 주고받는 역할에 충실해야한다. 즉 각각이 자신의 역할 하나에 집중되어야 한다는 뜻이다.

 

먼저 간단한 view 와 컨트롤러를 작성해보자.

아래는 name 이라는 매개변수를 model에 담아 view로 보내는 컨트롤러이다.

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

 

view는 날아온 데이터를 표시해주도록 만든다.

templates 폴더 안에 만들어야 한다.

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

 

 

 

1.hello-mvc라는 주소로 요청을 보내면 톰캣서버를 거쳐 spring으로 전달된다.

2.helloController 에서 해당 요청에 매핑되는 메서드가 동작한다.

3.viewResolver 가 templates 에서 리턴된 string 과 맞는 html 을 변환한다.

4.변환된 html이 반환된다.

 

<API>

mvc 패턴이 템플릿, html 변환과 관련이 있다면, API는 데이터 전송과 관련이 있다고 하겠다.

먼저 간단한 컨트롤러를 만든다.

 

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

 

이때, ResponseBody는 응답 http body 부분에 해당 데이터를 바로 넣어주겠다는 뜻이라고 한다.

이렇게 되면 hello-string으로 요청을 보냈을 때 return 뒤의 hello + name 문자열이 전달된다.

 

페이지의 소스를 보면 정말로 덜렁 문자열만 전달되었다는 것을 확인할 수 있다.

 

 

객체를 보내면 어떻게 될까? JSON이 반환된다. name 이 key 이고, 전달받은 매개변수가 value로 들어갔다.

 

    @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;
        }
    }

 

@ResponseBody 붙어있는 상태에서 객체를 보냈기 때문에 디폴트값인 json 값으로 만들어서 http의 body에 직접 반환한다.

 

기본 문자처리: StringHttpMessageConverter
기본 객체처리: MappingJackson2HttpMessageConverter
byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

 

Http Accept 헤더에서 xml을 요청한다든지.. 특정 데이터 형식 조건이 달려있는 경우에는 해당 데이터 형식에 맞는 converter가 동작하여 처리한다.