-
[Network] 데이터의 직렬화(Serialization)Network Basis 2022. 2. 17. 13:33
# 정의
직렬화란 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 바이트 형식으로 변환하는 것
다차원의 자료를 파일로 저장하거나 네트워크로 보내기에 알맞게 일차원으로 펼치는 것
* Java 에서는 Serialization 인터페이스를 구현한 클래스만 직렬화가 가능하다고 한다.
* 보안상으로 노출되지 않아야되는 멤버들은 @Transient로 마킹한다고 한다.
여기서 의문점이 생길 수 있다. (저는 그랬다..)
# 고개 드는 궁금증
???
원래 컴퓨터는 모든 데이터를 0,1 로 처리하지않나?
다차원의 데이터라도 0,1 로 구성된 각 벡터 데이터를 연속적으로 붙이면되는거 아닌가?
이게 뭐라고 거창하게 '직렬화' 라는 명칭을 가지고 있지?
그리고 Java에서는 Serialization 이 구현 안 된 데이터들은 네트워크로 전송이 안된다고?
Spring에서 Serialization 구현 안해도 잘 주고 받았는데?
엔티티는 Serialization 을 구현하기를 권장한다고 듣긴했는데....
그럼 Spring에서 자동으로 직렬화를 해주는게 아닌가?
도대체 이게 무슨 개념이지?
# 직렬화가 필요한 이유
직렬화가 필요한 이유는 값 형식 데이터 (Value Type) 과 참조 형식 데이터 (Reference Type) 의 차이 때문에 발생한다.
원시타입(Value)의 변수들은 메모리 영역 중 스택에 쌓이고, 이미 직렬화 되어있다.
예를 들어 int형 변수는 4byte만큼 연속적으로 메모리가 배치되어있다.
하지만 참조타입(Reference) 변수들은 메모리 영역 중 힙에 쌓이게 되고, 흩어져 있다.
그리고 스택영역에서 해당 힙 메모리를 참조하는 구조로 되어있다.
예를 들어 String 이 포인터로 구현되어 있는 경우, 내부적으로 메모리가 연속적으로 되어 있지 않다고 한다.
이러한 데이터를 온전히 저장 또는 전송하기 위해서는 연속적으로 배치해주어야 하는 작업을 해야하는데 그것이 직렬화이다.
참고 포스팅 : https://hub1234.tistory.com/26
# 조금은 해소되지만 여전한 궁금증
1. Java(Spring) 에서 Serialization 인터페이스의 역할 (해결)
궁금했던게 컨트롤러에서 객체데이터를 return 시키면 ObjectMapper 가 JSON으로 내보내주는 것도 과연 직렬화인가?
즉, Serialization의 자동여부였는데 참고 포스팅2 에서 Schemaless한 직렬화 라는 용어로 설명하고 있다.
결론은 JSON 포맷으로 바꾸는 것도 직렬화이며, 그래서 JSON 포맷으로 통신이 가능하다.
엔티티에 Serialization 구현이 표준스펙에서 권장되는 이유는 정확히 잘 모르겠다.
(현재까지 필자가 Serialization 구현이 필요했던 경우는 복합키관련 구현과 referencedColumn이 PK로 연결되지 않았을 때이다.)
Hibernate 구현체가 엔티티데이터들을 자동으로 Serialization 해서 관리하는 것 같긴한데... 왜 꼭 Serialization 구현을 직접해줘야하는 케이스가 있는 것일까? 🧐🧐🧐🧐
참고 포스팅1 : https://haranglog.tistory.com/4
참고 포스팅2 : https://j.mearie.org/post/122845365013/serialization#notes2. 어디선가 힙메모리에 변수를 할당하기 전에 해당변수의 크기만큼 OS가 연속적인 메모리공간을 찾고 할당한다고 했는데..? (해결)
OS가 페이징(Paging) 처리로 프로세스를 관리하듯, 변수라고 그렇게 관리안할 이유가 없지 않을까?
만약 그렇다면, 참고 블로그 포스팅에서 언급된 참조타입변수들이 메모리가 흩어져있다는게 참이 된다.# 알아두면 좋은 짤막 지식
1. C언어 계열의 구조체(Struct)는 스택영역에 쌓이는 Value Type 이다.
2. 스택영역은 컴파일 시에 미리 크기가 판단되기 때문에, 힙보다 훨씬 속도가 빠르다.
힙 영역은 메모리 할당/해제시 fragment 등을 고려해주어야 하는 연산(병합등)이 필요해서 스택에 비해 느리다.
스택 영역은 메모리 할당은 컴파일타임에 결정되고, 해제는 스택포인터만 감소시키면 된다.728x90'Network Basis' 카테고리의 다른 글
[Network] 통신 프로토콜의 발전에 대한 간략 정리글 (IP, TCP/UDP, HTTP) (0) 2022.03.29 [Network] 정적웹과 동적웹의 정확한 정의를 고민해보자 (Feat. AWS & GitHub Pages) (0) 2022.02.22 [Network] TCP/UDP 포트 목록 (well-known port, registerd port, dynamic port) (0) 2022.02.07 [Network] Apachi, Nginx, Tomcat 이 하는일이 뭘까? (Feat. Proxy) (0) 2021.12.15 [Network] HTTPS는 무엇인가? HTTPS의 데이터를 주고받는 방식 (0) 2021.12.10