-
직렬화와 역직렬화프로그래밍 기초 공부 2023. 4. 4. 03:00
데이터 직렬화
메모리를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형식으로 변환하는 것
데이터 역직렬화
디스크에 저장한 데이터를 읽거나, 네트워크 통신으로 받은 데이터를 메모리에 쓸 수 있도록 변환하는 것
직렬화를 하는 이유
- 개발할 때 사용하는 데이터의 메모리 구조는 크게 2가지
- 값 형식 데이터
- int, float, char 등 값 형식 데이터는 스택에 메모리가 쌓이고 직접 접근이 가능
- 디스크에 저장하거나 통신할 때 직접적으로 사용 가능
- 참조 형식 데이터
- 객체와 같은 참조 형식 변수를 선언하면 힙에 메모리가 할당되고, 스택에서는 이 힙 메모리를 참조하는 구조
- 실제 데이터 값이 아닌 힙에 할당되어 있는 메모리 번지 주소를 가지고 있기 때문
- 프로그램이 종료되면 기존에 할당되었던 메모리는 해제되고 없어지기 때문에 참조 형식 데이터를 사용할 수 없음
- 값 형식 데이터
- 참조 형식 데이터 때문에 직렬화를 사용해야함
- 직렬화를 하게 되면 각 주소 값이 가지는 데이터를 전부 끌어 모아서 값 형식 데이터로 변환해줌
- 직렬화가 된 데이터는 언어에 따라서 텍스트 또는 바이너리 등의 형태가 되는데, 이러한 형태가 되었을 때 저장하거나 통신할 때 파싱이 가능한 유의미한 데이터가 됨
- 직렬화를 하는 이유는 사용하고 있는 데이터를 파일 저장 혹은 데이터 통신에서 파싱할 수 있는 유의미한 데이터를 만들기 위해서임
데이터 직렬화의 종류
CSV, XML, JSON 직렬화
- 사람이 읽을 수 있는 형태
- 저장 공간의 효율성이 떨어지고, 파싱하는 시간이 오래 걸림
- 데이터의 양이 적을 때 주로 사용함
- 최근에 JSON 형태로 통해 데이터를 직렬화를 많이 함
- 모든 시스템에서 사용이 가능함
Binary 직렬화
- 사람이 읽을 수 없는 형태
- 저장 공간을 효율적으로 사용할 수 있고, 파싱하는 시간이 빠름
- 데이터의 양이 많을 때 주로 사용함
- 모든 시스템에서 사용이 가능함
- ex) 프로토콜 버퍼, Apache Avro 등
Java 직렬화
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술
- JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
Java 역직렬화
- 바이트로 변환된 데이터를 다시 객체로 변환하는 기술
- 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 기술
Java 직렬화의 장점
- 자바 직렬화는 자바 시스템에서 개발에 최적화되어 있음
- 복잡한 데이터 구조의 클래스의 객체라도 직렬화 기본 조건만 지키면 큰 작업 없이 바로 직렬화, 역직렬화가 가능
- 데이터 타입이 자동으로 맞춰지기 때문에 역직렬화가 되면 기존 객체처럼 바로 사용이 가능
Java 역직렬화의 단점
역직렬화 시, 클래스 구조 변경됨
- 모델의 버전 간의 호환성을 유지하는 SUID를 정의해야 함
엄격한 타입 체크
- 객체의 변수 명은 같은데 객체의 변수 타입이 달라지면 타입 예외가 발생
- 렬화한 데이터의 객체의 변수 타입이 String인데, 추후 개발하면서 StringBuilder로 바꿨다면 역직렬화가 불가능
용량
- 아주 간단한 객체의 내용도 2배 이상의 용량 차이가 발생
- 일반적인 메모리 기반의 Cache에서는 Data를 저장할 수 있는 용량의 한계가 있으므로 json 형태와 같은 경량화된 형태로 직렬화하는 것이 좋음
Java 직렬화 사용
- 서블릿 세션
- 세션을 서블릿 메모리 위에서 운용한다면 직렬화를 필요로 하지 않지만, 파일로 저장하거나 세션 클러스터링, DB를 저장하는 옵션 등을 선택하게 되면 세션 자체가 직렬화가 되어 전달됨
- 세션에 필요한 객체는 java.io.Serializable 인터페이스를 구현하는 것이 좋음
- 캐시
- Encache, Redis, memcached 등의 라이브러리 시스템에서 캐시 할 부분을 자바 직렬화된 데이터를 저장해서 사용
- 다른 직렬화 방식도 사용되지만, 자바 직렬화가 가장 간편해서 많이 사용됨
- 자바 RMI
- 원격 시스템 간의 메시지 교환을 위해서 사용하는 자바에서 지원하는 기술
- 원격 시스템의 메소드를 호출 시에 전달하는 메시지를 작동으로 직렬화하고, 전달 받는 원격 시스템에서는 메시지를 역직렬화하여 사용
Java 직렬화 주의
- 외부 저장소로 저장되는 데이터는 짧은 만료 시간이 아니라면 자바 직렬화 사용을 지양함
- 역직렬화 시 반드시 예외가 생길 수 있다는 점을 인지하고 개발함
- 자주 변경되는 비즈니스적인 데이터에 대해 자바 직렬화 사용을 지양함
- 긴 만료 시간을 가지는 데이터는 JSON 등 다른 포맷을 사용하여 저장함
SerialVersionUID
- Java 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야 함
- serialVersionUID를 선언하지 않으면, 내부적으로 클래스의 구조 정보를 이용하여 자동으로 생성된 해시 값이 할당됨
- 이 때문에 클래스의 멤버 변수가 추가되거나 삭제되면 serialVersionUID가 달라
'프로그래밍 기초 공부' 카테고리의 다른 글
쿠버네티스란? (0) 2023.04.02 Docker 란? (0) 2023.04.01 Kafka란? (0) 2023.03.31 JPQL 이란? (0) 2023.03.30 DAO, DTO, VO란? (0) 2023.03.23 - 개발할 때 사용하는 데이터의 메모리 구조는 크게 2가지