2024. 8. 25. 16:24ㆍSpring
◎ HTTP 메시지 컨버터
-> 뷰 템플릿으로 HTML을 생성하여 응답하지 않고, HTTP API와 같이 JSON과 같은 데이터를 HTTP 메시지 바디에 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 통해 JSON과 객체를 변환하여 데이터를 주고 받는다.
-> 아래는 @ResponeBody의 동작 과정이다.
-> 웹 브라우저에서 요청을 하면 내장된 톰켓 서버를 거쳐 controller에 요청이 간다.
-> 해당 컨트롤러에 @ResponseBody가 적용되어 있어 HTTP 바디에 문자 내용을 직접 반환한다.
-> @ResponseBody가 있기 때문에 viewResolver를 호출하지 않고, HttpMessageConverter를 호출한다.
-> HttpMessageConverter는 JsonConverter와 StringConverter가 있는데(이 외에도 여러 컨버터가 존재) 요청 데이터에 따라 기본 문자인 경우 StringHttpMessageConverter가, 객체인 경우 MappingJackson2HttpMessageConverter가 호출된다.
* 응답의 경우 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환타입 정보를 조합하여 HttpMessageConverter가 선택된다.
-> 스프링 MVC는 HTTP 요청의 경우 @RequestBody, HttpEntity(or ResponseEntity)가 있을 때, HTTP 응답의 경우 @ResposneBody, HttpEntity(or ResponseEntity)가 있을 때 HTTP 메시지 컨버터를 사용한다.
-> HTTP 메시지 컨버터는 HTTP 요청과 응답에 모두 사용된다.
-> canRead(), canWrite() : 메시지 컨버터가 해당 클래스, 미디어 타입을 지원하는지 파악
-> read(), write() : 메시지 컨버터를 통해 메시지를 읽고 쓰는 기능
◎ 스프링 부트 기본 메시지 컨버터
- 숫자는 우선순위
0 : ByteArrayHttpMessageConverter -> byte[] 데이터 처리, 클래스 타입 : byte[], 미디어 타입 : */*
1 : String HttpMessageConverter -> String 문자로 데이털 처리, 클래스 타입 : String, 미디어 타입 : */*
2 : MappingJackson2HttpMessageConverter -> 클래스 타입 : 객체 or HashMap, 미디어 타입 : aplication/json
...
-> 스프링 부트에서 다양한 메시지 컨버터를 제공하고 대상 클래스 타입과 미디어 타입을 체크하여 만족하지 않으면 다음 메시지 컨버터로 우선순위가 변경된다.
◎ HTTP 요청 데이터 읽기 & HTTP 응답 데이터 생성 과정
<HTTP 요청 데이터 읽기>
- HTTP 요청이 들어오고 컨트롤러에서 @RequestBody, HttpEntity 파라미터 사용
- canRead()를 통해 메시지 컨버터가 메시지를 읽을 수 있는지 확인한다.
- 읽을 수 있다면 read()를 호출하여 객체를 생성하고 반환한다.
<HTTP 응답 데이터 생성>
- 컨트롤러에서 @ResponseBody, HttpEntity로 값이 반환된다.
- canWrite()를 통해 메시지 컨버터가 메시지를 쓸 수 있는지 확인한다.
- 쓸 수 있다면 write()를 호출하여 HTTP 응답 메시지 바디에 데이터를 생성한다.
★ 참고
'Spring' 카테고리의 다른 글
JDBC (1) | 2024.11.02 |
---|---|
HTTP 메시지 컨버터와 요청 메플링 핸들러 어댑터 구조 (0) | 2024.08.25 |
[에러] javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Integer'. (0) | 2024.01.21 |
카카오 주소 검색 API 적용 (1) | 2023.10.06 |
스프링 게시판 - 태그 기능 추가 (0) | 2023.06.18 |