개발이군고구마

데이터는 어떻게 주고 받을까? - 2. 데이터 매핑과 응답 본문

SERVER/Spring

데이터는 어떻게 주고 받을까? - 2. 데이터 매핑과 응답

김구황 2024. 9. 15. 15:24
728x90

1. 타킷 컨트롤러 찾기 

MVC 패턴으로 작동하며, viewResolver 부분은 controller/ restconrtoller의 차이에 따라 다르게 작동됨 

 

1) HandlerMapping

  • 타킷 컨트롤러를 찾는 부분 
  • 스프링 빈의 이름으로 핸들러 찾음 @RequestMapping 
  • URL -> 빈 순서대로 찾음 

 

2) HandlerAdapter 

  • 핸들러를 실행 

 

 

2. 가져온 데이터를 매개변수와 매핑 시키기 

1) requestParam

  • request 객체안, 쿼리 스트링으로 전달된 요청 파라미터를 받을 때 쓰임 
  • String, Int, Integer 등 단순 타입이면 @ReqeustParam 생략이 가능함
  • 요청 파라미터의 key 값과 일치하는 매개변수 값을 찾아서 그때의 value 값이 매핑됨 

 

2) modelAttribute

  • @ModelAttribute가 붙은 매개변수에서 요청 파라미터 key값에 해당하는 프로퍼티를 찾음 
  • 해당 프로퍼티 값의 setter를 호출해서  요청 파라미터의 value 값이 바인딩 됨 
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
    helloData.getAge());
    return "ok";
}

>> 매핑될 객첼 정의 
class HelloData {
	>> 매핑될 필드(프로퍼티) 정의 (요쳥 파라미터의 값이 매핑됨) 
    private String username;
    private int age;
    
    getUsername();
    setUsername();
}

 

 

 

3) RequestBody : 메세지 컨버터 

  • 메세지 바디에서 직접 데이터(JSON, String) 가 넘어오는 경우엔 param으로 값을 담아올 수 없음 
  • 문자로 된 JSON/String (messageBody) 를 HTTP 메세지 컨버터 를 사용해 "자바 객체" 로 변환 
    •  서버로 값을 넘길 때, content-type이 "application/json"인지 확인, 그렇게 될때 메세지 컨버터가 작동함 
    • @RequestBody는 생략할 수 없는데, 생략이 되면 ModelAttribute로 실행됨 
  • 메세지 컨버터의 종류 (RequestBody 뒤에 오는 매개변수의 타입을 확인한 후 -> 이에 해당하는 컨버터 작동) 
    • ByteArrayHttpMessageConverter
    • StringHttpMessageConverter
    • MappingJackson2HttpMessageConverter
  • . 전달받은 값을 controller가 원하는 타입으로 변환 :  ArgumentResolver 
    • 다양한 파라미터를 유연하게 처리할 수 있도록 도와줌
    • [RequestBody를 중심으로 메세지 컨버터 작동 방법]
      • HTTP 요청 들어옴
      • ArgumentResolver가 컨트롤러의 매개변수의 타입을 확인한 후
      • 메세지 컨버터를 사용하여 그에 맞는 자바 객체를 생성하여, 파라미터로넘겨줌 

 

4) 요청 파라미터 VS 메세지 컨버터 차이 

  • 요청 파라미터는 넘어온 값이 매개변수의 객체와 "매핑" 되는 개념임
    • 매개변수 = 전달받은 데이터들이 바인딩 될 껍데기 
  • 메세지 컨버터는 받아온 데이터를 매개변수의 형태의 "자바객체"로 만들어 매개변수로 넘기는 방식
    • 매개변수 = 전달받은 데이터들이 어떤 타입을 가져야하는지에 대한 가이드 라인

 

 

3. 응답 

1) controller - viewResolver (SSR)

  • constroller의 반환 값이 핸들러 어뎁터를 거쳐 논리 뷰의 이름으로 다시 dispatcherSerlvet으로 들어가면
  • viewResolver 를 호출(application.properties에서 설정으로 등록) : View 객체를 찾는 역할 
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
  •  설정에서 지정한 경로가 정확하게 들어간 jsp 파일을 담아 InternalResourceView 를 반환하게 됨  
return new ModelAndView("/WEB-INF/views/new-form.jsp");
  • Model객체 + jsp를 가지고 =>  View 를 호출
    • Japser는 jsp 파일에 있는 코드들을 java 코드로 변환하고 model에서 넘어온 데이터들을 담음 (이건 언제 이루어짐? view 단계?) 
    • 자바 코드를 렌더링하여 응답 결과(HTML) 를 만듦 => 이후는 브라우저 렌더링 과정

https://kotlinworld.com/326



1-2) Model 객체 

  • Controller에서 생성된 데이터를 담아 View 로 전달할 때 사용하는 객체

 

1-3) Tiles 

  • url에 해당하는 논리뷰에 대한 결과 값 외에, xml에서 지정한 tiles에 지정된 jsp 파일을 호출할 수 있음 
  • 순서를 지정할 수 있음 
  • 헤더와 푸터 등 공통 페이지를 구성할 때 쓰이며, 요청에 대한 값, Model 값으로 controller에서 전달한 값을 받아서 사용할 수 있음 

viewResolver와 tiles의 순서는? 

controller에서 논리뷰를 dispatcherServlet으로 보낸 후, 그 다음 실행되는 건지? 

그 실행 순서는 어떻게 지정되어있는지? 

 

 

2) restcontroller - messageConverter (CSR)

  • @ResponseBody가 없으면, 뷰 리졸버가 실행되어 뷰를 찾고 렌더링함 (서버사이드렌더링)
    • 반환타입에 resolverName 없이 Model 만 넘기는 경우엔 Model을 json 헝태로 변환하여 반환함 
  • @ResponseBody가 있는 경우 결과 값은 ResponseEntity 로 반환되므로,  HTTP 메세지 바디에 직접 데이터가 담겨서 전달됨 
  • [ResponsetBody를 중심으로 메세지 컨버터 작동 방법]
    • HttpEntity로 값이 반환되면 
    • 클라이언트의 HTTP Accept 헤더 와 컨트롤러의 서버의 반환타입 정보를 조합하여 MessageConverter가 선택됨
      • 클라이언트에서는 dataType으로 응답값을 정할 수 있음
      • 서버에서는 produce를 사용하여 반환타입 정보를 정할 수 있음 
    • ReturnValueHandler 가 메세지 컨버터를 호출해서 원하는 타입의 값을 만든 후
    • 그 값을 HTTP 응답 메세지 바디에 담음 
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() {
    return new ResponseEntity<>("ok", HttpStatus.OK);
}

 

  • cf. React를 사용하는 경우엔, 서버에서는 API 통신을 통해 데이터만 넘기고, JS(JSX)를 통해서 받아온 데이터를 HTML에 담아주게 됨