-
Java에서 Serializable은 무엇일까? 직렬화 vs 역직렬화스터디 노트 2023. 12. 4. 10:30
우리가 코드를 작성하다보면 직렬화/역직렬화에 대해 고민을 하게 됩니다.
직렬화와 역직렬화는 대체 왜 쓰는걸까요?
일단 직렬화 대상 객체의 소스 코드를 확인해보겠습니다.
// 직렬화 대상 객체 class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // Getters & Setters }
대체 이러한 serializable과 직렬화/역직렬화는 무엇이며, 왜 사용하는 것인지에 대해 간략하게 알아보도록 하겠습니다.
📌 왜 쓰는가?
직렬화 코드는 뭐..번거롭다면 번거롭겠지만, 우선 왜 추가를 해야 하는지 개발하는 입장에선 약간 의미가 모호합니다.
그럼 우리가 이걸 왜 사용해야 하는지부터 확인을 해볼까요?
일단 직렬화라는 것은 데이터를 디스크에 저장하거나 네트워크 간 통신에서 사용하기 위한 형식으로 변환하는 것을 말합니다. 택배 포장을 해서 보내기 위해 밀봉하는 것을 생각하시면 쉬울 것 같네요.
역직렬화의 경우 직렬화와 반대로 데이터를 디스크에서 꺼내서 읽거나 네트워크 통신으로 전달 받은 데이터를 메모리에 올릴 수 있도록 사용하기 위한 형식으로 다시 변환하는 것을 말합니다.
이는 포장된 택배를 사용하기 위해 개봉하는 거을 생각하시면 쉬울 것 같습니다.
사실 매번 이렇게 포장하고 뜯고, 이런 작업을 해야 데이터를 송수신할 수 있다는 것이 참 번거로운 것은 사실입니다.
그럼 이걸 대체 왜 해야할까요?
직렬화가 필요한 이유는 메모리 구조에 기인합니다.
우리가 사용하는 데이터의 메모리 구조는 크게 두 가지로 나뉩니다.
✅ 값 형식(Value Type) 데이터 : 흔히 선언해서 사용하는 타입(int, char 등)을 말하며, 스택에 쌓이고 직접 접근이 가능.
✅ 참조 형식(Reference Type) 데이터 : Object 타입 등 해당 형식의 변수를 선언하면 힙에 메모리가 할당되고 스택에선 이 힙의 참조 주소값만 가지고 있는 방식.
여기서 디스크에 값을 저장하거나 통신에 사용할 수 있는 데이터 메모리 구조 타입은 '값 형식' 데이터만 가능합니다.
참조형식의 경우 데이터가 실제하는 것이 아니라 할당된 메모리의 주소값을 갖고 있는 것이기에 저장, 통신용으로는 사용할 수가 없는거죠.
직렬화를 하게 되면 각 주소 값이 가지는 모든 데이터들을 가져와서 하나의 완벽한 값 형식 데이터로 변환하여 통신에 사용하게 됩니다.
결국 위와 같은 이유들로 데이터를 저장하거나 통신에 사용할 때 데이터 직렬화 작업이 필요해지는 것입니다.
직렬화된 데이터들은 언어에 따라 텍스트 또는 바이너리 형태가 되는데, 이때 저장하거나 통신시 파싱 가능한 유의미한 데이터가 되는 것이죠.
객체의 직렬화를 사용할 때는 다음과 같은 사항들을 고려해야 합니다.
✅ 객체가 직렬화 가능해야 합니다.
객체가 직렬화 가능하려면 Serializable 인터페이스를 구현해야 합니다.
✅ 객체의 모든 필드가 직렬화 가능해야 합니다.객체의 필드가 직렬화 가능하지 않으면, 직렬화 과정에서 예외가 발생합니다.
✅ 객체의 참조하는 객체도 직렬화 가능해야 합니다.객체가 참조하는 객체가 직렬화 가능하지 않으면, 직렬화 과정에서 예외가 발생합니다.
위 사항들을 고려하여 클래스를 직렬화하여 사용하면 됩니다.
물론 JSON의 경우 다양한 직렬화/역직렬화 라이브러리(예를 들면 jackson!)들이 있기 때문에 보다 쉽게 Serializable을 사용할 수 있습니다.
(물론 굳이 치지 않아두 되구요😁)
'스터디 노트' 카테고리의 다른 글
@Transactional 사용 시 주의해야 할 사항들 (1) 2023.12.04 @Transactional 애너테이션에 대하여 (1) 2023.12.04 Aspect Oriented Programming(AOP) 에 대하여 (0) 2023.11.23 모놀리식 아키텍쳐 vs 마이크로 서비스 아키텍쳐 (Monolithic Architecture vs Micro Service Architecture) (1) 2023.11.23 [Java] CompletableFuture 에 대하여 (0) 2023.11.22