- 해당 게시물은 인프런 - "스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술" 강의를 참고하여 작성한 글 입니다.
- 유료강의이므로 자세한 내용은 없고, 간단한 설명 위주로 정리했습니다.
강의 링크 -> 김영한 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(유료강의)
HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT
- 데이터 형식은 주로 JSON 사용
- POST, PUT, PATCH
텍스트 메시지를 HTTP 메시지 바디에 담아서 전송하고, 읽을 것이다.
main/java/hello/springmvc/basic/reques/RequestBodyStringController
@RequestBody를 사용하여 HTTP 메시지 바디 정보를 편리하게 조회할 수 있고,
@ResponseBody를 사용하여 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달할 수 있다.
@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {
}
Postman을 사용하여 실행하면 정상적으로 동작되는 것을 볼 수 있다.
추가적으로 헤더 정보가 필요할 때엔 @RequestHeader 를 사용하면 된다.
HTTP API에서 주로 사용하는 JSON 데이터 형식을 조회할 것이다.
{"username":"hello", "age":20}
content-type: application/json
main/java/hello/springmvc/basic/request/RequestBodyJsonController
@RequestBody를 사용하면, HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가
원하는 문자나 객체 등으로 변환해준다.
그래서 JSON도 객체로 변환을 해주는데, 이때 content-type이 application/json인지 꼭 확인해야 한다.
즉, HTTP 메시지 바디로 받은 JSON을 HTTP 메시지 컨버터가 HelloData라는 객체로 변환을 해주는 것이다.
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData helloData) {
Postman으로 실행하면, 정상적으로 동작하는 것을 볼 수 있다.
추가적으로 응답을 할 때, 문자열이 아닌 객체를 HTTP 메시지 바디에 넣어줄 수 있다.
@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData data) {
...
return data;
}
- @RequestBody 요청
JSON 요청 -> HTTP 메시지 컨버터 -> 객체- @ResponseBody 응답
객체 -> HTTP 메시지 컨버터 -> JSON 응답
정적 리소스
웹 브라우저에 정적인 HTML, css, js를 제공할 때뷰 템플릿
웹 브라우저에 동적인 HTML을 제공할 때HTTP 메시지 사용
HTTP API를 제공할 때, HTTP 메시지 바디에 JSON 같은 형식
src/main/resources
의
/static, /public, /resources, /META-INF/resources 디렉토리에서 정적 리소스를 제공한다.
그래서 src/main/resources/static/basic/hello-form.html
경로에 파일이 있으면
http://localhost:8080/basic/hello-form.html 이대로 웹 브라우저가 실행된다.
뷰 템플릿 경로 src/main/resources/templates
뷰 템플릿은 일반적으로 HTML을 동적으로 생성하는 용도로 사용하지만, 다른 것들도 가능하다.
src/main/resources/templates/response/hello.html
뷰 템플릿을 생성한다.
...
<body>
<p th:text="${data}">empty</p>
</body>
...
main/java/hello/springmvc/basic/response/ResponseViewController
뷰 템플릿을 호출하는 컨트롤러를 생성한다.
그러면 response/hello 로 뷰 리졸버가 실행돼 뷰를 찾고, 해당 경로의 뷰 템플릿이 렌더링 된다.
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("data", "hello!!");
return "response/hello";
}
http://localhost:8080/response-view-v2 에 들어가면 정상적으로 실행되는 것을 볼 수 있다.
HTTP 메시지 사용
HTTP API를 제공할 때, HTTP 메시지 바디에 JSON 같은 형식
main/java/hello/springmvc/basic/response/ResponseBodyController
@Controller 대신 @RestController 애노테이션을 사용하면, 해당 컨트롤러에 모두 @ResponseBody 가 적용된다.
@RestController
public class ResponseBodyController {
ResponseEntity는 HTTP 메시지의 헤더, 바디 정보를 가지고 있고, HTTP 응답 코드를 설정할 수 있다.
@RestController에 @ResponseBody가 있기 때문에, 바로 return 값으로 응답 메시지를 보낼 수 있다.
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() {
return new ResponseEntity<>("ok", HttpStatus.OK);
}
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
return "ok";
}
ResponseEntity 를 반환하며, HTTP 메시지 컨버터를 통해 JSON 형식으로 변환 후 반환한다.
@ResponseBody 를 사용해, HTTP 메시지 컨버터를 통해 JSON 형식으로 변환 후 반환하고,
@ResponseStatus 애노테이션을 사용해 HTTP 응답 코드를 설정할 수 있다.
@GetMapping("/response-body-json-v1")
public ResponseEntity<HelloData> responseBodyJsonV1() {
// 객체 생성하고, 객체에 username, age 넣는 코드
return new ResponseEntity<>(helloData, HttpStatus.OK);
}
@ResponseStatus(HttpStatus.OK)
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2() {
// 객체 생성하고, 객체에 username, age 넣는 코드
return helloData;
}
JSON 데이터를 HTTP 메시지 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용한다.
@ResponseBody
사용
- HTTP의 Body에 문자 내용을 직접 반환
HttpMessageConverter
가 동작- 기본 문자처리:
StringHttpMessageConverter
- 기본 객체처리:
MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러
HttpMessageConverter
가 기본으로 등록되어 있음
스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다.
@RequestBody
, HttpEntity(RequestEntity)
@ResponseBody
, HttpEntity(ResponseEntity)
스프링 부트는 다양한 HTTP 메시지 컨버터를 제공하여,
대상 클래스 타입과 미디어 타입 둘을 체크하여 사용여부를 결정한다.
ByteArrayHttpMessageConverter
: byte[] 데이터 처리
클래스 타입: byte[]
미디어타입:*/*
응답 ex) byte[] data 요청 ex) return byte[]; 쓰기 미디어 타입 `application/octet-stream`
StringHttpMessageConverter
: String 문자로 데이터 처리
클래스 타입: String
미디어타입:*/*
응답 ex) String data 요청 ex) return "ok"; 쓰기 미디어 타입 `text/plain`
MappingJackson2HttpMessageConverter
클래스 타입: 객체 or HashMap
미디어타입application/json
관련응답 ex) HelloData data 요청 ex) return helloData;
HTTP 메시지 컨버터가 스프링 MVC 어디쯤에서 사용되는 지 알아볼 것이다.
이는 @RequestMapping을 처리하는 핸들러 어댑터인
RequestMappingHandlerAdapter(요청 매핑 헨들러 어뎁터)에 있다.
RequestMappingHandlerAdapter(요청 매핑 헨들러 어뎁터) 의 구조는 아래 사진과 같다.
ArgumentResolver
컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체) 생성
제공하는 파라미터 종류: https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments
ReturnValueHandler
응답 값을 변환하고 처리
제공하는 응답 값 종류: https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-return-types
요청의 경우 ArgumentResolver가 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성한다.
응답의 경우 ReturnValueHandler가 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.
지금까지 김영한 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(유료강의) 강의를 참고하여 스프링 MVC - 기본 기능 2 에 대해 공부하였다.