스프링부트 쓰다보면 종종 보이는 이 친구
private static final long serialVersionUID = 1L
를 알아보자.
개요
이 코드는 자바에서 직렬화(serialization)와 관련된 매우 중요한 선언입니다.
직렬화는 객체를 바이트 스트림으로 변환하여 파일이나 네트워크를 통해 전송하거나 저장하는 것을 의미합니다. 이렇게 변환된 객체는 나중에 다시 원래의 객체로 복원될 수 있습니다
-from 챗gpt-
앞에는 다 알겠는데, serialVersionUID 얘는 하는 일이 뭐냐
역할
- 직렬화 버전 관리 : 직렬화된 객체를 역직렬화할 때, 클래스의 버전이 일치하는지 확인하는데 사용
- 호환성 유지 : 클래스의 구조가 변경될 때 serialVersionUID 값을 변경하지 않으면 이전 버전의 직렬화된 객체를 새 버전의 클래스로 역직렬화할 수 있다
- 예외 방지 : serialVersionUID 값이 일치하지 않으면 InvalidClassException이 발생하여 프로그램이 비정상적으로 종료될 수 있음.
1번에서 직렬화/역직렬화가 나오는데 이 녀석을 알아보자.
직렬화
객체를 바이트 스트림으로 변환하는 과정.
마치 객체를 압축하여 파일이나 네트워크를 통해 전송할 수 있는 데이터 형태로 만드는 것.
직렬화 용도)
- 객체 저장 : 객체를 파일이나 데이터베이스에 저장
- 네트워크 전송 : 객체를 다른 시스템으로 전송하여 원격 호출이나 분산 시스템에서 사용 가능
- 객체 복제 : 객체를 복제하여 새로운 객체 생성 가능
- RMI(Remote Method Invocation) : 원격 객체를 호출하기 위해 객체를 직렬화하여 전송
역직렬화
직렬화된 바이트 스트림을 다시 원래의 객체로 복원하는 과정.
마치 압축된 파일을 풀어 원래의 파일을 복원하는 것.
역직렬화 용도)
- 저장된 객체 호출 : 파일이나 데이터베이스에 저장된 객체를 메모리에 로드하여 사용
- 네트워크에서 받은 객체 복원 : 네트워크를 통해 받은 바이트 스트림을 객체로 변환해서 처리
직렬화 과정
- 객체 선택 : 직렬화할 객체 선택
- 객체 상태 저장 : 객체의 모든 인스턴스 변수의 값을 저장
- 바이트 스트림 생성 : 저장된 값들을 특정한 형식의 바이트 스트림으로 변환
역직렬화 과정
- 바이트 스트림 읽기 : 직렬화된 바이트 스트림을 읽음
- 객체 생성 : 읽어온 바이트 스트림을 기반으로 새로운 객체를 생성
- 객체 상태 복원 : 저장된 값들을 객체의 인스턴스 변수에 복원
왜 필요함 ?
- 클래스 진화 : 클래스에 새로운 필드를 추가하거나 기존 필드를 삭제하는 등의 변경은 직렬화된 데이터의 형식을 변경시킬 수 있음.
- 버전 호환성 : 이전 버전의 애플리케이션에서 생성된 직렬화된 데이터를 새로운 버전의 애플리케이션에서 사용해야 할 경우
언제 씀 ?
- Serializable 인터페이스를 구현하는 클래스
- 직렬화된 객체를 파일이나 데이터베이스에 저장하거나 네트워크를 통해 전송하는 경우
- 클래스의 버전 관리가 필요한 경우
직렬화의 장단점
-
장점
- 객체의 영구화 : 객체를 파일이나 데이터베이스에 저장해서 영구 보존 가능
- 네트워크 전송 : 객체를 네트워크를 통해 다른 시스템으로 전송 가능
- 객체 복제 : 객체를 쉽게 복제 가능
-
단점
- 보안 취약점 : 직렬화된 데이터를 악용하여 시스템에 악성 코드를 주입하는 공격(직렬화 취약점)에 노출될 수 있음
- 성능 오버헤드 : 직렬화/역직렬화 과정에서 성능 오버헤드가 발생 가능
- 버전 호환성 문제 : 클래스의 구조가 변경될 경우 직렬화된 데이터와 호환되지 않을 수 있음