@RestController VS @Controller
@Controller: 반환 값이 String이면 뷰 이름으로 인식. 그래서 뷰를 찾고 뷰를 렌더링한다.(뷰를 반환) 하지만 @ResponseBody를 같이 사용하면 데이터 전달 가능!
@RestController : 반환 값으로 뷰를 찾지 않고, HTTP 메세지 바디에 바로 입력(주로 JSON전달을 위해 사용한다.) ResponseBody가 붙은 @Controller
@Controller는 아래와 같은 실행순서를 가진다.
@ResponseBody 가 붙은 @Controller
Controller (ResponseBody)
@RestController
HTTP 요청 데이터 조회
HTTP 요청 메시지를 통해 클라이언트 TO 서버로 데이터를 전달하는 방법은 3가지가 있다.
1. GET 쿼리 파라미터
2. POST - HTML Form
3. HTTP message Body(JSON)
요것들을 받는 방법에도 여러가지가 있는데,
우선
1. GET쿼리 파라미터
2. POST -HTML Form 요 두개를 받는 방법을 알아보자.
1. HttpServletRequest
요 방법은 GET쿼리 파라미터, POST-HTML Form모두를 받을 수 있다.
request.getParameter("변수명") -> 요렇게 받을 수 있음.
(현재 @RequestMapping으로 되어있으므로 GET, POST 둘다 받기 가능)
2. @RequestParam
@RequestParam 타입 변수명
@RequestParam은 디폴트 값도 지정할 수 있다.
@RequestParam은 생략도 가능하다!(권장하는 방법은 아니다.)
@RequestParam은 Map과 같이 사용하면 모든 요청 파라미터를 받을 수 있따.
3. @ModelAttribute
@ModelAttribute는 요청값을 객체로 아주 화끈하게 바꿀 수 있게 해준다.
@RequestParam도 좋은 방법이지만 @RequestParam으로 요청 데이터를 받고 자바 객체로 변환시키는 과정은 아래와 같다.
@ModelAttribute의 화끈한 코드를 보자.
코드가 확연히 짧아진다. 객체를 파라미터에 넣어버린다.
심지어 @ModelAttribute를 생략할 수도 있다!
근데 @RequestParam도 생략할 수 있고,
@ModelAttribute도 생략할 수 있다.
그렇다면 생략할 때 도대체 스프링이 어떻게 뭔지 알 수 있을까?
파라미터에 String , int, Integer같은 단순 타입이 들어있으면 스프링이 @RequestParam을 추가해주고
파라미터에 그 외의 타입(argument resolver로 지정한 타입 외에는) @ModelAttribute를 추가해준다.
4. @PathVariable(GET 쿼리파라미터만 해당)
GET쿼리 파라미터 값을 가져올 때 최고의 방법이다.
GET쿼리 파라미터, POST -HTML Form를 받는 법을 알아보았는데,
HTTP message Body(JSON)
는 GET쿼리 파라미터, POST -HTML Form와 다르게
@RequestParam
@ModelAttribute 를 사용하여 받을 수 없다...
HTTP message Body(JSON) 를 받는 방법 4가지
1. InputStream
딱 봐도 이 방법은 아니다 싶다.
2. HttpEntity
많이 사용하기도하고 편리한 방법이다.
HttpEntity: Http의 헤더, 바디 정보를 편리하게 조회가능하다. 또한 응답에도 사용가능하다!
HttpEntity를 상속한 RequestEntity와 ResponseEntity도 같은 기능을 제공한다.
3. @RequestBody (제일 많이 쓰는 방법)
@RequestBody를 사용하면 HTTP 바디 메시지를 편리하게 조회할 수 있다.
1. 바디 정보만 조회할 수 있으므로 헤더 정보를 조회하려면 HttpEntity를 쓰면 된다.
2. (@ResposneBody는 응답의 @RequestBody버전으로, 응답결과를 HTTP메시지 바디에 직접 담아 전달한다.)
지금까지 배운 내용들을 토대로
JSON으로 날라온 데이터를 자바 객체로 변환시키는 법을 알아보자
1. HttpServletRequset, ObjectMapper사용하여 객체 만들기
HttpServlet으로 직접 HTTP바디에서 메시지를 읽고(31라인), 문자로 변환한다.(32라인)
현재 문자인 JSON데이터를 ObjectMapper를 사용하여 객체로 바꾼다.(35라인)
2. @RequestBody 사용하기
@RequestBody를 사용하여 http요청 메시지의 바디를 파라미터에서 문자로 바로 받고(43라인),
현재 문자인 JSON데이터를 ObjectMapper를 사용하여 객체로 바꾼다.(46라인)
1번 방법보다 한단계가 줄어들었다.
3. 파라미터에 @RequestBody와 객체 넣기 (파라미터에서 객체로 바로 매핑하는 방법)
@RequestBody에 직접 만든 객체를지정할 수 있다.
HttpEntity나, @RequestBody를 사용하면 HTTP메시지 컨버터가 HTTP메시지의 바디의 내용(문자, JSON)을 우리가 원하는 문자나 객체로 변환시켜준다.
(위의 경우 @RequestBody를 생략하면 스프링이 @ModelAttribute를 넣어 버리기 때문에 생략할 수 없다.)
주의 : 요청시 content-type이 application/json이 맞는지 꼭 확인해야한다, 그래야 JSON을 처리하는 HTTP메시지 컨버터가 작동한다.
+ 추가: @ResponseBody - 응답의 경우 @ResponseBody를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어 줄 수 있다. 물론 이 경우에도 HttpEntity를 사용할 수 있다.
@RequestBody요청:
JSON -> HTTP메시지 컨버터 ->객체
@ResponseBody응답:
객체 -> HTTP메시지 컨버터 -> JSON
4. HttpEntity 사용하기
HttpEntity를 사용하여 요청을 받는 방법이다. HttpEntity<타입>을 해주면 해당 타입에 맞추어 HTTP 메시지 컨버터 매핑을 해서 객체를 만들어준다.
HTTP 응답 메시지
HTTP메시지를 통해 서버 TO 클라이언트로 가는 3가지의 응답이 있다!
1. 정적 리소스 (HTML, CSS, JS)
2. 뷰 템플릿 (타임리프)
3. HTTP 메시지 사용(바디에 JSON)
1. 정적 리소스 (HTML, CSS, JS)
2. 뷰 템플릿 (타임리프)mo를
를 보내는 법부터 알아보자
정적 리소스나 뷰 템플릿처럼 뷰를 반환하기 위해서는 클래스 레벨에 @Controller를 해줘야한다. (맨 위에 설명있음)
그런데 이 정적 리소스와 뷰 템플릿을 보내는 방법은 두가지 방법으로 나뉜다.
1. ModelAndView에 뷰 정보와 model을 직접 담는 방법
2. 뷰의 논리이름을 String으로 반환하고, model에 값을 넣는 방법
( 3. 권장하진 않지만 반환을 하지 않고, 뷰의 경로와 url매핑을 맞추는 방법 )
1. ModelAndView에 뷰 정보와 model을 직접 담는 방법
2. 뷰의 논리이름을 String으로 반환하고, model에 값을 넣는 방법
( 3. 권장하진 않지만 반환을 하지 않고, 뷰의 경로와 url매핑을 맞추는 방법 )
이때 뷰리졸버를 실행시키기 위해서는 @ResponseBody를 넣으면 !안된다!
@ResponseBody가 있으면 뷰 리졸버를 실행하지 않고 HTTP메시지 바디에 문자를 넣어 그대로 반환한다.
3. HTTP 응답 메시지 (바디에 JSON)
1.ResponseEntity 객체를 반환하는 방법과 2.객체를 직접 반환하는 방법이 있다!
1.ResponseEntity 객체를 반환
2.객체를 직접 반환하는 방법
ResponseEntity를 반환하는 방법 외에는 @ResponseBody가 있어야 한다!(또는 @RestController)
아래는 추가로 JSON이 아니라 일반 텍스트를 반환하는 경우임
스프링 흐름
'Spring > spring mvc' 카테고리의 다른 글
컨트롤러 향상시키기 (0) | 2021.06.30 |
---|---|
HTTP 메시지 컨버터, 요청 매핑 핸들러 어댑터 구조 (0) | 2021.06.29 |
HTTP 응답 메시지 - 정적 리소스, 뷰 템플릿(동적), HTTP 메시지 바디에 직접 입력 (0) | 2021.06.28 |
HTTP 요청 메시지 -단순 텍스트, JSON (0) | 2021.06.28 |
HTTP 요청 파라미터 - 쿼리 파라미터, HTML FORM + @RequestParam, @ModelAttribute (0) | 2021.06.28 |