스프링 공부 (인프런 김영한 선생님)/스프링 MVC 1편

[스프링 웹 MVC 1편] 24. HTTP 응답 - 정적 리소스, 뷰 템플릿

ProgYun. 2023. 6. 4. 14:38

지금까지는 @ResponseBody를 이용하여 String을 HTTP 바디에 직접 넣어주거나

HttpEntity<>("OK") 식으로 넘겨주거나, response.getWriter / OutputStream을 이용하였다.

 

그렇다면 이제 정적 리소스와 뷰 템플릿을 이용하는 방법에 대해 알아보자

 

먼저 용어 정의를 명확히 할 필요가 있다.

 

정적 리소스 - 웹 브라우저에 정적인(렌더링 로직 X)인 HTML, CSS, JS 파일을 제공할 때는 정적 리소스를 사용

뷰 템플릿 사용 - 웹 브라우저에 특정 로직을 적용한 동적 HTML을 제공할때는 뷰 템플릿을 사용한다.

HTTP 메세지 사용

- HTTP API를 사용하는 경우에는 HTML이 아니라 데이터를 전달해야 하기 때문에, HTTP 메세지 바디에 JSON 형식으로 데이터를 실어 나른다.

 


정적 리소스

 

스프링 부트는 다음 디렉토리에 있는 정적 리소스를 제공한다

/static, /public, /resources, /META-INF/resources

 

src/main/resources -> 리소스를 보관하는 디렉토리, 클래스패스의 시작 경로

따라서 다음 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공함.

 

정적 리소스 경로

/src/main/resources/static

 

다음 경로에 파일이 들어있으면

src/main/resources/static/basic/hello-form.html이면

localhost:8080/hello-form.html과 같이 실행이 가능하다

 


뷰 템플릿

뷰 템플릿을 거쳐서 HTML이 동적으로 생성되고 뷰가 응답을 만들어서 전달한다.

 

일반적으로 HTML을 동적으로 생성하는 용도로 사용하나 다른 용도로도 사용 가능하다

 

스프링 부트는 기본적으로 뷰 템플릿 경로를 제공한다.

 

src/main/resources/templates

 

지금부터 뷰 템플릿이 사용되는 방법을 코드로 보도록 하겠다.

package hello.springmvc.basic.response;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ResponseViewController {

    @RequestMapping("/response-view-v1")
    public ModelAndView responseViewV1(){
        ModelAndView mav = new ModelAndView("/response/hello").
            addObject("data", "hello!");
        return mav;
    }

    @RequestMapping("/response-view-v2")
    public String responseViewV2(Model model){

        model.addAttribute("data", "hello!");
        return "response/hello";
    }

    @RequestMapping("/response/hello")
    public void responseViewV3(Model model){
        model.addAttribute("data", "hello!!");
    }


}

1) String을 반환하는 경우 @ResponseBody가 없는 이상 논리 뷰의 이름으로 인식하고 뷰를 찾아 반환한다.

@ResponseBody가 있다면 HTTP 메세지 바디에 그대로 String을 입력한다.

 

2) HttpServletResponse, OutputStream 없이 void를 반환하는 경우 요청 URL을 참고해서 논리 뷰 이름으로 사용하는데, 명시성이 떨어지고 딱 맞는 경우도 없다. 쓰지 말자

 

HTTP 메세지

-> @ResponseBody, HttpEntity를 사용하면 뷰 템플릿을 사용하는 것이 아니라, HTTP 메세지 바디에 직접 응답 데이터 출력이 가능.