Backend/Java

[Java] 자바 직렬화 / Serializable / 문제점 / 해결책

가은파파 2022. 2. 23. 20:30

학습목표

  • 자바 직렬화
  • Serializable
  • 자바 직렬화 흐름

 


직렬화

  • 객체의 상태를 영속화 하는 메커니즘
  • 객체를 다른 환경에 저장했다가 나중에 재구성할 수 있게 만드는 과정

자바 직렬화

  • 쉬운 분산 객체 생성
  • Byte Stream을 만드는 것
  • 언제 쓰지? 객체 상태를 영속해야 할 필요가 있을 때
    • 어딘가에 저장해야 할 때가 있을때
      • 파일, 데이터베이스, 캐시 메모리
      • 다른 vm으로 객체 정보를 전달해야할 때 바이트 스트림으로 전송해야 할 때
  • 개체 그래프의 보완적인 재구성도 합니다.
  • 경량의 지속성과 소켓, Java RMI 을 지원합니다.
  • 기본적으로 인코딩을 통해 데이터를 보호하고, 자체 인코딩 구현을 할 수도 있습니다.

전체 흐름

자바 직렬화 API

  • 직결화된 데이터를 클래스의 필드와 독립적으로 지정할 수 있는 API를 제공하며 기본 쓰기, 읽기 메커니즘을 제공한다.

 

Serializable

  • 해당 인터페이스를 implements를 해야 한다. 하지 않으면 NotSerializableException이 발생한다.

문제점 (왜 잘 안쓰지?)과 해결책

  • 보안
    • 보이지 않는 생성자, readObject : readObject 생성자로 생성되기 때문에 누군가에 의해 값이 변경될 수 있다.
      • 해결 : 커스텀직렬화에 validation을 처리하여 방어적으로 처리.
public class PositiveNumber implements Serializable{
	public final int value;
    
    public PositiveNumber(final int value){
    	this.value = value;
        checkPositive();
    }
    
    private void checkPositive(){
    	if(this.value < 0){
        	throw new RuntimeException();
        }
    }
    private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException{
    	objectInputStream.defaultReadObject();
        checkPositive();
	}
}
  • 아래와 같이 직렬화 프록시 패턴, writeReplace 를 적용하면 관리포인트를 줄일 수 있다.

  • 유지보수성
  • 테스트
  • 그 외 다수 (ex. 싱글톤 문제, 역직렬화 폭탄 등)
  • 싱글톤 문제
    • 직렬화 - 역직렬화를 거치면 싱글톤 객체의 성격이 없어진다.
  • 아래와 같은 흐름으로 커스텀 직렬화/역직렬화 활용

  • 결론 : json,xml 같은 크로스 커뮤니케이션이 가능한 포맷을 이용하는걸 권장

 

 

출처 : 오라클 자바 공식 문서

https://docs.oracle.com/javase/8/docs/technotes/guides/serialization/index.html

 

Java Object Serialization

Java Object Serialization Object Serialization supports the encoding of objects and the objects reachable from them, into a stream of bytes. Serialization also supports the complementary reconstruction of the object graph from a stream. Serialization is us

docs.oracle.com

https://www.youtube.com/watch?v=3iypR-1Glm0