주니어 기초 코딩공부

Java 직렬화를 하는 이유가 무엇일까? Serializable 인터페이스 설

jju_developer 2022. 12. 7. 21:37
728x90

안녕하세요 jju_developer 입니다.

 

오늘은 Java 직렬화에 대해 간단하게 소개하는 시간을 갖겠습니다.

 

✔Java 직렬화란 무엇일까요?

Java 직렬화를 하는 이유가 무엇일까?
프로젝트를 진행하다 보면 클래스에서 Serializable 인터페이스를 구현하는 장면을 종종 볼 수 있습니다.
그렇다면, 직렬 화가 무엇인지에 대해서 알아보도록 하겠습니다.

✔Java 직렬화

 객체 입출력 보조 스트림을 사용할 때 직렬화라는 내용이 자주 등장합니다.


 객체를 파일 또는 네트워크로 입출력할 수 있는 기능 제공
• 객체는 문자가 아니므로 바이트 기반 스트림으로 출력해야 한다.
• 객체를 출력하기 위해서는 객체의 데이터(필드 값)를 일렬로 늘어선 연속적인 바이트로 변경해야 한다.

• 직렬화: 객체, 데이터를 byte 형태로 변환

 역직렬화: 바이트로 변환된 데이터를 다시 객체로 변환

 

그렇다면 다른 클래스들도 직렬 화가 가능할까요?

자바에서는 Serializable 인터페이스를 구현한 클래스만 직렬화 할 수 있도록 제한하였으며, transient 필드는 제외됩니다.

객체에 들어있는 필드들을 쪼개서 객체 직렬화를 하게 됩니다.

객체 직렬화를 할 때에 private 필드 포함한 모든 필드를 바이트로 변환이 가능합니다.

 

✔Java 직렬화 사용법

직접 데이터를 문자열 형태로 확인 가능한 직렬화 방법입니다.

SerialVersionUID는 필수 값이 아니지만, 호환 가능한 클래스에서는 해당 값이 고정되어 개발자가 직접 관리하게 됩니다.

 

serialVersionUID의 값이 동일하면 멤버 변수 및 메서드 추가는 크게 문제가 없습니다.
그리고 멤버 변수 제거 및 이름 변경은 오류는 발생하지 않지만 데이터는 누락됩니다.

 

즉, 출력 시 해당 데이터는 보이지 않게 됩니다.

 

역직렬화는 대상의 클래스 멤버 변수 타입 변경을 지양해야 합니다.

자바는 역직렬화시 엄격하기 때문에 나중에라도 변경사항이 생긴다면 발생할 예외의 경우수를 다 신경 써야 하기 때문입니다.

 

✔serialVersionUID 필드

• 같은 클래스임을 알려주는 식별자 역할

• Serializable 인터페이스 구현 : 컴파일 시 자동적으로 serialVersionUID 정적 필드 추가

• 재 컴파일하면 serialVersionUID의 값이 변경됩니다.

불가피한 수정 있을 경우 명시적으로 serialVersionUID 선언하시면 됩니다.

✔Java 직렬화 예제

 

※writeObject()와 readObject() 매소

부모 클래스가 Serializable 구현하지 않고 자식 클래스가 Serializable을 구현한 경우에는 부모 필드는 직렬화에서 제외됩니다.

위 경우에 부모 클래스의 필드를 직렬 화하려면?

• 방법 1: 부모 클래스가 Serializable 인터페이스를 구현하도록 한다.

• 방법 2: 자식 클래스에서 writeObject() 와 readObject() 메서드를 선언해서 부모 객체의 필드를 직접 출력시킨다.

writeObject() 메서드는 직렬화될 때 자동으로 호출되고, readObject() 메소드는 역직렬화될 때 자동적으로 호출된다. 주의할 점은 접근 제한자가 private가 아니면 자동 호출되지 않기 때문에 반드시 private를 붙여주어야 합니다.

 

 

 

✔Java 직렬화 결론!

자바에서 직렬화를 사용할 때에는 자주 변경되는 클래스의 객체는 사용하지 않으시는 것이 좋습니다.

 

변경에 취약하기 때문에 생각지도 못한 예외가 발생할 수 있습니다.

 

개인적으로 직렬화를 사용할 때에는

외부 저장소로 저장되는 데이터는 자바 직렬화 사용을 지양하며,

역직렬화시에 반드시 예외가 생긴다는 것을 생각하고 개발을 해야겠습니다.

 

변경이 잦은 데이터들은 직렬화를 지양하며, 긴 만료 시간을 가지는 데이터는 JSON등 다른 포맷을 사용하여 저장하여야겠습니다.

 

 

 

이상 기본적인 Java의 직렬화에 대한 소개였습니다.

 

오류 사항은 댓글 부탁드립니다.

 

감사합니다.

 

 

 

 

 

 

 

 

 

728x90