Object 또는 Data를 다른 컴퓨터의 자바 시스템에서도 사용할 수 있도록 바이트 스트림(stream of bytes) 형태로 연속적인
데이터로 변환하는 포맷 변환 기술
시스템적인 방식 : JVM의 힙(heap) 혹은 스택(stack) 메모리에 상주하고 있는 객체 데이터를 직렬화를 통해 바이트
형태로 변환하여 데이터베이스나 파일과 같은 외부 저장소에 저장해두고, 다른 컴퓨터에서 이 파일을 가져와
역직렬화를 통해 자바 객체로 변환해서 JVM 메모리에 적재하는 것으로 보면 된다.
→ 다른 곳에서 사용할 수 있도록 Byte로 변환해준다고 이해했다. 즉 직렬화는 Object → Byte,
역직렬화는 Byte → Object
직렬화 사용처
휘발성이 있는 캐싱 데이터를 영구 저장이 필요할 때 사용할 수 있다.
JVM의 메모리에서만 상주되어 있는 객체 데이터가 시스템이 종료되더라도 나중에 다시 재사용이
될 수 있을 때 영속화(Persistence)를 해두면 좋다.
→ JVM은 데이터가 끝나면 휘발이 되어버리기 때문에 따로 저장해서 재사용하면 좋다.
서블릿 세션(Servlet Session)
- 세션 데이터를 저장 공유가 필요할 때 직렬화 이용
- 세션 데이터를 데이터베이스에 저장할 때
- 톰캣의 세션 클러스터링을 통해 각 서버 간에 데이터 공유가 필요할 때
https://wingerms.tistory.com/144
[ 세션 클러스터링(Session Clustering) ]
세션 클러스터링은 WAS가 두 대 이상 설치되어 있을을 경우 동일한 세션으로 세션관리를 하는 것을 의미한다.동일한 세션으로 여러 곳에서 사용할 수 있게 관리하는 것. 동시 접속자가 많은 경
wingerms.tistory.com
캐시(Cache)
- 데이터베이스로부터 조회한 객체 데이터를 다른 모듈에서 DB에서 조회하는 것이 아니라
객체를 직렬화해 메모리나 외부 파일에 저장해 두었다가 역직렬화하여 사용하는 데이터로서
사용이 가능하다.
- Redis, Memcached와 같은 캐시 DB를 많이 사용하는 편
장점
자바 시스템에서 개발에 최적화되어 있다.
→ 기본형(int, double, String)타입이나 배열(array)같은 타입들은 공통적으로 사용하므로 문제가 되지 않는다.
그러나 자바의 Collection이나 클래스 인터페이스 타입들에서 자료형에 대한 문제가 발생한다.
단점
1. 용량이 크다. JSON대비 2배가 크다.
2. 역직렬화는 보안에 취약하다.
→ 역직렬화 과정에서 호출되어 잠재적으로 위험한 동작을 수행하는 메서드를 가젯(gadget)이라고 부른다.
바이트 스트림을 역직렬화하는 ObjectInputStream의 readObject() 메서드를 호출하게 되면 객체 그래프가
역직렬화되어 classpath안의 모든 타입의 객체를 만들어 내게 되는데, 해당 타입 객체 안의 모든 코드를
수행할 수 있게 되므로 나의 프로그램 코드 전체가 공격 범위에 들어간다.
'Java > 이론' 카테고리의 다른 글
[ int, double, float, NULL ] (0) | 2024.07.06 |
---|---|
[ static ], [ final ] (0) | 2024.07.05 |
[ Java ] vs [ SQL ] (0) | 2024.07.05 |
Javax → Jakarta (0) | 2024.06.28 |
제네릭(Generic) (0) | 2024.06.27 |