보통 Java, Json-Serialization 라는 단어들을 사용하여 직렬화를 이야기 하곤 한다.
위키백과에서의 '직렬화'에 대한 설명
컴퓨터 과학 의 데이터 스토리지 문맥에서 데이터 구조 나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장(이를테면 파일 이나 메모리 버퍼 에서, 또는 네트워크 연결 링크 간 전송)하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다.
요약하면 ⇒ 데이터 구조나 Object(객체)를 저장이나 전송에 적합한 다른 데이터 형식으로 변환하는 과정
이러한 과정을 마샬링 이라고도 하는데, 마샬링은 파이썬 표준 라이브러리(Python standard library)에서 "직렬화하다"는 용어와 동일하게 간주되지만, 자바 계열 RFC 2713에서는 동일하게 간주되지 않는다.
이어서, Java 에서 제공하는 Serializable 인터페이스의 코드를 들여다 보면
public interface Serializable {
} // 이게 다야?
그렇다. 안에 아무 코드도 없다. ⇒ 왜 존재하는 거지?
개발을 하다 보면 아래와 같은 경우가 생길 수 있다.
- 생성한 객체를 파일로 저장
- 저장한 객체를 읽기
- 다른 서버에서 생성한 객체를 받음
⇒ 우리가 만든 객체를 저장하거나, 읽거나, 남이 만든 객체를 읽어 와야 할 수도 있다는 것이다.
Serializable 인터페이스를 구현하면, 객체를 저장하고, 읽고, 다른 서버로 전송할 수 있도록 해준다.
1. Java 에서 직렬화
자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술, 그리고 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러 통칭한다. [객체 ⇔ 바이트]
시스템적으로 이야기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기합니다.
2. Json-Serialization 에서의 직렬화
XML, JSON과 같은 포맷을 이용한 직렬화도 가능한데, 일반적인 웹서비스에서는 Json을 보통 사용한다. [객체 ⇔ Json]
JSON 파싱, 처리 라이브러리를 사용하여 자바 객체를 JSON으로 직렬화하거나 JSON 데이터를 자바 객체로 역직렬화할 수 있다. 여기서는 Jackson 을 사용한다.
2-1. Object to JSON(직렬화)
pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>
Java
List<Member> memberList =newArrayList<>();
memberList.add(newMember("Kate", 30, "1234"));
memberList.add(newMember("Jason", 23, "5678"));
memberList.add(newMember("Aaron", 35, "9012"));
ObjectMapper mapper = newObjectMapper();
// object to json
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
mapper.writeValue(newFile("test.json"), memberList);
test.json
[
{
"id": 1001,
"name": "Kate",
"age": 30
},
{
"id": 1002,
"name": "Jason",
"age": 23
},
{
"id": 1003,
"name": "Aaron",
"age": 35
}
]
2-2. JSON to Object(역직렬화)
java
ObjectMapper mapper =newObjectMapper();
// json to object
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
mapper.writeValue(newFile("test.json"), memberList);
System.out.println(mapper.readValue(newFile("test.json"),newArrayList<Member>().getClass()));
configure()는 transient 처리를 위해 추가한 코드이다.
필드에 직접 @JsonIgnore 애노테이션을 붙여도 된다.
transient : 직렬화하려는 클래스에 직렬화할 수 없는 객체를 포함하고 있으면 transient를 붙여 직렬화 대상에서 제외하고 직렬화할 수 있다. (transient 필드는 역직렬화 시 null(참조형) 또는 타입의 기본값으로 반환)
결과
[
{
id = 1001,
name = Kate,
age=30
},
{
id = 1002,
name = Jason,
age = 23
},
{
id = 1003,
name = Aaron,
age = 35
}
]
Process finished with exit code 0
'개발 공통 기술' 카테고리의 다른 글
JWT (2) | 2024.11.04 |
---|---|
이미지 파일에 대한 이해 (4) | 2024.10.23 |
JWT 는 만능이 아니다. (0) | 2022.12.12 |