본문 바로가기

프로그래밍/Java

Serializable(1)

반응형

Serializable(1)

날짜: 2021년 6월 11일

학습목표

Serializable과 NIO에대해서 알아보자. 그 중 이번 포스팅에서는 Serializable에 대해서만 알아보겠다. 프로젝트에서 객체에 Serializable을 구현해주지 않아서, 오류가 난적이 있었는데, 다행히?.. 고객사의 담당자분이 직접 디버깅....을 해주시고 Serializable을 써야한다고 말씀해주셨었고, 나는 솔루션 개발자분에게 또 여쭤보는.... 사태가 벌어졌었다. 그때도 멋도모르고 그냥 써야된다! 라고해서 썼었는데, 이번 포스팅을 통해서 Serializable은 무엇인지, 또 왜써야 하는지, 그때 그 프로젝트에서 왜 써야했고, 어떻게 작용했을지 생각해보자.

  • Serializable
  • 객체를 파일에 쓰고 읽는법
  • DMP Serializable 사례 분석

Serializable

생성한 객체를 파일로 저장하거나, 저장한 객체를 읽거나, 혹은 객체를 다른서버로 보내거나, 받을수도 있다. 이때 꼭 필요한것이 Serializable이다. Serializable인터페이스를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할수 있도록 해준다.

  • 자바 시스템 내부에서 사용된 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte형태로 데이터를 변환하는 기술
  • JVM의 메모리에 상주(힙 또는 스택)되어있는 객체 데이터를 바이트 형태로 변환하는 기술

또한 Serializable 인터페이스를 구현 후에는 serailVersionUID라는 변수를 지정하는것을 권장한다. 별도로 지정하지 않았을 경우 컴파일시 JVM이 자동으로 생성해준다.

static final long serialVersionUID = 1L;

반드시 static final long으로 선언해야하며, 변수명도 serialVersionUID로 선언해야한다.

serialVersionUID의 값은 아무런 값이나 지정해도 상관없다. 단, 값을 지정하는 이유는 있기 때문에 필요에 따라 값을 변경할 일이 생긴다.

serialVersionUID란 무엇인가?

이 값은 해당 객체의 버전을 명시하는데 사용된다. A서버에서 B서버로 SerialDTO클래스의 객체를 전송한다고 하자. A서버와 B서버 모두 SerialDTO클래스가 있어야만 한다. 그래야 전송받은 객체가 SerialDTO 클래스의 객체임을 인식한다.

그.런.데 말입니다.

만약 A서버의 SerialdDTO는 변수를 3개, B서버 SerialDTO는 변수를 4개 가지고 있다면 어떻게 될까?

당연하게도 제대로된 처리가 이루어지지 않는다. 따라서, 각 서버가 쉽게 해당 객체가 같은 객체인지를 확인하기 위해서 serialVersionUID로 관리해야한다. 즉, 클래스이름이 같아도, UID가 다르면 다른 클래스로 인식한다는 것이다. (마치 new 연산자로 생성된 ReferenceType같다. 유형과 값이 같아도, 주소값이 다르면 다른 객체로 인식하는 것 처럼!!)

Feedback

매번 느끼지만 자바의신 책은 단어의 정의에 대해서 모호하게 내리는 경향이 있는것 같다. 덕분에 더 찾아보게 되긴 하지만.... 직렬화가 바이트형태로 변환하는 기술임을 알게되자, 앞서 배운 I/O의 스트림이 떠올랐다. 바이트코드를 처리하기위한 스트림.... 아마 직렬화와 관련이 있을것 같다. 오늘은 시간이 없으니 간단히 직렬화의 정의정도에 대해서 알아봤다.

알게된 점

  • Serializable
    • Serializable(직렬화) 의 정의 : 자바시스템 내부의 Object를 타 자바시스템에서도 사용할수 있도록 바이트코드의 형태로 변환하는 기술

알아야할 점

  • 직렬화는 왜쓰는가?
  • 직렬화는 어디에 쓰이는가?
  • 직렬화의 단점
  • 객체를 파일에 쓰고 읽는법
  • DMP Serializable 사례 분석

References

자바 직렬화, 그것이 알고싶다. 훑어보기편 - 우아한형제들 기술 블로그

Java의 직렬화(Serialize)란?

자바의신 VOL2

반응형

'프로그래밍 > Java' 카테고리의 다른 글

Serializable(3)  (0) 2021.06.13
Serializable(2)  (0) 2021.06.13
Java I/O  (0) 2021.06.11
람다와 스트림의 사용법(2)  (0) 2021.06.10
람다와 스트림의 사용법(1)  (0) 2021.06.10