티스토리 뷰
HTTP 요청 - 쿼리 파라미터, HTML FORM, HTTP 메시지 사용/META-INF/resources
1. GET - 쿼리 파라미터 /url?username=hello&age=20
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
- 예) 검색, 필터, 페이징등에서 많이 사용하는 방식
2. POST - HTML Form content-type: application/x-www-form-urlencoded
- 메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
- 예) 회원 가입, 상품 주문, HTML Form 사용
3. HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT 데이터 형식은 주로 JSON 사용
- POST, PUT, PATCH
HTTP 요청 파라미터 - @ModelAttribute
스프링 MVC는 @ModelAttribute가 있으면
해당 객체를 생성하고, 요청 파라미터 이름으로 HelloData 객체의 프로퍼티를 찾는다.
이후 해당 프로퍼티의 setter를 호출하여 파라미터의 값을 바인딩한다.
프로퍼티 -> 객체에 getter와 setter가 있을 경우 프로퍼티가 있다고 함. 변경하면 set이, 조회하면 get이 호출
HTTP 요청 메시지 - 단순 텍스트
요청 파라미터가 아닌 메세지 바디로 오는 데이터는 @RequestParam, @ModelAttribute를 사용할 수 없다.
1. InputStream
메세지 바디의 내용을 inputStream으로 추출하여 사용할 수 있다.
2. HttpEntity<>
HTTP header, body 정보를 편리하게 조회, 메시지 바디 정보를 직접 조회한다.
응답에서도 사용 가능하다.
이 경우 view를 조회하지 않고 바로 메세지 바디에 담아 전달한다.
3. @RequestBody
@RequestBody를 통해 쉽게 메세지 바디를 읽어올 수 있다.
Header 정보가 필요하다면 @RequestHeader나 HttpEntity<>를 사용하자
@ResponsBody를 사용하면 메세지 바디에 응답 결과를 보낼 수 있다. 마찬가지로 view를 조회하지 않음
요청 파라미터 vs HTTP 메시지 바디 요청
- 파라미터를 조회하는 기능: @RequestParam , @ModelAttribute
- HTTP 메시지 바디를 직접 조회하는 기능: @RequestBody
HTTP 요청 메시지 - JSON
요청 메세지로 JSON이 온다면 inputStream으로 메세지 바디를 읽고, 이를 objectMapper로 객체 형식으로 변환해야 한다.
이는 @RequestBody 와 기존에 있는 클래스 객체로 변환할 수 있으며 훨 간편해진다.
HTTP 응답 - 정적 리소스, 뷰 템플릿, HTTP 메시지 사용
1. 정적 리소스 - 정적인 html, css, js를 제공할 때 사용
스프링 부트는 클래스 패스의 /static, /public, /resources, /META-INF/resources 디렉토리의 정적 리소스를 제공
정적 리소스 경로 : src/main/resources/static
2. 뷰 템플릿 - 동적인 html을 제공할 때 사용
뷰 템플릿을 거쳐 HTML이 생성되고, 뷰가 응답을 만들어서 전달한다.
뷰 템플릿 경로 : src/main/resources/templates
@ResponseBody가 없으므로 반환값으로 뷰 리졸버를 실행해 뷰를 찾고 렌더링한다.
+)Thymeleaf
위 return 값은 response/hello 인데 실제 뷰 템플릿의 위치는 src/main/resources/templates/response/hello.html이다
이는 Thymelead의 기본 설정 값 덕분이다.
- spring.thymeleaf.prefix=classpath:/templates/
- spring.thymeleaf.suffix=.html
3. HTTP 메세지 - HTTP API를 제공하는 경우 데이터를 전달해야 하므로, HTTP 메세지 바디에 JSON 같은 형식의 데이터 제공
+) 클래스 레벨에 @Controller와 @ResponseBody를 합친 것이 @RestController
+) Rest API의 Rest다.
HTTP 메세지 컨버터
뷰 템플릿으로 HTML을 생성하여 응답하는 것이 아닌
HTTP API처럼 JSON 데이터를 HTTP 메세지 바디에서 읽거나 쓰는 경우 HTTP 메세지 컨버터를 사용하자
- viewResolver 대신에 HttpMessageConverter 가 동작
- 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
스프링 MVC에서 HTTP 메세지 컨버터를 사용하는 기준
- HTTP 요청: @RequestBody , HttpEntity(RequestEntity)
- HTTP 응답: @ResponseBody , HttpEntity(ResponseEntity)
주요 컨버터 종류
- ByteArrayHttpMassageConverter - byte[] 데이터를 처리, 미디어 타입은 모두 가능
- StringHttpMessageConverter - String 데이터 처리, 미디어 타입은 모두 가능
- MappingJackson2HttpMessageConverter - JSON데이터 처리, 미디어 타입은 application/json
요청 매핑 핸들러 어댑터 구조
이전까지 작성했던 핸들러를 실행할 때 파라미터 값을 매칭시켜줘야 하는데, 이를 누가 처리해주는가?
-> Argument Resolver 가 처리해준다. 이 Resolver가 핸들러가 필요한 파라미터를 준비하고,
-> 핸들러 어댑터가 핸들러를 호출하면, 그때 준비한 파라미터를 전달하여 실행한다.
ReturnValueHandler
-> ModelAndView와 같은 반환 값을 변환해준다. -> ViewResolver가 처리할 수 있게
본 포스팅은 인프런 강의 김영한님의
[ 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 ] 을 수강하며 작성한 내용입니다.