타임존 누락으로 인해 9시간이 사라진 LocalDateTime, createdAt 표시 오류 잡기

후투티·2025년 6월 10일

문제 상황

  • 리뷰 상세 페이지 조회시, 업로드된 실제 시간과 9시간 차이 발생
    • 방금 업로드한 리뷰에 업로드 된 시간이 '9시간 후'로 표시됨

리뷰를 작성하고 등록시간이 잘 들어오나 확인을 하던 중 발견한 이슈이다.

최신 리뷰에는 n분 전으로 잘 나오는데
방금 작성한 동일한 리뷰인데도 불구하고
내가 쓴 리뷰 쪽에 나오는 리뷰에는 '약 9시간 후'로 뜨는 게 아닌가!
아니 지금 썼는데 뭐 미래에서 썼슈?
응답은 제대로 잘 나오는데 왜.... 저렇게 나오지?
요상하네... 일단 FE님께 말씀드려야지

BE : FE님! 9시간 차이가 나는데용? 뭔가 시간 계산에 착오가 있는 걸까요?
FE : 엥??? 둘 다 똑같은 컴포넌트 쓰는데요...?
BE: ???


아니 근데 생각해보니까 9시간?
어디서 많이... 봤는데.....?
타임존...?? 너니...? 나는 KST로 설정해뒀지!

BE : FE님! 9시간 차이인 거 보면 타임존 문제인 것 같아요!
FE : 응답에 타임존이 없어서 동일한 시간을

  • ~에서는 UTC 기준으로,
  • ~~에서는 KST 기준으로
    계산한것 같으니 CreatedAt에 타임존을 추가해서 보내주시면 될 것 같아요!

발생 이유

  • LocalDateTime에는 타임존이 존재하지 않기 때문에 FE에서는 이게 어떤 기준인지 몰라 UTC와 KST를 혼용하게 되어 9시간 차이 발생한 것

근데 LocalDateTime은 타임존이 없어서 편리했던 거 아닌가?
불필요한 타임존 계산 없이 깔끔하게 날짜와 시간만 다루기 때문에 굉장히 편리하다.

그런데 이걸 FE로 전송할때는 타임존이 없어서 어떤 기준으로 해석할지가 애매해진다.
예를 들어서 createdAt: 2025-06-10T12:30:00
FE에 보내면 이게 UTC인지 KST인지를 알 수가 없다.
그래서 어떤 곳에서는 UTC로 해석하기도 하고
어떤 곳에서는 브라우저 시간대(KST)로 해석하기도 하기 때문에
동일한 시간인데도 불구하고 화면마다 다르게 보인 것이다.


문제 해결

  • 문제가 생긴 ReviewResponseDTO의 createdAt, updatedAt 필드에 KST(+09:00) 타임존 정보를 포함하도록 변경

Entity에는 LocalDateTime으로 저장하되,
DTO에는 OffsetDateTime으로 변경하여 +09:00을 포함하여 전송하는 방법이다.

public class ReviewResponseDTO {
  private LocalDateTime createdAt; -> private OffsetDateTime createdAt;
}

이렇게 수정해주고,
서비스 로직에서는

return ReviewREsponseDTO.builder()
.createdAt(review.getCreatedAt().atOffset(ZoneOffset.of("+09:00")))

이렇게 해주면 응답값으로
"createdAt": "2025-06-10T12:30:00.000+09:00"
이렇게 나오게 된다.
그러면 FE쪽에서는 아! 이건 KST구나! 하고 제대로 인식하게 되면서 제시간으로 보여주게 된다.

profile
모르는 건 모른다고 하는 사람

0개의 댓글