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을 요청하면 스프링 부트가 내장 톰캣을 통하여 자동으로 정적 리소스를 찾아 응답 메시지를 보내준다. 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
반응형