안녕하세요 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의 직렬화에 대한 소개였습니다.
오류 사항은 댓글 부탁드립니다.
감사합니다.
'주니어 기초 코딩공부' 카테고리의 다른 글
JAVA JDBC 사용 방법_드라이버 로드, DB 연결 방법, 연결테스트(이클립스&오라클) (0) | 2022.12.23 |
---|---|
TCP 와 UDP 차이점 (0) | 2022.12.09 |
Java 입출력 (In/Out), Scanner 클래스 설명 (4) | 2022.12.06 |
JAVA 게시판 만들기_비밀번호가 같으면 삭제할 수 있도록 코드 작성 (0) | 2022.12.02 |
15장 컬렉션 프레임워크 (0) | 2022.12.01 |