요청으로 json의 시간을 String으로 받는다.
이때, 우리는 그 시간을 시간 객체로 파싱해주어야 한다.
시간 객체로 파싱은 DB를 고려해서 해야한다.
들어가기에 앞서...
ISO 시간 형식
ISO 시간 형식 : YYYY-MM-DD HH:mm:ss OR YYYY-MM-DDz (UTC일때)
UTC : 협정 세계시로, 하나의 값만 가진다. 보통 second 뒤에 z가 붙는다면 UTC이다. 즉, UTC +-N을 한 값이 로컬 시간인 것이다.
java.time.
=> 날짜, 시간, 순간, 기간 등의 대표적인 자바 패키지이다.
=> ISO 형식에 기초를 둔다.
=> Immutable하고, 스레드 안전하다.
=> 모든 dates와 times관련 타입에서 파싱이 가능한 메서드를 지원한다.
=> timezone을 지원하지 않는 클래스와 지원하는 클래스로 나뉜다.
=> timezone 지원: ZonedDateTime
=> timezone 미지원: Instant, LocalDateTime/Date/Time
LocalDateTime
로컬 데이트 타임은 저런 식으로 나온다.
=> 날짜와 시간 사이 T가 붙는다.
=>소수점 뒷자리가 길다.
LocalDate
로컬 데이트는 저런 식으로 나온다.
=> ISO 날짜 형식과 일치한다.
LocalTime
로컬 타임은 저런 식으로 나온다.
=> 뭔가 LocalDateTime보다 짧다.
=> 날짜와 시간 동시에 가져오고 이걸 자를때, 잘린다고 합니다.
Instant
인스텐트는 저런 식으로 나온다.
=> UTC 시간이기 때문에, 뒤에 z가 붙는다.
of -> 객체 생성
parse -> String(CharSet)을 시간 객체로 만들 수 있다.
나머지는 알아서 하도록!
java.sql
=> 이 글에서 설명할 것은 Timestamp밖에 없다.
=> Timestamp는 UTC로 저장
=> 클라이언트 로컬, 백엔드 서버에서 Timestamp값은 동일
=> Timestamp값을 db에 insert 시 타임존에 맞춰서 mysql은 변환
=> 다시 select 시 타임존에 맞춰 로컬 시간으로 변환
=> String(프론트, 백 서버, JSON) -> DateTimeFormatter를 이용한 파싱 LocalDateTime("yyyy-MM-dd HH:mm:ss") -> Timestamp.valueOf(Timestamp로 변환) -> db 저장(UTC로 저장)
=> db에서 Select(백엔드로 넘어오며, 로컬 시간으로 변환) -> Timestamp를 LocalDateTime으로 변환 -> LocalDateTime을 String으로 변환 -> json으로 주기
이때, 타임존을 한국 따로, 미국따로 어디따로 등등으로 하고 싶으면,
Timestamp(UTC) -> Instant(UTC) -> ZonedDateTime(여러나라 시간) 이런식으로 바꿔야한다.
결론
시간을 타임존까지 건드리지 않으려면, DB와 Hibernate의 기능인 @CreateTimeStamp로 LocalDateTime과 매핑이 되니, 이걸로 저장하면 될것같고,
타임존을 건드리고 싶으면, Timestamp로 db저장, Instant로 변환, ZonedDateTime으로 각 타임존에 맞게 변환 가능.
(계속업뎃예정)
'JAVA' 카테고리의 다른 글
캡슐화 + 은닉에 대하여 (1) | 2025.01.22 |
---|---|
객체, 상속, 다형성, 캡슐화 등(객체 지향) (0) | 2025.01.22 |