❐ Description
Redis를 사용할 때 데이터를 저장/조회 하는 과정에서 직렬화와 역직렬화는 필수적으로 이루어진다.
그래서 오늘은 Java의 직렬화 & 역직렬화 부터 다시 알아보고, 순서대로 SpringBoot, Redis에서
직렬화와 역직렬화를 할 수 있는 방법에 대해서 공부하자.
❐ Java에서 직렬화 & 역직렬화 사용하기
우선 자바 직렬화를 사용하기 위해선 아래의 functionalInterface를 사용해야 한다.
package org.springframework.core.serializer;
@FunctionalInterface
public interface Serializer<T> {...}
위 인터페이스를 정의해줘야 하는 이유는 아래의 코드에서 확인할 수 있다.
@Override
public void serialize(Object object, OutputStream outputStream) throws IOException {
// 🔥 Serializable 확장 여부 확인
if (!(object instanceof Serializable)) {
throw new IllegalArgumentException(getClass().getSimpleName() + " requires a Serializable payload " +
"but received an object of type [" + object.getClass().getName() + "]");
}
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(object);
objectOutputStream.flush();
}
❐ Java 직렬화 & 역직렬화 문제점
이펙티브 자바 읽은 후 정리
❐ Java 직렬화의 대체 기술 (Jackson 라이브러리)
Jackson을 사용하기 위해서는 우선 의존성을 설정해야 하고, ObjectMapper를 사용하게 된다.
implementation("com.fasterxml.jackson.core:jackson-databind:2.18.2")
🧩 java object ⇨ json ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯
@Test
void objectMapperTest1() throws JsonProcessingException {
// given
Member member = Member.newOne(UUID.randomUUID(), "gilbert");
// when
ObjectMapper objectMapper = new ObjectMapper();
// then
String string = objectMapper.writeValueAsString(member);
// {"id":"3cf9887d-e5bd-41ab-8bfe-672b43b86ca5","name":"gilbert"}
System.out.println(string);
}
🧩 json ⇨ java object ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯
@Test
void objectMapperTest2() throws JsonProcessingException {
// given
ObjectMapper objectMapper = new ObjectMapper();
String jsonData = "{ \"id\":\"8a811c0d-b0b2-4ded-b13c-7af469878ea5\",\"name\":\"gilbert\"}";
// when
Member member = objectMapper.readValue(jsonData, Member.class);
// then : id :8a811c0d-b0b2-4ded-b13c-7af469878ea5&name :gilbert
System.out.println(member.toString());
}
이외에도 Protobuf(Protocol Buffers), Avro, Redis 전용 직렬화 클래스가 있다.
'Langauge > Java' 카테고리의 다른 글
Comparable, Stream을 사용하여 뱃지 부여하기 (0) | 2024.10.10 |
---|---|
Generic 제대로 알아보기. (0) | 2024.06.16 |