ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 직렬화와 역직렬화
    프로그래밍 기초 공부 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
Designed by Tistory.