728x90
반응형
직렬화 / 역직렬화
HttpMessageConverter 역할
지난 포스팅에서 Controller의 처리 / 반환에 대해 MessageConverter를 언급했었지만 정확히는 "HttpMessageConverter"라고 한다. HttpMessageConverter는 Spring MVC에서 요청과 응답의 HTTP 메세지 바디를 변환하는데 사용된다. Spring 요청 본문을 Java 객체로 역직렬화하고, 응답 본문을 Java 객체에서 JSON, XML 등으로 직렬화하는 과정을 자동으러 처리한다.
Spring은 다양한 기본 구현체를 제공하지만, 필요에 따라 개발자가 커스텀 MessageConverter를 만들 수도 있다.
HttpMessageConverter 동작원리
HttpMessageConverter는 클라이언트와 서버 간의 데이터 교환에서 Java 객체와 HTTP 메세지 사이를 변환하는 역할을 한다.
이 과정에서 Java 객체는 JSON, XML, 텍스트 등 다양한 포맷으로 변환될 수 있으며, 반대로 클라이언트로부터 받은 JSON 데이터는 다시 Java 객체로 변환된다.
- MappingJackson2HttpMessageConverter: JSON 형식의 데이터를 처리한다. (application/json)
- StringHttpMessageConverter: 일반 텍스트 형식을 처리한다.(text/plain)
- FormHttpMessageConverter: from data를 처리한다.(application/x-www-form-urlencoded)
- ByteArrayHttpMessageConverter: 바이너리 데이터를 처리한다. (application/octet-stream)
요청시 JSON 데이터를 Java 객체로 변환:
@PostMapping("/user")
public ResponseEntity<User> createUser(@RequestBody User user) {
// @ReqeustBody는 요청 본문을 User 객체로 변환 (역직렬화)
return ResponseEntity.ok(user);
}
응답 시 Java 객체를 JSON으로 변환:
@GetMapping("/user")
public User getUser() {
// User 객체를 JSON으로 변환 (직렬화)하여 응답;
return new User("CHEONSANG", 12);
}
- 위 코드에서 @RequestBody는 HTTP 요청 본문을 User 객체로 변환하는 역할을 하고, 응답은 User 객체를 JSON 형식으로 직렬화하여 클라이언트에 반환한다.
- 이 변환 과정은 MappingJackson2HttpMessageConverter가 자동으로 처리한다.
HttpMessageConverter 처리 순서
- 클라이언트가 서버에 요청을 보낼 떄, HTTP 요청 본문을 HttpMessageConverter를 통해 Java 객체로 역직렬화된다. 예를 들어, JSON 데이터는 MappingJackson2HttpMessageConverter를 통해 Java 객체로 변환된다.
- 서버가 클라이언트에 응답을 보낼 때, Java 객체는 다시 HttpMessageConverter에 의해 JSON이나 XML 등의 데이터 형식으로 직렬화 된다.
- MessageConverter는 Spring이 HTTP 요청/응답의 Content-Type 헤더를 분석해 어떤 변환기를 사용할지 결정한다. 예를 들어, 요청의 Content-Type이 application/json이면 MappingJackson2HttpMessageConverter가 선택된다.
직렬화 / 역직렬화: (웹 서버 기준) 외부 데이터 형태와 내부 데이터 형태 사이의 변환
- 외부: REST API를 통해 광활한 네트워크를 떠돌아다니는 모든 데이터는 문자열(JSON)로 전송된다.
- 내부: 백엔드 프로그래밍 언어로 개발한 웹 서버에서 모든 데이터는 객체(Obejct)로 다뤄진다.
- 응답: Java 객체(2차원) → HTTP Response Body JSON(1차원, String): Serialization 직렬화
- 요청: HTTP Reqeust Body JSON(1차원, String) → Java 객체(2차원): Deserialization 역직렬화
ℹ️ 참고
[ASAC 6기 강의자료]
반응형
'💻DEV-STUDY > Spring' 카테고리의 다른 글
[Spring] Spring 요청값 처리 방식 (0) | 2024.10.06 |
---|---|
Spring Bean 원리과 의존성 주입 (1) | 2024.10.06 |
[Spring] Controller 처리 반환 (1) | 2024.10.05 |
[Spring] Spring Controller의 기본 동작 (0) | 2024.10.04 |
[Spring] Spring MVC 원리 (0) | 2024.10.04 |