스프링서버에서 응답 데이터를 만드는 방법은 크게 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 |