본문 바로가기

JAVA

Java serialization 사용 이유

프로젝트를 확인하다보면 DTO, VO, Domain 객체에 이게 왜 사용되는지에 대해 궁금해서 직접 공부한 내용을 기재하려고 한다.

 

객체에 아래와 같은 형태로 되어 있는 모습을 많이 볼 수 있다.

public class User {

    private static final long serialVersionUID = 1L;
    
    필드...
}

또는

public class User implements Serializable {

}

serialization 정의

 

  • 직렬화(Serialization): 객체를 바이트 스트림으로 변환해 파일 또는 네트워크로 전송할 수 있게 합니다.
  • 역직렬화(Deserialization): 바이트 스트림을 원래의 객체로 복원합니다.

직렬화 하는 이유

1) 객체의 영속성(Persistence) 보장

  • 프로그램이 종료되더라도 객체의 상태를 파일이나 데이터베이스에 저장해둘 수 있습니다.
  • 예를 들어, 사용자 정보나 설정 값을 객체 형태로 저장해두고, 프로그램이 다시 시작될 때 직렬화된 데이터를 불러와 상태를 복원할 수 있습니다.

2) 네트워크 전송

  • 분산 시스템이나 네트워크 통신에서 객체를 바이트 스트림으로 변환해 전송할 수 있습니다.
  • 예를 들어, **RMI(Remote Method Invocation)**나 REST API를 통해 원격 시스템으로 객체를 보내야 할 때, 객체를 직렬화해 전송합니다.

3) 세션 유지 (웹 애플리케이션)

  • 웹 애플리케이션에서는 사용자 세션 정보를 직렬화하여 파일 시스템이나 메모리 저장소에 저장합니다.
  • 서버를 재시작해도 직렬화된 세션 객체를 역직렬화해 세션을 유지할 수 있습니다.

4) 캐시 관리

  • 자주 사용하는 객체를 직렬화하여 캐시에 저장하고, 필요할 때 빠르게 역직렬화해 사용할 수 있습니다.

 

왜 사용할까 ?

결론부터 말하자면 

 

1) 클래스의 고유성을 유지

2) 버전 관리를 통해 직렬화된 객체와 클래스 간의 호환성 보장

 

위 두 개 이유 때문에 사용 한다.


클래스의 고유성 ?

클래스의 고유성은 내부에 필드, 메소드가 변경 되어도 같은 클래스라는 걸 알 수 있습니다.


난 그런거 안해도 잘 되던데 ? 꼭 해야함 ?

상속 또는 정적 불변 변수(static final)로 명시를 안해도 JVM에서 자동 생성 됩니다.

JVM에서 자동생성시 고유성을 보장 받지 못해 클래스 내부의 필드, 메소드 값이 변경되면 다른 값들이 만들어지는데 그 결과 기존에 직렬화된 객체를 역직렬화할 때 InvalidClassException 이 발생할 수 있습니다.


근데 모든 객체에 private static final long serialVersionUID = 1L; 똑같이 설정되어 있던데 중복되면 문제되는거 아님 ?

전혀 문제 없습니다!

직렬화 과정시 JVM은 클래스 이름serialVersionUID 저장하기 때문에 문제 없습니다.

 

반대로 역직렬화 과정에서도 클래스 이름serialVersionUID를 확인하기 때문에 똑같은 값으로 설정해도 문제 없습니다.

 

하지만 권장사항은 각 클래스마다 고유한 serialVersionUID를 부여하는게 좋습니다.

private static final long serialVersionUID = 7818375828146090155L;

근데 서버 재시작 하면 serialVersionUID 의 값은 변경 되는거 아니야 ?

private static final long serialVersionUID = 7818375828146090155L; // 명시됨

위 처럼 저렇게 명시를 안해둔 경우에는 JVM이 자동으로 만들기 때문에 변경될 수 있습니다.

 

하지만 값을 명시했기 때문에 값은 그대로 입니다.

 

*짤막한 정보! 정적 변수에 값이 결정되는 시점

static 클래스가 메모리에 로드될 때
static final (상수) 컴파일 시점 (단순한 상수의 경우)
static final (복잡한 값) 클래스 로딩 시점 (복잡한 연산의 경우)

 

 

반응형

'JAVA' 카테고리의 다른 글

자바 property명 주의 사항!(dto, domain, entity)  (0) 2023.10.19
File  (0) 2023.10.02
다형성(polymorphism)  (0) 2023.08.24
클래스, 메소드, for문, 스캐너를 이용한 구구단 출력  (0) 2022.11.04
Scanner - 입력  (0) 2022.10.28