- 리뷰 상세 페이지 조회시, 업로드된 실제 시간과 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구나! 하고 제대로 인식하게 되면서 제시간으로 보여주게 된다.