-
Notifications
You must be signed in to change notification settings - Fork 0
Jackson Timezone 직렬화가 되지 않던 문제 해결 #212
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
4b3d8e2
727ab99
b4ef49b
7c74fd0
b014aab
1b8e61c
f5fe33e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,13 +1,19 @@ | ||
| package site.icebang.global.config; | ||
|
|
||
| import java.time.Duration; | ||
| import java.util.TimeZone; | ||
|
|
||
| import org.springframework.boot.web.client.RestTemplateBuilder; | ||
| import org.springframework.context.annotation.Bean; | ||
| import org.springframework.context.annotation.Configuration; | ||
| import org.springframework.context.annotation.Primary; | ||
| import org.springframework.http.client.SimpleClientHttpRequestFactory; | ||
| import org.springframework.web.client.RestTemplate; | ||
|
|
||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||
| import com.fasterxml.jackson.databind.SerializationFeature; | ||
| import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; | ||
|
|
||
| /** | ||
| * 애플리케이션의 웹 관련 설정을 담당하는 Java 기반 설정 클래스입니다. | ||
| * | ||
|
|
@@ -51,4 +57,27 @@ public RestTemplate restTemplate(RestTemplateBuilder builder) { | |
| // 3. 빌더에 직접 생성한 requestFactory를 설정 | ||
| return builder.requestFactory(() -> requestFactory).build(); | ||
| } | ||
|
|
||
| /** | ||
| * Z 포함 UTC 형식으로 시간을 직렬화하는 ObjectMapper 빈을 생성합니다. | ||
| * | ||
| * <p>이 ObjectMapper는 애플리케이션 전역에서 사용되며, 다음과 같은 설정을 적용합니다: | ||
| * | ||
| * <ul> | ||
| * <li>JavaTimeModule 등록으로 Java 8 시간 API 지원 | ||
| * <li>timestamps 대신 ISO 8601 문자열 형식 사용 | ||
| * <li>UTC 타임존 설정으로 Z 포함 형식 보장 | ||
| * </ul> | ||
| * | ||
| * @return Z 포함 UTC 형식이 설정된 ObjectMapper 인스턴스 | ||
| * @since v0.0.1 | ||
| */ | ||
| @Bean | ||
| @Primary | ||
| public ObjectMapper objectMapper() { | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 전역 잘된 점 (Pros)
추가 제안 (고려 사항)
결론적으로, 이 코드는 안정적이고 예측 가능한 데이터 처리를 위한 훌륭한 기반을 마련한 매우 잘 작성된 설정입니다. |
||
| return new ObjectMapper() | ||
| .registerModule(new JavaTimeModule()) | ||
| .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) | ||
| .setTimeZone(TimeZone.getTimeZone("UTC")); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instant와Timezone을 나누어 사용하는 이유는 데이터의 정확성과 시스템의 유연성을 모두 확보하기 위함이며, 이는 서버 개발의 표준적인 모범 사례입니다.Instantvs.Timezone왜 나누어서 사용해야 하는가?
서버는 전 세계 어디서든 동작할 수 있고, 사용자 또한 전 세계 어디서든 접속할 수 있습니다. 이때 시간 데이터를 모호하게 처리하면 심각한 문제가 발생할 수 있습니다.
1. 데이터 무결성 보장: 서버는
Instant를 사용서버 내부, 특히 데이터베이스에 시간을 기록할 때는 전 세계적으로 동일한 절대적인 시점을 나타내는
Instant(UTC 기준)를 사용해야 합니다.장점: 서울에 있는 서버가 기록한
Instant값과, 나중에 미국에 있는 서버가 그 값을 읽었을 때, 두 서버는 완벽하게 동일한 물리적 순간을 이해하게 됩니다. 만약 "2025년 9월 26일 오후 4시"와 같이 지역 시간으로 저장했다면, 이것이 한국 시간인지 미국 시간인지 알 수 없어 데이터의 정합성이 깨집니다.2. 유연한 표현: 사용자는
Timezone이 적용된 시간을 봄사용자에게 시간을 보여줄 때는, 서버에 저장된 절대적인
Instant값에 사용자의 지역Timezone을 적용하여 변환한 후 보여줍니다.장점: 한국에 있는 사용자는 "오후 4시"로 보고, 동시에 접속한 미국 사용자는 "오전 3시"로 보게 됩니다. 이처럼 단 하나의
Instant데이터만으로 전 세계 모든 사용자에게 각자의 지역 시간에 맞는 올바른 정보를 제공할 수 있습니다.코드 리뷰 관점에서의 결론
현재 프로젝트에서
TaskRun과 같은 도메인 모델에는Instant를 사용하여 서버 내부의 데이터 정확성을 확보하고,TaskRunDto와 같은 DTO에서는 이를String으로 변환하여 외부(클라이언트)에 명확한 정보를 제공하는 방식은, 이러한 역할과 책임을 완벽하게 분리한 매우 훌륭하고 표준적인 설계입니다.