[Java] 객체 직렬화 기술, Serializable 인터페이스를 안쓰는 이유 그리고 JSON

devdo·2023년 2월 9일
0

Java

목록 보기
54/60
post-thumbnail

Serializable 인터페이스 안 사용하는 이유

Serializable 인터페이스는 Java에서 객체의 직렬화(Serialization)를 가능하게 하는 인터페이스입니다.

Serializable은 객체의 내부 구조와 불필요한 데이터까지 모두 직렬화하기 때문에, 데이터의 크기가 커지고 데이터 전송 시간이 오래 걸리는 단점이 있습니다.

또한 Serializable은 객체의 내부 구조에 대한 정보가 노출되어 보안 문제가 발생할 수 있습니다.

그래서, 최근에는 JSON 등의 데이터 포맷을 사용하여 객체의 직렬화를 하는 경우가 많아지고 있습니다. JSON은 간단하고 빠르며, 데이터 크기가 작고 데이터 전송 속도가 빠르며, 보안적으로도 안정적인 장점이 있어 인기가 높습니다.


serialVersionUID 역시 안 사용하는 이유

serialVersionUID는 Java 직렬화 및 역직렬화 할때 필요한 버전 정보입니다.

만약 객체를 직렬화하고 클래스에 멤버변수가 추가된다면 java.io.InvalidClassException 예외가 발생하게 됩니다. Java 직렬화 스펙을 살펴보면 아래와 같습니다.

serialVersionUID 필수 값은 아닙니다.

  • 호환 가능한 클래스는 serialVersionUID 값이 고정되어 있습니다.

  • serialVersionUID가 선언되어 있지 않으면 클래스의 기본 해쉬값을 사용합니다.

  • 위의 스펙을 살펴보면 변경에 취약한 클래스가 변경되면 역직렬화 시에 예외가 발생할 수 있으니 개발자가 serialVersionUID 값을 직접 관리해주어야 혼란을 줄일 수 있다는 것을 의미하기도 합니다.

하지만 그럼에도 불구하고 또 다른 문제가 발생할 수 있습니다.

만약 기존의 직렬화된 객체의 멤버 변수의 타입이 바뀐다면 마찬가지로 java.io.InvalidClassException 예외가 발생합니다. 이걸 보면 Java 직렬화는 상당히 타입에 엄격하다는 것을 알 수 있습니다.

즉, 특별한 문제가 없으면 Java 직렬화 버전 serialVersionUID 값은 개발 시 직접 관리해줘야 합니다. 값이 동일하다면 멤버 변수 및 메서드 추가는 크게 문제가 되지 않습니다. 또한 멤버 변수 제거 및 이름 변경은 오류는 발생하지 않고 데이터는 누락됩니다.


결론

Java 직렬화를 사용할 경우 역직렬화를 할 때 예외가 생길 수 있다는 사실을 인지하고 반드시 예외 처리를 해야합니다. 또한 자주 변경되는 비즈니스적인 데이터를 Java 직렬화을 사용하지 않습니다. 긴 만료시간을 가지는 데이터는 객체직렬화의 대안으로 XML, JSON 등 다른 포맷을 사용하여 저장합시다.

사실상 지금 웹개발 상의 Java에서 객체의 직렬화(Serialization) 기술의 대안은 JSON이 자리잡았습니다.



참고

profile
배운 것을 기록합니다.

0개의 댓글