[Spring] View 를 처리하는 방법들 (Static, Template, API)

728x90

정적 콘텐츠

- static/index.html 을 올리면 Welcome page 기능 제공

- 정적 리소스를 제공 (HTML, CSS, JS, 이미지 등)

- 브라우저가 요청하면 spring 이 그대로 반환

- 파일 자체로 클라이언트로 전달

 

resources/static 폴더에 html 파일을 생성하고

주소창에 localhost:8080/hello-static.html 을 입력하면, 소스 코드 파일 그대로 전달된다. (hello-static 은 임의의 viewName)

1. resources/static/hello-static.index 파일을 생성한다.

2. localhost:8080/hello-static.html 을 입력하여 서버에 접속한다.

3. 파일이름과 일치하는 @GetMapping("hello-static") 을 찾지만 관련 컨트롤러가 존재하지 않는다.

(컨트롤러 먼저 우선순위를 가짐)

4. resources/static 폴더에 hello-static.html 이 존재하는지 확인한다.

5. 존재하면 resources/static/hello-static.html 파일을 변환하지 않고 그대로 웹 서버에 전달한다.

 

MVC 와 템플릿 엔진

- Model, View, Controller 로 분리

- HTML을 렌더링 하면서 서버에서 동적으로 데이터를 바인딩

- 컨트롤러에서 데이터를 모델(Model)로 전달하고, 템플릿 파일에서 렌더링 한 후 파일을 클라이언트로 전달

 

예시 1

1. @GetMapping("hello") 로 실행할 메서드를 생성한다. (hello 는 임의의 viewName)

2. 해당 hello 로 localhost:8080/hello 을 입력하여 서버에 접속한다.

3. hello 와 일치하는 @GetMapping("hello")을 찾아 메서드를 실행한다.

4. spring 이 model 을 만들고, "hello" 문자를 리턴한다.

5. viewResolver 가 "hello" + `.html` 로 매핑하여 templates/hello.html 파일을 변환하여 전달한다.

@GetMapping("hello")
public String hello(Model model) {
    model.addAttribute("data", "hello!!");
    return "hello";
}

 

예시 2

1. @GetMapping("hello-mvc") 로 외부에서 파라미터를 받아오는 메서드를 생성한다. (hello-mvc 는 임의의 viewName)

2. 해당 hello-mvc 으로 localhost:8080/hello-mvc?name=spring!!! 을 주소창에 입력하면

3. hello-mvc 와 일치하는 @GetMapping("hello-mvc")을 찾아 메서드를 실행한다.

4. spring 이 name 이라는 파라미터에 spring!!! 라는 값으로 치환한 후 model 을 생성하고, "hello-template" 문자를 리턴한다.

4. viewResolver 가 "hello-template" + `.html` 로 매핑하여 templates/hello-template.html 파일을 변환하여 전달한다.

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

 

이때 name 이라는 파라미터가 요구되므로, 주소창에 localhost:8080/hello-mvc 만 입력하면 오류가 발생한다.

 

API

- 실행할 메서드에 @ResponseBody 어노테이션을 추가해야 한다.

(@ResponseBody : HTTP body 에 리턴값을 직접 넣어준다는 뜻)

- 문자인 경우, 문자 그대로 전달

- 객체인 경우, Json 으로 전달

 

예시 : 객체인 경우

1. @ResponseBody 사용

2. HTTP 의 BODY 에 문자 내용을 직접 반환

3. HttpMessageConverter 가 동작

4. 기본 문자 : StringHttpMessageConverter

5. 기본 객체 : MappingJackson2HttpMessageConverter

// 문자
@GetMapping("hello-string")
@ResponseBody
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;
}

static class Hello {
    private String name;

    public String getName() {
        return name;
    }

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

 

 

 

 

 

 

 

출처 | 스프링 입문(김영한) - 인프런

728x90