직렬화(Serialize)

YH·2023년 4월 3일
0

✅ 직렬화(Serialize)란?

  • 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술로써, JVM의 메모리 (in Stack or heap) 에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
  • 다차원의 자료를 파일로 저장하거나 네트워크로 보내기에 알맞게 일차원으로 펼치고 다시 원래대로 되돌리는 것을 직렬화(Serialization)라고 함
  • 역직렬화는 직렬화의 반대의 의미로 바이트 -> 객체로 변환하는 것

✅ 자바에서의 직렬화

  • 자바에서의 직렬화는 JVM 메모리에서만 상주되어있는 객체 데이터를 영속화할 때 사용됨
  • 네트워크 전송도 가능하고 필요할 때 직렬화된 객체를 역직렬화 하여 객체를 바로 사용 할수도 있게 해줌
  • 주로 아래 항목에서 사용됨
    • 서블릿 세션(Servlet Session)

      • 서블릿 기반의 WAS(톰캣, 웹로직 등) 대부분 세션의 자바 직렬화를 지원
      • 파일로 저장하거나 세션 클러스터링, DB에 저장하는 옵션 등을 선택하게 된다면 세션 자체가 직렬화 되어 저장되어 전달
    • 캐시(Cache)

      • 캐시 할 부분을 자바 직렬화된 데이터를 저장해서 사용
      • 데이터베이스에서 조회하는 동작보다 캐시에서 꺼내오는 동작이 더 저렴
    • Java RMI(Remote Method Invocation)

      • RMI는 원결 시스템 간의 메시지 교환을 위해서 사용하는 자바에서 지원하는 기술
      • 원격의 시스템의 메서드를 호출 시에 전달하는 메시지(객체)를 자동으로 직렬화 시켜 사용

✅ SerialVersionUID(SUID) 란?

  • 직렬화에 사용되는 고유 버전을 의미하는 값
  • 직렬화 과정에서 serialVersionUID의 버전이 포함되게 되고, 역직렬화 과정에서 Java class에 선언되어 있는 serialVersionUID의 버전과 서로 동일한지를 체크
  • 직접 선언하지 않아도 내부적으로 자동 생성해줌
  • 그러나, 직접 선언하지 않는 경우에는 컴파일러 구현에 따라 달라질 수 있는 클래스에 변경이 생기면 역직렬화 시 오류가 발생함.
  • 따라서, 자바에서 직렬화를 사용할 때는 Serializable 클래스에 SerialVersionUID(SUID)를 명시적으로 생성하여 관리하는 것이 좋음
  • 잠재적으로 네트워크를 넘나들거나 파일로 저장할 가능성이 조금이라도 있는 클래스는 기본적으로 Serializable을 구현해서 의도를 명확하게 밝히는 것이 좋음

참고 Reference

profile
하루하루 꾸준히 포기하지 말고

0개의 댓글