Redis를 사용하는 코드를 분석하던 도중 직렬화와 관련된 설정이 있어, 이를 이해하고 넘어가고자 한다.
직렬화란 무엇일까?
직렬화란 Serialization으로, 데이터 구조나 객체를 파일의 형태 등으로 저장하거나 통신하기 쉬운 포맷으로 변환하는 과정이다.
Serialization의 Serial은 ‘연속된’ 이라는 뜻으로, Serialization란 객체를 ‘연속된’ Byte Stream으로 변환하는 과정을 의미한다.
Byte Stream으로 변환하는 과정이란, Primitive한 데이터로 변조하는 작업을 의미한다.
왜 Primitive한 데이터로 변조를 하는 과정이 필요할까?
객체는 여러가지의 자료형이 있는데, 그 중에서도 주소값을 가지고 있는 정보는 다른 시스템으로 보내봤자 의미가 없다. 즉, ‘주소’값을 그대로 다른 시스템에 보내는 것은 의미가 없다는 것이다.
특정 주소가 A객체를 의미한다고 한들, 다른 시스템에서는 아무 의미가 없는 주소인 것이다.
그래서! 이 주소값을 이용해 실제로 의미하는 값을 가져오고, Primitive한 데이터로 변조하는 작업(byte stream으로 바꾸는 작업), 즉 직렬화가 필요하다.
반대로 역직렬화란 특정 포맷으로 직렬화된 데이터를 다시 데이터 구조나 객체로 변환하는 과정이다.
직렬화에 대해 예시를 통해 알아보자.
예를 들어, Redis를 사용할 경우 직렬화방식을 PHP방식으로 선택한다면, Redis에 저장될 때 PHP만의 방식으로 저장된다는 것을 의미한다.
PHPRedis의 라이브러리 코드 직접 들어가보면, PHPRedis가 지원하는 직렬화 방식에는 PHP방식뿐만 아니라, IGBINARY, MSGPACK, JSON방식이 있다는 것을 알 수 있다.
즉, PHP, IGBINARY, MSGPACK, JSON중에 데이터를 어떤 형식으로 저장할 것이냐에 대한 설정을 하는 것이다.
추가로, 구글링 해보면 마샬링에 대해서도 직렬화와 비교를 하곤 하는데, 마샬링과 직렬화의 차이점은 무엇일까?
마샬링은 직렬화와 거의 비슷한데, 코드베이스를 포함하여 객체를 직렬화 한다.
코드베이스란, 객체를 받는이에게 객체의 구현을 어디서 찾을 수 있는지에 관한 정보를 말한다. 만약, 다른 프로그램에게 객체를 전달했는데 이 객체를 다시 사용하려면 데이터 타입에 관한 정보가 있어야 한다. 코드베이스는 이 데이터가 어디에 있는지 알려주는 정보를 말한다.
코드 베이스가 있기 때문에, 객체의 정보를 알지 못하는 다른 JVM에게 마샬링을 통해 건네주면, 그 JVM이 언마샬링을 통해, 객체를 원래 상태로 되돌릴 수 있다.
→ 이런 장점을 통해 RMI(Remote Method Invocation), gRPC(google Remote Procedure Call)와 같은 기능을 사용할 수도 있다.
→ 마샬링은 원격 프로시저를 호출할 때 함수의 parameter나 return value들(코드베이스를 기록해서)을 전달할 수 있다.
학부생때, 수업시간에 직렬화가 뭔지, 마샬링이 뭔지도 모른채 java코드를 json으로 변환하거나, RMI와 gRPC 사용해 프로젝트를 진행하곤 했었는데, 확실히 알고 넘어가 더 깊은 이해를 할 수 있게 되었다!