RDS에 저장을 할 때, RDS에서는 저장 시간을 국제 표준시 UTC
로 저장이 된다...
마니또 쪽지를 보낼 때, RDS에 저장이 되고 나중에 다시 보낸 쪽지함과 받은 쪽지함에서 조회를 할 때 문제가 생겼다.
자정이 지난 시간에 쪽지는
2023-07-21
이 나와야한다.
하지만 계속 전날로 날짜가 찍혔다.
그래서 RDS를 보니 UTC 기준으로 데이터가 저장되고 있었다.
코드를 테스트할 때는 로컬에서 하다보니까 여기까지는 생각도 하지 못했다.
그래서 9시간을 더해서 저장을 할 수 있도록 코드를 구현하였다.
Auditing
을 사용하였고, LocalDateTime
으로 만들었다.
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime now;
private LocalDateTime createdAt = now.plusHours(9);
LocalDateTime
으로 현재시간에 9시간을 더해주는 코드를 작성하였다.
하지만 이렇게 하게 되면 now
라는 column
이 하나 더 생긴다.
필요하지 않은, 사용하지 하는 column
이 생긴다는 아주 큰 단점이 생겼다.
그래서 합쳐보았다.
private LocalDateTime createdAt = LocalDateTime.now().plusHours(9);
이렇게 합쳐서 사용하지 않는 now
column
을 생성하지 않도록 하였다.
하지만 이렇게 구현했을 때는 다시 9시간이 더해지지 않았다.
뭐가 문제인지 모르겠다.
그래서 다른 방법을 찾아보았다.
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt = new Date();
@PrePersist
public void prePersist() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.HOUR, 9);
createdAt = calendar.getTime();
}
@PrePersist
: DB 에 해당 테이블의 insert
가 실행할 때 같이 실행한다.
이것을 이용해서 현재 시간에 더해질 수 있도록 하였다....
하지만 프론트에 보냈을 때는 이미 9시간을 더해서 보내주었는데 또다시 9시간이 더해져서 총 18시간이 더해지는 문제가 발생했다.
분명 프론트에서 9시간을 더해주는 로직을 다 지우셨다고 하셨다.
그래서 더하지 않고 보내려고 했지만
마니또를 매칭하는 로직도 UTC 기준으로 작동을 하기 때문에 어쩔 수 없이 9시간을 더해주고
보낸 쪽지함과 받은 쪽지함에 response
해주는 Dto에서 다시 9시간을 빼주었다............
public SendMessageResponseDto(Message message) {
this.contents = message.getContent();
this.getPersonUsername = message.getMessageReceiver().getUsername();
this.sendDay = adjustTimeByHours(message.getCreatedAt(), -9);
}
private Date adjustTimeByHours(Date date, int hours) {
Instant instant = date.toInstant();
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.UTC).plusHours(hours);
return Date.from(offsetDateTime.toInstant());
}
프론트에게 응답을 보낼 때는 다시 9시간을 빼주어서 반환하는 로직을 구현하였다.......
이렇게 해주어서 원하는 값을 프론트에게 전달할 수 있었다...