직렬화 역직렬화 질문 드립니다!
53
작성한 질문수 7
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
큰돌님 안녕하세요!
직렬화의 정의를 외부 시스템에서도 사용할 수 있도록 "바이트" 형태로 데이터를 변환하는 기술이라고 설명해 주셨는데,
구체적으로 예시를 통해 설명을 해주실땐 "바이트"라는 용어가 사용되지 않고 JSON 형태(스트링 타입)으로 변환해서 주고받아야 한다. 라고만 설명이 되어있는 것 같아서 그럼, 정의에서 말씀하신 "바이트"는 뭐지? 라는 생각이 계속 들었던 것 같습니다!
예시를 통한 설명에서 나름대로 유추를 해보자면, 외부 시스템에서 현재 시스템의 객체를 이해하기 위해 stringfy를 통해서 JSON으로 변환해서 보내야 한다.. 그게 직렬화다 라고 하셨으니.. 그럼 정의와 매칭을 해보자면 JSON이 바이트인가? 이렇게 되는데 이건 아닌 것 같은데.. 라는 생각에 사로잡혀 있습니다 ㅠ
설명해주신 대로라면, "외부 시스템에서도 사용할 수 있도록 "스트링" 형태로 객체를 변환하는 기술"이라고 정의가 됐어야 하지 않을까? 하는 생각도 들구요!
결국에 전송할때는 바이트로 변환해서 해야한다는 건 어디서 들었던 것 같은데, 그게 맞는지.
그렇다면, 그럼 JSON으로 변환하는 것도 직렬화고, 그걸 또 바이트로 변환하는 것도 직렬화인지?
또 객체타입을 변환하는 예시만 있었는데, 이건 뭔가.. 메모리 주소값 형태이다 보니까 stringfy같이 스트링형태로 바꿔주는게 필요할 것 같은 느낌은 드는데.. 혹시 뿐만 아니라 원시타입도 직렬화가 필요한지? 도 궁금합니다!
답변 2
1
안녕하세요 지훈님 ㅎㅎ
1. "바이트"가 정의에 들어간 이유
결론부터 말하면 최종 목적지는 언제나 바이트가 맞습니다. 네트워크(TCP/IP)도, 디스크도, Redis도 바이트 스트림만 다룹니다. 자바 객체나 JS 객체를 그대로 밀어 넣을 수 있는 통로는 세상에 없어요.
그럼 JSON이 바이트냐? 아닙니다. 실제 흐름은 이렇게 두 단계입니다.
{ name: "hong", age: 30 } ← 메모리 위의 객체
↓ 직렬화 (구조 → 표현)
'{"name":"hong","age":30}' ← JSON 문자열
↓ 인코딩 (문자 → 바이트, UTF-8)
7B 22 6E 61 6D 65 22 ... ← 실제로 선을 타고 나가는 것
↓ 전송
fetch나 RestTemplate, Spring의 MappingJackson2HttpMessageConverter 같은 게 두 번째 단계를 자동으로 처리해주기 때문에 개발자 눈엔 안 보일 뿐이에요.
그래서 실무에서는 첫 단계만 가리켜 "직렬화했다"고 말할 수 있습니다.
2. 그럼 왜 정의를 "스트링 형태로"라고 안 했나
JSON은 직렬화의 한 가지 방식일 뿐이라서 그렇습니다. 직렬화 포맷은 크게 둘로 나뉩니다.
텍스트 기반 바이너리 기반 예시
JSON, XML, YAML, CSV : 중간 표현 문자열을 거침
바이너리 기반 예시
Protocol Buffers, Avro, Thrift, MessagePack, Java : 문자열 없이 바로 바이트 로 보냄.
protobuf로 직렬화하면 중간에 스트링이 아예 없습니다. 바로 바이트 배열이 나와요. 그래서 정의를 "스트링으로 변환"이라고 써버리면 gRPC/Kafka 쪽에서 쓰는 바이너리 직렬화가 통째로 정의에서 빠집니다. 두 갈래를 다 포괄하는 상위 개념이 바이트인 거죠.
https://en.wikipedia.org/wiki/Protocol_Buffers
즉 "JSON 직렬화 = 바이트로 가는 여러 길 중, 텍스트를 경유하는 길" 이라고 이해하시면 딱 맞습니다.
3. "JSON 변환도 직렬화, 바이트 변환도 직렬화인가?"
엄밀히 계층을 나누면 서로 다른 작업입니다.
직렬화(serialization): 구조 → 평평한 표현. 어려운 지점은 참조 따라가기, 순환 참조, 타입 정보 보존.
인코딩(character encoding): 문자 → 바이트. 어려운 지점은 문자셋(UTF-8/EUC-KR 등).
다만 "객체를 전송 가능한 바이트로 만드는 과정 전체"를 뭉뚱그려 직렬화라고 부르는 것도 통용되는 표현이고 틀리지 않습니다.
면접에서라면 "직렬화의 결과물은 최종적으로 바이트이며, JSON은 그 중간의 텍스트 표현이고 UTF-8 인코딩을 거쳐 바이트가 된다" 정도로 두 계층을 구분해서 말하면 될거에요 ㅎㅎ
4. 원시타입도 직렬화가 필요한가 → 네, 필요합니다
여기가 가장 중요한 오해 포인트예요. "객체는 주소값이라 변환이 필요하고 원시타입은 값이니까 그냥 보내면 된다"가 아닙니다.
int 42는 메모리에 4바이트로 있지만, 그 바이트를 상대가 똑같이 해석한다는 보장이 없습니다.
예를 들어 C의
long은 플랫폼마다 4바이트 또는 8바이트가 됩니다.
그래서 원시타입도 "약속된 형태"로 변환해야 합니다. JSON.stringify(42) → "42"도 엄연한 직렬화라고 볼 수 있습니다.
참고로 객체는 앞서 얘기한 부분도 있지만 힙에 흩어져 있고 참조로 연결돼 있는데, 주소값은 그 프로세스 안에서만 의미가 있거든요. 다른 머신에 0x7ffd1234를 보내봐야 무의미하죠. 그래서 참조를 따라가 실제 값을 펼쳐서 순서대로 나열하는 작업이 필요해서 직렬화를 진행합니다.
한 줄 정리
직렬화 = 메모리에만 존재하는 데이터를, 외부 시스템이 해석할 수 있도록 약속된 바이트 나열로 바꾸는 것. JSON은 그 약속 중 사람이 읽기 좋은 텍스트 방식이고, 실제 전송 직전 UTF-8 인코딩을 거쳐 바이트가 된다.
또는
"외부 시스템에서도 사용할 수 있도록, 메모리 위의 데이터를 연속된 바이트 열로 변환하는 기술. 이때 중간 표현으로 JSON 같은 텍스트 포맷을 쓸 수도 있고(텍스트 직렬화), protobuf처럼 바로 바이트로 갈 수도 있다(바이너리 직렬화)."
라고 볼 수 있을 것 같습니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다. 이지훈님.
직렬화(Serialize)는 프로그래밍 객체나 데이터를 전송하거나 저장할 수 있는 형식으로 변환하는 과정입니다. 보통 이러한 형식은 데이터 교환 포맷인 JSON 문자열이나 XML 등이 될 수 있지만, 프로그램적인 관점에서는 모두 바이트 형태로 변환되어 외부 시스템이나 파일에 저장됩니다.
JSON과 직렬화:
- JSON 형태로 변환하는 것은 데이터를 문자열 형태의 텍스트로 변환하는 것입니다.
- 이 문자열은 다시 바이트 스트림으로 변환되어 네트워크를 통해 전송되거나 파일로 저장될 수 있습니다.
- 따라서, 직렬화의 참된 의미는 반드시 바이트형태로의 변환을 포함하는데, 이는 문자 형태의 데이터를 실제로 이해 가능한 객체로 해석하거나 저장하기 위한 형태로 포장한 것입니다.
- JSON 형태로 변환하는 것은 데이터를 문자열 형태의 텍스트로 변환하는 것입니다.
바이트와 JSON:
- JSON 자체가 바이트는 아닙니다. 하지만 JSON 문자열은 내부적으로 ASCII 또는 유니코드의 텍스트 바이트로 변환될 수 있습니다. 즉, JSON이 우리가 주고받는 텍스트 형태라면, 그 텍스트는 실제로 0과 1로 구성된 바이트로 저장되거나 전송됩니다.
- JSON 자체가 바이트는 아닙니다. 하지만 JSON 문자열은 내부적으로 ASCII 또는 유니코드의 텍스트 바이트로 변환될 수 있습니다. 즉, JSON이 우리가 주고받는 텍스트 형태라면, 그 텍스트는 실제로 0과 1로 구성된 바이트로 저장되거나 전송됩니다.
원시타입의 직렬화:
- 기본적으로 자바스크립트의 원시타입(숫자, 문자열, 불리언 등)은 직렬화 과정에서 크게 변환되는 내용이 없지만, 복잡한 자료 구조(객체나 배열 등)는 구성형식이 직렬화 과정을 통해 구체적으로 명시됩니다.
- 예를 들어, 단순한
number리터럴이나boolean값은 기본적으로 JSON 형태와 유사하여 추가적인 변환이 불필요한 경우가 많습니다.
- 기본적으로 자바스크립트의 원시타입(숫자, 문자열, 불리언 등)은 직렬화 과정에서 크게 변환되는 내용이 없지만, 복잡한 자료 구조(객체나 배열 등)는 구성형식이 직렬화 과정을 통해 구체적으로 명시됩니다.
관련해서 JSON과 JS Object 게시물을 참고하시면, JSON의 본질과 자바스크립트 객체간의 차이에 대한 지식을 더 쌓으실 수 있습니다. 이 게시물은 JSON 문자열로 변환(stringify)과 자바스크립트 객체로 역직렬화(parse)를 다루고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
디자인패턴 질문
0
31
2
팩토리 패턴
0
47
2
싱글톤 패턴 구현방법
0
53
2
라이브러리 프레임워크 차이 질문
0
52
1
프로젝트 질문 드립니다!
0
46
2
추상화 질문
0
38
2
안녕하세요 큰돌님!
0
77
2
REST API (Self-descriptive messages)
0
65
1
시스템 엔지니어 관련 질문입니다.
0
122
2
오버라이딩 관련하여 질문드립니다.
0
106
2
교착상태의 4가지 필요조건이 필요충분조건이 아닌 이유
0
133
1
렌더 트리, 렌더 레이어와 그래픽 레이어
0
86
2
로컬스토리지, 세션스토리지, 쿠키의 공통점
0
89
1
IPv4가 IPv6보다 빠른 경우
0
174
2
UDP가 전송계층의 역할을 못하는 건 아닌지
0
84
1
Path MTU 발견하였음에도 패킷 분할이 필요한 이유?
0
97
2
교재의 LFU 알고리즘에서 6번이 왜 히트인가요?
0
105
2
페이지 교체 알고리즘? 프레임 교체 알고리즘?
0
115
2
Static 키워드가 메모리에 올라가는 시점
0
107
2
헤더 압축부분 질문드립니다
0
108
2
공유 캐시 관련 질문 드립니다.
0
82
2
컨텍스트는 context와 contextual information으로 나눠진다는게 무슨뜻인가요?
0
262
1
회선과 대역폭의 관계
0
104
2
44강 질문
0
146
2





