Langauge/Java

직렬화 & 역직렬화

gilbert9172 2025. 1. 5. 02:42

 

❐ 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 전용 직렬화 클래스가 있다.