본문 바로가기

좋아하는 것_매직IT/1.spring

Java serialize(직렬화) 에 대해서 정리하기 (feat. serialVersionUID)

반응형

블로그 목적 :

Java 직렬화 대해서 공부및 정리후 나만의 노하우와 지식을 공유한다.

블로그 요약

· Java 직렬화에 대해서 알아본다.
· serialVersionUID 의미 에 대해서 정리해본다.


블로그 상세 내용

우선, Java 직렬화에 대해서 알아보시죠~!

Java 직렬화에 대해서 정리해 보면...
Java 직렬화는 컴퓨터의 메모리 상에 존재하는 데이터에 대한 처리를 할 때 사용하는 개념이고,  
보통 아래 2가지 경우에 대해서 정상적인 처리를 하기 위해 바이트 스트림 형태로 생성하는 것을 말한다.

 - 예를 들면, 아래 2가지 경우가 있을 수 있는데요...
    - 하나, 파일로써 저장
    - 둘, 통신하는 다른 컴퓨터에게 알맞은 형식으로 전달

여기서 알맞은 형식에 대해서, 저에게 물어보신다면??? 
 - 저는 당당하게!! Java 에서는 "클래스" 를 의미한다고 말씀드릴 수 가 있겠네요...

그런데요...그런데 말이죠? 왜 직렬화란 말이 생겼을까요?
보통, 프로그램에서 사용되는 데이터는 연속적이지 못할 때가 많이 있습니다. 
즉, 이런 연속적이지 못한 부분을 프로그램 내부적으로 "포인터"라는 개념을 사용해서 참조하게 되는데요....
해당 사항은 프로그램이 실행 중일때만 인식할 수 있는 것이죠...

하지만, 다른 컴퓨터와 통신하게 되면, 여기에서 많은 문제점이 발생하게 됩니다. 
즉, 이런 문제점을 해결하기위해서, 그리고 그 대안으로 직렬화가 사용되는건데요...

다시말해서, 다른 컴퓨터와 통신하기전에 흩어져 있는 해당 데이터들을  모아서 포인터가 존재하지 않는 Byte 형태로 생성해서 전달해야 되는 임무가 주어집니다.  이것을 우리는 한마디로 "직렬화"라고 부릅니다. 


참고로, Java 에서는 직렬화를 구현할 때 아래와 같이 클래스 선언시  2가지 작업(?) 을 해주시면 되는데요..
 - 첫번째는, 해당 클래스에 Serializable 을 implements 시켜주시고요.. (참고로,
Serializable  는 "마커 인터페이스" 이기 때문에 따로 구현할 메소드는 존재하지 않습니다.)
 - 두번째는, 해당 클래스에 직렬화 버전 고유 값을 넣어주시면 됩니다. 
    - serialVersionUID (=고유값)

serialVersionUID 값의 의미를 간단히 말씀드리면...
 - 해당 serialVersionUID  값으로, 직렬화/역직렬화를 수행 할 때, 내부적으로 특정 버전에 맞는지 맞지 않는지를 판단하게 됩니다. 

그런데 해당 값은, 옵션 일까요? 아닐까요??
저의 대답은...헷갈리실지도 모르겠는데요
 - 옵션같은 옵션아닌 값인데요.....

즉, 해당 값을 선언하지 않는다고, 직렬화가 불가능하지는 않습니다. 
왜냐하면, Java Spec 에 따르면, 해당 값이 선언되지 않을 경우, 자체적으로 default 값을 만들어 준다고 하네요...

그런데 말입니다.  이부분은 우리가 꼭 머릿속에 넣어두어야 하는데요..
왜냐하면, 자체적으로 default 값을 만들어주는 것은, 우리가 사용하는 컴파일러의 구현에 따라서 달라질 수 있다고 하네요..
만약, 우리가 사용하는 컴파일러가,,,(난 default 로 안만들 꺼얌!! 이렇게 생떼?? 아닌 쌩떼를 부린다면...헐..)
즉, 우리가 이런 컴파일러를 만나서 선언하지 않는다고 한다면, 어이없는 에러에 봉착(?)할 수 있기 때문에,

제 생각으로는 직렬화 할때는, serialVersionUID  를 가급적 선언하시는것을 추천드립니다. !!!
Java spec 를 긁어 왔는데요....

혹시나 영어 울렁증(?) 이 있으신분들을 위해서, 해당 스펙의 요점을 해석해 드리면...
 - serialVersionUID 계산은 컴파일러 구현에 따라 다를 수 있는 클래스 세부 정보에 매우 민감하므로 직렬화 가능한 모든 클래스가 serialVersionUID 값을 명시적으로 선언하는 것이 좋습니다.
따라서 역직렬화 중에 예기치 않은 serialVersionUID 충돌이 발생하여 역직렬화가 실패할 수 있습니다.

라고 하니, 우리는 serialVersionUID  를 가급적 선언하시는것으로 하시죠^^; (Spec 의 충고!!)

감사합니다.  (그럼 결론을 정리해 볼께요..)

결론 

하나, Java 직렬화는 컴퓨터의 메모리 상에 존재하는 데이터에 대한 처리를 할 때 사용하는 개념이고,  아래 2가지 경우 관련 정상적인 처리를 하기 위해 바이트 스트림 형태로 생성하는 것을 말한다.

 - 예를 들면, 아래 2가지 경우가 있을 수 있다.
    - 하나, 파일로써 저장
    - 둘, 통신하는 다른 컴퓨터에게 알맞은 형식으로 전달

둘, serialVersionUID 값의 의미는...
 - 해당 serialVersionUID  값으로, 직렬화/역직렬화를 수행 할 때, 내부적으로 특정 버전에 맞는지 맞지 않는지를 판단하게 됩니다. 

오늘도 마지막까지 제 글을 끝까지 읽어주셔서 진심으로 감사드리고, 제 글이 조금이라도 여러분의 각자의 삶을 살아가시는데 도움이 되셨길 기원합니다.
앞으로도 더욱 좋은 블로그를 남기는 제가 되도록 노력하겠습니다.

그리고, 제 글을 읽으시면 말이 됩니다.

항상 말에는 반드시 삶을 움직이는 힘이 있습니다.

제가 열심히 정성스럽게 정리한 저만의 지식과 1일 1블로그하는 제 블로그에 담긴 글들을 통해서,

여러분들의 삶과 운명을 반드시 조각하고 움직이시길 기원합니다.

이상입니다. 감사합니다.

728x90
300x250