Redis LocalDateTime 역직렬화 오류
오류에 대해서 설명하기 전에 직렬화와 역직렬화에 대해 설명을 하려고 합니다.
🏷️ 직렬화(Serialization)와 역직렬화(Deserialization)
객체를 데이터로 변환하고, 다시 데이터를 객체로 변환하는 과정을 의미하며, 주로 네트워크 통신이나 파일 저장 등에서 객체를 전송하거나 저장할 때 사용합니다.
✅ 직렬화
직렬화는 객체를 바이트 스트림(데이터를 바이트(byte)의 연속으로 나타낸 것)으로 변환하는 과정입니다. 직렬화를 위해서는 직렬화 가능한 클래스에 Serializable 인터페이스를 구현해야 하지만, Spring Boot에서는 직렬화된 객체를 웹 요청 또는 응답으로 전송할 때 자동으로 직렬화를 수행합니다.
Spring Boot 에서는 일반적으로 웹 요청이나 응답에서 객체를 직렬화를 하는데, 예를 들어, RESTful API에서 JSON 형식의 데이터를 전송할 때 해당 객체가 직렬화 됩니다.
✅ 역직렬화
역직렬화는 직렬화된 객체를 다시 원래의 객체로 변환하는 과정입니다. Spring Boot에서는 클라이언트가 서버에게 전송한 웹 요청의 본문(JSON 형식의 데이터)을 해당 객체로 역직렬화하여 컨트롤러 메서드의 매개변수로 전달하게 됩니다.
✔️ 이번 오류의 핵심 메세지
일반적으로 엔티티 클래스를 직렬화하는 것은 권장되지 않습니다. 엔티티 클래스는 데이터베이스와의 상호작용을 담당하도록 하며, 직렬화와는 직접적인 관련이 없도록 하는 것입니다.
대신 DTO(Data Transfer Object)나 VO(Value Object) 클래스를 사용하여 데이터 전송이나 특정 목적에 필요한 데이터를 포장하고, 이러한 객체를 직렬화하여 전송하는 것이 더 적절합니다. 이렇게 함으로써 엔티티 클래스와 DTO/VO 클래스를 분리하여 엔티티 클래스를 변경하지 않고도 직렬화 및 데이터 전송에 대한 유연성을 확보할 수 있습다.
🏷️ 해결 방법
위에서 설명하였듯 스프링부트에서는 직렬화/역직렬화를 자동으로 수행해주기 때문에 크게 신경쓰지 않아도 될 때가 많지만 예외가 있었으니, 바로 LocalDateTime 과 LocalDate 타입을 처리할때 입니다. 이 두 타입은 자바 8부터 등장한 날짜와 시간을 나타내는 타입으로서, 직렬화를 위한 추가 작업이 필요합니다.
그래서 Jackson 라이브러리 같은 직렬화 대안 라이브러리를 사용하여 객체를 직렬화할 수 있습니다. Jackson은 기본적으로 LocalDateTime과 LocalDate를 지원하지 않지만, 직렬화 및 역직렬화를 커스터마이징할 수 있는 기능을 제공하는데, 예를 들어, Jackson에서는 커스텀 시리얼라이저 및 디시리얼라이저를 작성하여 아래와 같이 LocalDateTime과 LocalDate를 원하는 형식으로 직렬화하거나 역직렬화할 수 있습니다.
✅ 의존성 설치
// redis LocalDateTime 문제 해결을 위한 JavaTimeModule 추가
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
✅ 날짜 형식 처리가 필요한 곳에 어노테이션 적용
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm")
@Column(name = "created_at")
private LocalDateTime createdAt;
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm")
@Column(name = "modified_at")
private LocalDateTime modifiedAt;
📖 Reference
'코딩 공부 > web & Java' 카테고리의 다른 글
[Spring / WebSocket] WebSocket와 STOMP (0) | 2024.10.05 |
---|---|
[Spring / SSE] SSE(Server Sent Event) (1) | 2024.10.04 |
[Spring / Vue] Spring과 Vue를 연동시 주소로 입력하면 오류나는 문제 (1) | 2024.10.03 |
[Java / TDD] 테스트 케이스 작성시 발생한 영속성 관련 오류 (0) | 2024.08.28 |
[JWT] JWT 0.12.5 최신화 문제 해결 (0) | 2024.07.20 |