The serializable class does not declare a static final serialVersionUID field of type long 해결

Lungnaha·2023년 7월 17일
1

Spring

목록 보기
5/6

🏋🏻‍♀️ 사건(?) 개요

최근 Spring 학습을 진행하면서 위의 사진과 같은 Warning Message가 발생했고, 어떤 것 때문에 발생했고, 해결 방법은 무엇인지 찾아보고 학습한 내용을 글로 기록하고자 합니다.

🎱 문제 원인(feat. 직렬화)

먼저 가장 강렬하고(?) 직관적으로 보이는 단어가 Serializable 입니다.
이는 직렬화로 해석할 수 있고, 이를 간단하게 설명하면 아래와 같습니다.

  • 직렬화
    • Java 시스템 내부에서 사용되는 객체 혹은 데이터를 외부의 Java 시스템에서도 사용할 수 있도록 변환하는 과정을 의미
    • Byte 형태의 데이터로 변환
  • 역직렬화
    • Btye 형태의 데이터를 다시 객체로 변환하는 과정을 의미

cf) 직렬화를 하는 이유?

  • 일반적으로 데이터는 참조형 데이터와 기본형 데이터로 나누어져 있는데, 값을 있는 그대로 가지고 있는 기본형 데이터와는 달리, 참조형 데이터는 메모리의 주소값을 가지고 있음
  • 즉, 참조형 데이터를 있는 그대로 전달한다면 단순히 주소값을 전달하기에 외부에서 데이터를 올바르게 이용할 수 없는 문제 발생
  • 참조형 데이터를 유의미한 데이터(Byte 형태) 형태로 만들어 이용하기 위해 직렬화를 사용

그렇다면, 직렬화에 대해 알았는데, 해당 Warning Message는 왜 발생하는 것인가?
Java에서는 이런 직렬화 대상이 되는 객체에 serialVersion UID를 선언해서 이후에 객체를 제대로 불러오고, 사용할 수 있도록 하는 것을 권장하기에 해당 메시지를 띄워준 것이다!

(참고로, serialVersion UID는 직접 선언하지 않아도 컴파일러가 할당해주는데, 이를 그대로 사용하면 외부의 다른 컴파일러에서 이용할 경우 제대로된 객체를 불러올 수 없다고 한다...)

⛸️ 문제 해결

위의 사진에서도 알 수 있는 것처럼 해당 문제에 대한 권장 해결책은 총 3가지가 존재합니다.

1. Add Default serial version ID
2. Add generated serial version ID
3. Add @SuppressWarnings 'serial' to ...

저는 해당 연습 코딩을 하면서 외부 컴파일러를 사용할 경우도 없을 것 같고, 비교적 간단하게(?) 해당 경고를 무시하고자 3번째 추천 해결책을 사용하였습니다.

@SuppressWarnigs 는 불필요한 경고를 억제해주는 경우 사용하는데, 해당 내용은 회사 업무를 하면서도 많이 접하고, 간단하게 스르륵 넘어갈 내용이 아니라고 생각해 더 깊게 학습하고, 추후 자세한 포스트로 다루어보겠습니다.

🤿 후기..

비교적 간단하게 Warning Message를 처리하였습니다.
그러나, 그 과정에서 Java 직렬화에 대해 어느정도 개념을 잡고, 정리해볼 수 있는 시간이었던 것 같습니다.

profile
Long🌈Now😁Happy💖

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

잘 봤습니다. 좋은 글 감사합니다.

1개의 답글