Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 로그백
- 이벤트핸들러this
- OOP
- index
- MVC
- 디스크i/o
- Ajax
- 공통규약
- 사면초가
- 공통기술
- 클린아키텍처
- JPA
- 설정세팅
- springsecurity
- JDBC
- model
- AOP
- 이벤트핸들러등록
- 단위테스트
- 전전긍긍
- 문제선택근거
- TDD
- 커뮤니티서버
- DDD
- 냄새라도
- MVC요청플로우
- Transaction
- SpringLegacy
- string
- SEQUENCE
Archives
- Today
- Total
개발이군고구마
데이터는 어떻게 주고 받을까? - 2. 데이터 매핑과 응답 본문
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) 를 만듦 => 이후는 브라우저 렌더링 과정

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에 담아주게 됨
'SERVER > Spring' 카테고리의 다른 글
| [Spring : Design Pattern] 1. Template Method (Abstract Class) (0) | 2024.10.02 |
|---|---|
| Thread와 ThreadLocal (0) | 2024.10.02 |
| 데이터는 어떻게 주고 받을까? - 1. 데이터 전달하기 (0) | 2024.09.15 |
| DB connection 변화의 역사 (1) | 2024.09.09 |
| Spring Security의 로직 (0) | 2024.08.16 |