ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CS] 직렬화
    CS 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 → 원격 시스템 간 메세지 교환을 위해 자바에서 지원하는 기술

     

    직렬화 단점

    1. 역직렬화시 클래스 구조 변경 문제가 있다.
    2. 직렬화는 타입에 엄격하다.
    3. 멤버 변수가 빠지면, Exception 대신 null 값이 들어간다
    4. Data Size 문제

     

    결론

    • 외부 저장소로 저장되는 데이터는 짧은 만료시간의 데이터를 제외하고 자바 직렬화를 사용을 지양합니다.
    • 역질렬화시 반드시 예외가 생긴다는 것을 생각하고 개발합니다.
    • 자주 변경되는 비즈니스적인 데이터를 자바 직렬화를 사용하지 않습니다.
    • 긴 만료 시간을 가지는 데이터는 JSON 등 다른 포맷을 사용하여 저장합니다.

     

    참조

    https://devlog-wjdrbs96.tistory.com/268

    https://go-coding.tistory.com/101#:~:text=자바시스템 내부에서 사용,데이터를 변환하는 기술.

    'CS' 카테고리의 다른 글

    [CS] batch Insert  (0) 2023.01.09
    [CS] 동적 프록시  (0) 2023.01.07
    [CS] JPA 영속성 컨텍스트  (0) 2023.01.06
    [CS] 스프링부트를 쓰는 이유와 자동설정 원리  (0) 2023.01.05
    [CS] AOP  (0) 2023.01.04
Designed by Tistory.