private static final long serialVersionUID = 1L 이게 뭐임

Honam Kim·2024년 12월 13일

스프링부트 쓰다보면 종종 보이는 이 친구

private static final long serialVersionUID = 1L

를 알아보자.

개요

이 코드는 자바에서 직렬화(serialization)와 관련된 매우 중요한 선언입니다.
직렬화는 객체를 바이트 스트림으로 변환하여 파일이나 네트워크를 통해 전송하거나 저장하는 것을 의미합니다. 이렇게 변환된 객체는 나중에 다시 원래의 객체로 복원될 수 있습니다

-from 챗gpt-

앞에는 다 알겠는데, serialVersionUID 얘는 하는 일이 뭐냐

역할

  1. 직렬화 버전 관리 : 직렬화된 객체를 역직렬화할 때, 클래스의 버전이 일치하는지 확인하는데 사용
  2. 호환성 유지 : 클래스의 구조가 변경될 때 serialVersionUID 값을 변경하지 않으면 이전 버전의 직렬화된 객체를 새 버전의 클래스로 역직렬화할 수 있다
  3. 예외 방지 : serialVersionUID 값이 일치하지 않으면 InvalidClassException이 발생하여 프로그램이 비정상적으로 종료될 수 있음.

1번에서 직렬화/역직렬화가 나오는데 이 녀석을 알아보자.

직렬화

객체를 바이트 스트림으로 변환하는 과정.
마치 객체를 압축하여 파일이나 네트워크를 통해 전송할 수 있는 데이터 형태로 만드는 것.

직렬화 용도)

  • 객체 저장 : 객체를 파일이나 데이터베이스에 저장
  • 네트워크 전송 : 객체를 다른 시스템으로 전송하여 원격 호출이나 분산 시스템에서 사용 가능
  • 객체 복제 : 객체를 복제하여 새로운 객체 생성 가능
  • RMI(Remote Method Invocation) : 원격 객체를 호출하기 위해 객체를 직렬화하여 전송

역직렬화

직렬화된 바이트 스트림을 다시 원래의 객체로 복원하는 과정.
마치 압축된 파일을 풀어 원래의 파일을 복원하는 것.

역직렬화 용도)

  • 저장된 객체 호출 : 파일이나 데이터베이스에 저장된 객체를 메모리에 로드하여 사용
  • 네트워크에서 받은 객체 복원 : 네트워크를 통해 받은 바이트 스트림을 객체로 변환해서 처리

직렬화 과정

  1. 객체 선택 : 직렬화할 객체 선택
  2. 객체 상태 저장 : 객체의 모든 인스턴스 변수의 값을 저장
  3. 바이트 스트림 생성 : 저장된 값들을 특정한 형식의 바이트 스트림으로 변환

역직렬화 과정

  1. 바이트 스트림 읽기 : 직렬화된 바이트 스트림을 읽음
  2. 객체 생성 : 읽어온 바이트 스트림을 기반으로 새로운 객체를 생성
  3. 객체 상태 복원 : 저장된 값들을 객체의 인스턴스 변수에 복원

왜 필요함 ?

  1. 클래스 진화 : 클래스에 새로운 필드를 추가하거나 기존 필드를 삭제하는 등의 변경은 직렬화된 데이터의 형식을 변경시킬 수 있음.
  2. 버전 호환성 : 이전 버전의 애플리케이션에서 생성된 직렬화된 데이터를 새로운 버전의 애플리케이션에서 사용해야 할 경우

언제 씀 ?

  • Serializable 인터페이스를 구현하는 클래스
  • 직렬화된 객체를 파일이나 데이터베이스에 저장하거나 네트워크를 통해 전송하는 경우
  • 클래스의 버전 관리가 필요한 경우

직렬화의 장단점

  • 장점

    • 객체의 영구화 : 객체를 파일이나 데이터베이스에 저장해서 영구 보존 가능
    • 네트워크 전송 : 객체를 네트워크를 통해 다른 시스템으로 전송 가능
    • 객체 복제 : 객체를 쉽게 복제 가능
  • 단점

    • 보안 취약점 : 직렬화된 데이터를 악용하여 시스템에 악성 코드를 주입하는 공격(직렬화 취약점)에 노출될 수 있음
    • 성능 오버헤드 : 직렬화/역직렬화 과정에서 성능 오버헤드가 발생 가능
    • 버전 호환성 문제 : 클래스의 구조가 변경될 경우 직렬화된 데이터와 호환되지 않을 수 있음
profile
자유로운영혼

0개의 댓글