Spring/Spring MVC

Spring MVC - 응답 메시지를 만드는 방법 (정적 리소스, 뷰 템플릿, HTTP API 메시지 바디에 직접 입력)

jddng 2022. 1. 29. 23:04
728x90
반응형

 

 

응답 메시지를 만드는 방법

  • 정적 리소스
    - 정적 HTML, CSS, javascript를 제공
  • 뷰 템플릿
    - 동적 HTML을 제공(뷰 템플릿을 사용한다)
  • HTTP API, 메시지 바디에 직접 입력
    - HTTP API를 제공하는 경우 HTML이 아니라 데이터를 전달해야 하므로
      HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.

 

 

정적 리소스

 

  • 스프링 부트는 클래스 패스의 아래와 같은 디렉터리 안에 있는 정적 리소스를 제공한다.
    /static, /public, /resources, /META-INF/resources
  • str/main/resources는 리소스를 보관하는 곳이고, 또한 클래스패스의 시작 경로이다.
    따라서 다음 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공한다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    hello Sprring MVC
</body>
</html>

hellospringmvc.html 리소스 경로
/hellospringmvc.html URL 요청

 

 클라이언트가 정적 리소스인 hellospringmvc.html을 요청하면 스프링 부트가 내장 톰캣을 통하여 자동으로 정적 리소스를 찾아 응답 메시지를 보내준다. str/main/resources는 클래스패스의 시작 경로이기 때문에 요청 URL은 localhost:8080/hellospringmvc.html 이 된다.


 

 

뷰 템플릿

 

  • 뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어 전달
  • 일반적으로 동적 HTML을 요청 메시지로 보내기 위해 사용
  • 스프링 부트는 기본 뷰 템플릿 경로를 제공
         spring.thymeleaf.prefix=classpath:/templates/
         spring.thymeleaf.suffix=.html
  • Controller를 통한 Mapping이 되어야 한다.
  • ModelAndView, Model을 이용

 

뷰 템플릿 생성

<!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>

뷰 템플릿 경로


 

ModelAndView을 이용한 동적 HTML 응답 메시지 처리

 

  • ModelAndView 객체에 동적 HTML 경로를 설정
  • ModelAndView 타입을 리턴하여 해당 경로에 있는 동적 HTML을 응답 메시지로 보낸다.

 

@Controller
public class ResponseViewController {

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

응답 결과


 

 

Model을 이용한 동적 HTML 응답 메시지 처리

 

  • String을 반환하면 뷰 리졸버가 실행되어 해당 동적 HTML을 찾아 응답 메시지로 보낸다.

 

@Controller
public class ResponseViewController {

    @RequestMapping("/response-view-v2")
    public String responseViewV2(Model model) {
    
        model.addAttribute("data", "Model hello!!");
        
        return "response/hello";
    }
}

응답 결과


 

 

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

 HTTP API를 제공하는 경우에는 HTML이 아닌 데이터를 전달하기 때문에 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어서 보낸다.

 

  • HttpServletResponse 이용 - String
  • ResponseEntity<String> 이용 - String
  • @Responsebody 이용 - String
  • ResponseEntity<T> 이용 - JSON
  • @Responsebody 이용 - JSON

 

HttpServletResponse 이용 - String

 

  • HttpServletResponse 객체를 이용하여 HTTP 메시지 바디에 데이터를 실어서 보낸다.

 

@Slf4j
@Controller
public class ResponseBodyController {

    @GetMapping("/response-body-string-v1")
    public void responseBodyV1(HttpServletResponse response) throws IOException {
        response.getWriter().write("ok");
    }

}

응답 결과


 

 

ResponseEntity<String> 이용 - String

 

  • HttpEntity를 상속받은 ResponseEntity는 HTTP 메시지의 헤더, 바디의 정보를 조회할 수 있으며
    HTTP 응답 코드를 설정할 수 있다.
  • HTTP 메시지 컨버터를 통해 HTTP 메시지 바디에 데이터를 실어서 보낸다

 

@Slf4j
@Controller
public class ResponseBodyController {

    @GetMapping("/response-body-string-v2")
    public ResponseEntity<String> responseBodyV2() {
        return new ResponseEntity<>("ok", HttpStatus.OK);
    }
}

응답 결과


 

 

@Responsebody 이용 - String

 

  • HTTP 메시지 컨버터를 통해 HTTP 메시지 바디에 데이터를 실어서 보낸다

 

@Slf4j
@Controller
//@RestController
public class ResponseBodyController {

    @ResponseBody
    @GetMapping("/response-body-string-v3")
    public String responseBodyV3() {
    
        return "@ResponseBody ok";
    }

}

응답 결과


 

 

ResponseEntity<T> 이용 - JSON

 

  • HTTP 메시지 컨버터를 통해 ResponseEntity를 JSON 형식으로 응답 메시지 바디에 실어서 보낸다.

 

@Slf4j
@Controller
public class ResponseBodyController {

    @GetMapping("/response-body-json-v1")
    public ResponseEntity<UserData> responseBodyJsonV1() {
        UserData userData = new UserData();
        userData.setUsername("userA");
        userData.setAge(20);
        return new ResponseEntity<>(userData, HttpStatus.OK);
    }
}

응답 결과


 

 

@Responsebody 이용 - JSON

 

  • HTTP 메시지 컨버터를 통해 해당 객체를 JSON 형식으로 응답 메시지 바디에 실어서 보낸다.
  • @ResponseStatus 애노테이션을 통해 응답 코드 설정 가능

 

@Slf4j
@Controller
public class ResponseBodyController {

    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @GetMapping("/response-body-json-v2")
    public UserData responseBodyJsonV2() {
        UserData userData = new UserData();
        userData.setUsername("userA");
        userData.setAge(20);
        return userData;
    }
}

응답 결과

 

 

 

참고
@RestController는 ( @Controller + @ResponseBody ) 와 같다.

 

 

 

 

728x90
반응형