1. Response data를 만드는 방법 3가지
(1) 정적 리소스
- ex) 웹 브라우저에 정적인 HTML, css, js을 제공할 때는, 정적 리소스를 사용한다.
(2) 뷰 템플릿 사용
- ex) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다.
(3) HTTP 메시지 사용
- HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.
2. 정적 리소스
스프링 부트는 클래스 패스의 다음 디렉터리에 있는 정적 리소스를 제공한다.
정적 리소스 경로 : src/main/resources/static
EX)
다음 경로에 파일이 들어 있다면 : src/main/resources/static/basic/hello-form.html
웹 브라우저에서 다음과 같이 실행하면 된다 : http://localhost:8080/basic/hello-form.html
3. 뷰 템플릿
뷰 템플릿을 거쳐서 HTML을 동적으로 생성하고, 뷰가 응답을 만들어서 전달한다.
뷰 템플릿 경로 : src/main/resources/templates
(1) ModelAndView 반환
@RequestMapping("/response-view-v1")
public ModelAndView reponseViewV1() {
ModelAndView mav = new ModelAndView("response/hello").addObject("data", "hello!");
return mav;
}
- ModelAndView 객체에 View이름 : "response/hello", 데이터 : "data", "hello!"를 넣어서 반환한다.
- View의 이름을 가지고 ViewResolver가 실행되어서 View를 찾고, 렌더링 한다.
(2) String 반환
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("data", "hello!");
return "response/hello";
}
- @ResponseBody 어노테이션이 없으면 response/hello로 ViewResolver가 실행되어 뷰를 찾고, 렌더링 한다.
- 뷰의 논리 이름인 "response/hello"를 반환하면 다음 경로의 뷰 템플릿이 렌더링 된다.
- templates/resonse/hello.html
(3) Void 반환
@RequestMapping("/response/hello")
public void responseViewV3(Model model) {
model.addAttribute("data", "hello!!");
}
- @Controller를 사용하고, HttpServletResponse, OutPutStream(Writer) 같은 HTTP 메시지 바디를 처리하는 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용
- 요청 URL : /response/hello
- 실행 : templates/response/hello.html
- 이 방식은 명시성이 너무 떨어지고 이렇게 딱 맞는 경우도 많이 없어서, 권장하지 않는다.
4. HTTP API
HTTP API를 제공하는 경우에는 HTML이 아니라 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.
(1) String - ResponseEntity 반환
/**
* HttpEntity, ResponseEntity(Http Status 추가)
* @return
*/
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() {
return new ResponseEntity<>("ok", HttpStatus.OK);
}
- ResponseEntity는 HttpEntity를 상속받는다.
- HttpEntity는 HTTP Message의 헤더, 바디 정보를 가지고 있다.
- ResponseEntity는 HTTP 응답 코드 설정 기능을 추가해서 가지고 있다.
(2) String - @ResponseBody
@ResponseBody
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
return "ok";
}
- @ResponseBody를 사용하면 view를 사용하지 않고, HTTP 메시지 컨버터를 통해서 HTTP 메시지를 직접 입력할 수 있다.
(3) JSON - ResponseEntity 반환
@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);
}
- ResponseEntity를 반환한다. HTTP 메시지 컨버터를 통해서 JSON 형식으로 변환되어서 반환된다.
(4) JSON - @ResponseBody
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return helloData;
}
- @ResponseBody를 사용할 경우 HTTP 응답 코드를 설정하기 위해 @ResponseStatus 어노테이션을 사용해야 한다.
- 객체를 반환하면 HTTP 메시지 컨버터를 통해 SJON 형식으로 변환되어서 반환된다.
@ResponseStatus 어노테이션을 사용하면 응답 코드를 동적으로 변경할 수는 없다.
프로그램 조건에 따라서 동적으로 변경하려면 ResponseEntity를 사용하면 된다.
@RestController = @Controller + @ResponseBody
@Controller 대신에 @RestController 어노테이션을 사용하면, 해당 컨트롤러에 모두 @ResponseBody가 적용되는 효과가 있다.
따라서 view 템플릿을 사용하는 것이 아니라, HTTP 메시지 바디에 직접 데이터를 입력한다. 이름 그대로 Rest API(HTTP API)를 만들 때 사용하는 컨트롤러이다.
반응형
'Spring(JAVA Framework) > Spring MVC' 카테고리의 다른 글
Thymeleaf 사용법 (0) | 2021.09.19 |
---|---|
HTTP Message Converter (0) | 2021.09.18 |
HTTP Request - (2) (feat. Request Message Body) (0) | 2021.09.17 |
HTTP Request - (1) (feat. Request Parameter) (0) | 2021.09.16 |
@RequestMapping (0) | 2021.09.15 |
댓글