본문 바로가기
MVC with 김영한

HTTP 요청과 응답

by wonseok99 2021. 10. 20.

<요청 파라미터>

GET에 쿼리 스트링이 오는 것, POST 방식으로 HTML Form 데이터 전송하는 방식
@RequestParam, @ModelAttribute을 사용한다.

<요청 메시지>

  • 단순 텍스트
    HTTP message body에 데이터를 직접 담아서 요청. 데이터 형식은 주로 JSON 사용
    요청 파라미터와 다르게 HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우는 @RequestParam, @ModelAttribute를 사용할 수 없으며, HttpEntity를 사용해서 데이터(message Body)를 직접 꺼내야 한다.
    (HttpEntity <T> httpEntity) 
    T messageBody = httpEntity

    @RequestBody를 통해서 위의 복잡한 과정 없이 한 번에 데이터(message Body)를 꺼낼 수 있다!
    (@RequestBody String messageBody)

    @ResponseBody를 통해서 응답 결과를 HTTP message Body에 직접 담아서 전달할 수 있다!
    (return "ok";)

  • JSON
    HttpEntity나 @RequestBody를 사용하면 HTTP 메시지 컨버터가 JSON의 내용을 우리가 원하는 문자나 객체 등으로 바꾸어준다.


    @ReuqestBody 요청 - (content-type : application/json)
    JSON  →  HTTP 메시지 컨버터  →  객체

    @ResponseBody 응답 - (Accept : application/json)
    객체  →  HTTP 메시지 컨버터   →  JSON

 

 

 

<응답 메시지>

스프링 서버에서 응답 데이터를 만드는 방법은 3가지가 있다.

        1. 정적 리소스
          스프링 부트는 클래스패스의 다음 디렉토리에 있는 정적 리소스를 제공한다.

          '/static', '/public', '/resources/', '/META-INF/resources/'

          'src/main/resources/' 하위 폴더에 리소스를 넣어두면 스프링 부트가 정적 리소스로 제공한다.


        2. 뷰 템플릿 (동적 HTML)
          뷰 템플릿을 거쳐 HTML이 생성되고 뷰가 응답을 만들어 전달한다. 스프링 부트는 기본 뷰 템플릿 경로를 제공한다.
          'src/main/resources/templates'

          1) ModelAndView를 반환
          public ModelAndView responseViewV1(){
                  ModelAndView mav = new ModelAndView("response/hello")
                                                                           .addObject("data", "hello!");
                  return mav;
          }

          2) Model을 통해 view를 반환
          public String responseViewV2(Model model){
                  model.addAttribute("data", "hello!");
                  return "response/hello";
          }

          반환 타입이 String일 경우에는 반환 값을 뷰 리졸버로 실행하여 뷰를 찾고 렌더링 한다.


          3) 동적 HTML 경로 자체를 매핑 (반환 Type은 void)
          @RequestMapping("/response/hello")
          public void responseViewV3(Model model){
                  model.addAttribute("data", "hello!");
          }

          반환 타입이 void일 경우에는 @Controller를 사용하며 메시지 바디를 처리하는 파라미터가 없다면, @ReqeustMapping을
          참고하여 논리 뷰 이름으로 사용한다.


        3. HTTP 메시지
          HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식(객체)으로 데이터를 실어 보낸다.



<HTTP 메시지 컨버터>

뷰 템플릿으로 HTML을 생성해서 응답하는 게 아니라, HTTP API 처럼 JOSN 데이터를 HTTP 메시지 바디에 직접 읽거나 쓰는 경우 HTTP 메시지 컨버를 사용하면 편리하다.

 

@RequestBody (HTTP 요청데이터 생성)

  1. HTTP 요청이 오고, 컨트롤러에서 @RequestBody, HttpEntity 파라미터를 사용한다.
  2. 메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해 canRead()를 호출
    2-1) @RequestBody의 대상 클래스 타입을 지원하는가!?
    2-2) Content-type 미디어 타입을 지원하는가!?
  3. canRead() 조건을 만족하면 read()를 호출해서 객체를 생성해서 반환한다.

@ResponseBody (HTTP 응답데이터 생성)

  1. 컨트롤러에서 @ResponseBody, HttpEntity 로 값이 반환된다
  2. 메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite()를 호출
    2-1) 대상 클래스 타입의 return 타입을 지원하는가!?

    2-2) Accept 미디어 타입을 지원하는가!?

  3. canWrite() 조건을 만족하면 write()를 호출해 HTTP 응답 메시지 바디에 데이터를 생성한다


※ 미디어 타입

요청의 경우 Content-type(application/json)  //  JSON 형식의 데이터를 보낸다
응답의 경우 HTTP Accept(text/html)  //  HTML 데이터를 해석할 수 있다



- 기본 문자처리 : StringHttpMessageConverter

   ex) return "ok";
- 기본 객체처리 : MappingJackson2HttpMessageConverter
   ex) return hellodata;

'MVC with 김영한' 카테고리의 다른 글

타임리프(thymeleaf)  (0) 2021.11.15
요청 매핑 핸들러 어뎁터  (0) 2021.10.22
로깅(logging)  (0) 2021.10.17
스프링 애노테이션  (0) 2021.10.16
스프링 MVC  (0) 2021.10.15