CS
[CS] 직렬화
j9972
2023. 1. 7. 23:10
728x90
자바 직렬화
자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있게 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 얘기한다.
직렬화 : 객체 or 데이터 <내부> → 바이트 형태의 데이터<외부> , 역직렬화 : 바이트 형태의 데이터<외부> → 객체 or 데이터<내부>
인터페이스 Serializable
public interface Serializable { }
Serializable 인터페이스는 메소드가 하나도 없다 → 그러면 왜 존재할까?
개발을 하다보면, 생성한 객체를 파일로 저장하는 경우, 저장한 객체를 읽는 경우, 다른 서버에서 생성한 객체를 받는 경우 등등이 있다. 이런 경우에 이 인터페이스가 필요하다
결론적으로,
1. 우리가 만든 클래스가 파일에 읽거나 쓸 수 있게 하기 위해
2. 다른 서버로 보내거나 받을 수 있도록 하기
1,2를 위해서 반드시 이 Serializable 인터페이스를 구현해야 합니다.
직렬화 조건
- java.io.Serializable인터페이스를 상속받은 객체는 직렬화할 수 있는 기본조건입니다.
직렬화 사용 방법
- java.io.ObjectOutputStream 를 사용하여 직렬화를 진행합니다.
public static void main(String[] args){
Member member = new Memer("김배민", "deliverykim@baemin.com", 25);
byte[] serializeMember;
try(ByeArrayOutputStream baos= new ByteArrayOutputStream()){
try(ObjectOutputStream oos= new ObjectOutputStream(baos)){
oos.writeObject(member);
// serializedMember -> 직렬화된 member 객체
serializedMember = baos.toByteArray();
}
}
//바이트 배열로 생성된 직렬화 데이터를 base64로 변환
System.out.println(Base64.getEncoder().encodeToString(serializedMember));
}
부모 클래스가 직렬화 했으면, 자식도 직렬화가 가능하다
public class SuperUserInfo implements Serializable {
String name;
String password;
}
public class UserInfo extends SuperUserInfo {
int age;
// 하지만,
Object object = new Object(); // Object 객체는 직렬화할 수 없다.
}
역직렬화 조건
- 직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야하며 import 되어 있어야 합니다.
- 중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야합니다.
- 자바 직렬화 대상 객체는 동일한 serialVersionUID 를 가지고 있어야 합니다.
역직렬화 방법
- java.io.ObjectInputStream 를 사용하여 역직렬화를 진행합니다
직렬화가사용되는 부분
- 서블릿 세션 → 파일 저장, 세션 클러스터링, DB 저장시 사용
- 캐시 → ex) Redis
- 자바 RMI → 원격 시스템 간 메세지 교환을 위해 자바에서 지원하는 기술
직렬화 단점
- 역직렬화시 클래스 구조 변경 문제가 있다.
- 직렬화는 타입에 엄격하다.
- 멤버 변수가 빠지면, Exception 대신 null 값이 들어간다
- Data Size 문제
결론
- 외부 저장소로 저장되는 데이터는 짧은 만료시간의 데이터를 제외하고 자바 직렬화를 사용을 지양합니다.
- 역질렬화시 반드시 예외가 생긴다는 것을 생각하고 개발합니다.
- 자주 변경되는 비즈니스적인 데이터를 자바 직렬화를 사용하지 않습니다.
- 긴 만료 시간을 가지는 데이터는 JSON 등 다른 포맷을 사용하여 저장합니다.
참조
https://devlog-wjdrbs96.tistory.com/268
https://go-coding.tistory.com/101#:~:text=자바시스템 내부에서 사용,데이터를 변환하는 기술.