스프링MVC

HTTP 응답 - 정적 리소스, 뷰 템플릿

salmon16 2023. 8. 23. 17:13

스프링서버에서 응답 데이터를 만드는 방법은 크게 3가지가 있다.

  • 정적 리소스
    • 웹 브라우저에 정적인 HTML, css, js를 제공할 때 정적 리소스를 사용한다
  • 뷰 템플릿
    • 웹 브라우저에 동적인 HTML을 제공할 때 뷰 템플릿을 사용한다
  • HTTP 메시지 사용
    • HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.

정적 리소스

스프링 부트는 클래스패스의 다음 디렉터리에 있는 정적 리소스를 제공한다.

/static, /public, /resources, /META_INF/resources

 

src/main/resources는 리소스를 보관하는 곳이다

 

예를 들어 src/main/resources/static/hello.html 이란 경로에 파일이 있으면

htttp://localhost:8080/basic/hello.html을 실행하면 hello.html 정적 리소스를 제공해 준다.

뷰 템플릿

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

 

뷰 템플릿의 경로는 

src/main/resources/templates이다

src/main/resources/templates/hello.html을 생성해 보자

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p th:text="${data}">empty</p>
</body>
</html>

Thymeleaf를 사용하였다.

 

ResponseViewController

@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!!");
    }
}

3가지 버전이 있다.

첫 번째는 ModelAndView를 사용해서 ModelAndView를 리턴

 

두 번째는 Model을 사용해서 값을 넣어주고 string을 리턴한다 이때 @ResponseBody 애노테이션이 없으면 reslonse/hello로 뷰 리졸버가 실행되어서 뷰를 찾고 렌더링 한다.

 

세 번째는 void를 반환했다 @Controller를 사용하고 HTTP메시지 바디를 처리하는 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용한다 이 방식은 명시성이 너무 떨어져서 권장하지 않는다.

HTTP 응답 - HTTP API, 메시지 바디에 직접 입력

HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보내는 방법을 알아보자


@Slf4j
@Controller
//@RestController
public class ResponseBodyController {
    @GetMapping("/response-body-string-v1")
    public void responseBodyV1(HttpServletResponse response) throws IOException
    {
        response.getWriter().write("ok");
    }
    /**
     * HttpEntity, ResponseEntity(Http Status 추가)
     * @return
     */
    @GetMapping("/response-body-string-v2")
    public ResponseEntity<String> responseBodyV2() {
        return new ResponseEntity<>("ok", HttpStatus.OK);
    }
    @ResponseBody
    @GetMapping("/response-body-string-v3")
    public String responseBodyV3() {
        return "ok";
    }
    @GetMapping("/response-body-json-v1")
    public ResponseEntity<HelloData> responseBodyJsonV1() {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);
        return new ResponseEntity<>(helloData, HttpStatus.OK);
    }
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @GetMapping("/response-body-json-v2")
    public HelloData responseBodyJsonV2() {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);
        return helloData;
    }
}

string - V1 방식은 HttpServletResponse 객체를 통해 HTTP 메시지 바디에 직접 ok응답 메시지를 전달한다.

 

string -V2 방식은 ResponseEntity는 HttpEntity를 상속받는데 이는 HTTP 메시지의 헤더, 바디 정보를 가지고 있다 여기서 응답 코드를 설정했다.

 

string-V3 방식은 @rResponseBody애노테이션을 사용해서 HTTP메시지 컨버터를 통해서 HTTP메시지에 직접 입력했다.

 

json-V1방식은 ResponseEntity를 사용해서 HTTP메시지 컨버터를 통해서 JSON형식으로 변환돼서 반환된다.

 

json-V2방식은 @ResponseBody애노테이션을 통해 바로 객체를 리턴했다. 이때 응답 코드를 설정하기 위해서 @ResponseStatus(HttpStatus.OK)로 응답 코드를 설정했다.

 

@RestController 애노테이션은 @Controller + @ResponseBody 애노테이션 적용 효과를 한 번에 적용할 수 있다.

 

출처 : 스프링MVC 1편 - 백엔드 웹 개발 핵심 기술 김영한

'스프링MVC' 카테고리의 다른 글

HTTP 메시지 컨버터  (0) 2023.08.23
HTTP 요청 -기본, 헤더, 데이터 조회  (0) 2023.08.22
스프링 MVC 기본 기능  (0) 2023.08.21
로깅 간단하게 알아보기  (0) 2023.08.18
스프링 MVC 시작하기  (0) 2023.08.10