직렬화란?
객체, 해시, 딕셔너리 등을 문자/바이트 형식으로 만드는 것이다.
반대로, 역직렬화란?
문자/바이트 형식을 프로그램이 사용하는 객체로 바꾸는 것을 말한다.
왜 직렬화/역직렬화가 필요한가요? 🤷🏻♀️
네트워크 전송(HTTP), 파일 저장, 로그 기록 등은 바이트 형식만 가능하기 때문이다.
객체는 메모리 주소와 구조를 가진 덩어리다. 이런 정보들은 모든 사용자 개인의 컴퓨터 환경의 영향을 받는다. 만약, JVM을 사용하지 않는 사용자에게 Java 객체를 전송한다면? 정상적으로 데이터 송수신이 어려울 것이다. 그래서 문자열/바이트 형식으로 데이터를 전송한다.
*문자열 : 바이트 스트림을 문자 인코딩 규칙(UTF-8, UTF-16 등) 으로 해석한 것이다. (즉, 바이트 스트림 ⊃ 문자열 스트림이라 할 수 있음) 따라서, 인코딩을 잘못하면, 글씨가 깨지는 경우가 발생한다.
JSON이란?
Java-Script Object Notation
자바 스크립트 문법 기반 데이터 교환 형식이다.
쉽게 말해서, 직렬화/역직렬화하는 포맷(형식)중 하나로, key-value 형식을 되어있다.
{"name": "miho", "age": 20}
🔎 직렬화 포맷
텍스트 기반: JSON, XML, YAML, CSV → 사람이 읽기 수월
바이너리 기반 : Protobuf, Avro, MessagePack → 사람이 못 읽음, 빠름
왜 JSON을 가장 많이 사용하나요?
1. 사람이 바로 읽을 수 있다. (텍스트 기반이라)
2. 여러 프레임워크와 언어에서 기본 지원한다.
3. JavaScript에서 객체 ↔ JSON 변환 비용이 거의 없어, 웹과 호환이 좋다.
4. 구조와 타입 정보를 포함하고 있어, 별도의 외부 스키마 없이도 바로 사용이 가능하다.
XML이란?
EXtensible Markup Language
마크업 기반 데이터 교환 형식으로, <태그> 형식을 사용한다.
<User>
<name>miho</name>
<age>20</age>
</User>
HTML과 비슷해 보이는데 뭐가 다른거죠? 🙋🏻♀️
HTML은 보여주기 위한 UI이고, XML은 데이터 저장 및 전송을 위한 데이터 교환 형식이다.
둘이 비슷해보이는 이유는 <태그> 기반이기 때문이다.
✅ HTML과 XML 차이점
1. HTML은 미리 정의된 태그가 있지만, XML은 고유한 태그를 정의 가능하다.
2. XML은 대소문자를 구분하지만, HTML은 구분하지 않는다.
🔎 스프링에서 직렬화/역직렬화 살펴보기
Spring에서의 직렬화/역직렬화에 대해 설명해주세요.
Spring MVC는 HTTP 바이트 스트림 ↔ Java 객체 변환을
HttpMessageConverter와 Jackson을 통해 자동 처리한다.
여기서는 JSON 방식을 사용한 직렬화와 역직렬화를 살펴보도록 하겠다.
요청 (Client → Server):
JSON 문자열 → (HTTP 바이트 스트림) → Jackson → Java 객체 (@RequestBody)
응답 (Server → Client):
Java 객체 → Jackson → JSON 문자열 → (HTTP 바이트 스트림)
1) 응답
- @ResponseBody
- 응답 → 자동으로 직렬화*@RestController를 쓰면 자동으로 적용된다.
응답 프로세스
1. Controller 메서드 종료
2. Accept 헤더 확인
Accept: application/json
Spring 🍃 : "JSON 타입을 기대하는 구나!"
3. HttpMessageConverter 선택
Spring 🍃 : "MappingJackson2HttpMessageConverter (← JSON 담당)을 호출하자"
4. Jackson 직렬화
ObjectMapper.writeValueAsString(userDto)
2) 요청
- @RequestBody
- 요청 JSON → 자동으로 역직렬화
@PostMapping("/users")
public void create(@RequestBody UserDto dto) {
}
POST /users
Content-Type: application/json
{
"name": "miho",
"age": 20
}
요청 프로세스
1. HTTP 요청 도착
2. Content-Type 확인
Spring 🍃 : "JSON 타입이구나!"
3. HttpMessageConverter 선택
Spring 🍃 : "MappingJackson2HttpMessageConverter (← JSON 담당)을 호출하자"
4. Jackson이 역직렬화
ObjectMapper.readValue(json, UserDto.class)
질문 리스트
체크리스트를 답변해보며 내용이 이해가 되었는지 확인해보아요!
✅ 체크 리스트
1. 왜 HTTP 통신에는 직렬화가 필요한가?
2. 그 직렬화는 왜 JSON으로 많이 하는가?
3. Spring MVC에서는 그걸 어떻게 처리하는가?
관련 면접 질문 정리 🧚🏻♀️
1. 직렬화와 역직렬화란 무엇인가요? 왜 필요한가요?
2. @RequestBody와 @ResponseBody는 왜 필요한가요?
3. JSON과 XML의 차이점은 무엇인가요?
4. JSON과 Protobuf의 차이점은 무엇인가요?
5. 객체를 그대로 HTTP로 보내면 안 되는 이유는 무엇인가요?
6. HttpMessageConverter는 무엇인가요?
'CS' 카테고리의 다른 글
| [CS] 동기화 문제: 똑같이 더하고 뺐는데 왜 sharedData는 0이 안 나올까? (Mutex, Semaphore) (0) | 2025.12.26 |
|---|---|
| [CS] JAVA 싱글톤 패턴과 Spring 싱글톤의 차이, 그리고 thread-safe 오해 (0) | 2025.12.17 |