Instant 클래스 도입에 관한 고찰

2023. 10. 2. 21:21프로젝트/[축팅]축제 소개팅 어플리케이션 - 카카오 테크 캠퍼스 1기

728x90

현재, 카카오테크캠퍼스 3단계에서 저희 팀 Spark는 게시물의 날짜를 저장하는 데 LocalDateTime 자료형을 사용하고 있습니다.


@Entity
@NoArgsConstructor(access = PROTECTED)
@Getter
public class Post {

  // Primary Key
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long postId; // 게시글 ID
	
	...
	
  @Column(nullable = false)
  private LocalDateTime createdAt; // 생성일

	}



저희 어플리케이션에서는 게시물의 생성일을 활용해 게시물을 나이를 구하여 이를 인기도에 반영하고 있습니다.

즉, 게시물의 생성일 데이터는 단순 생성일을 저장하는 기록성 데이터가 아니라 비즈니스 로직에 영향을 끼치는 데이터입니다.


💡 게시물 나이를 구하는 수식

(현재 날짜 및 시간 - 생성일 )/5분



그렇다면, 시간과 시간을 비교하여 연산하기에 적합한 자료형은 어떤 것일까요??

LocalDateTime 자료형Instant 자료형을 비교해보겠습니다.



 

LocalDateTime


LocalDateTime 클래스는 날짜와 시간 정보를 가지고 있고, 로컬 시간에 맞춰서 시간을 표현한다.
즉, 시간을 측정하는 기준이 기준이 지역마다 다르다.

만약, 글로벌 서비스에 LocalDateTime.now()를 사용해 DB에 시간을 저장하면, 각 지역마다 타임 존이 다르기때문에  서로 다른 시간이 저장될 것이다.

 

 

따라서, time zone과 관계없이 발생하는 이벤트를 나타낼 때 사용하기 적합하다.

여기서 말하는 이벤트는 설날과 같은 것이다.

예를 들어서, 설날은 항상 1월 1일이지만 설날을 맞이하는 시간은 지역에 따라 다릅니다.
런던의 사람들은 새해를 맞이할 때 로스앤젤레스의 사람들은 오후를 보내고 있습니다.

 

Instant

 

 

Instant 클래스는 UTC 시간대의 한 순간이다.

 

쉽게 말하자면, 1970년 1월 1일 00:00:00의 표준 Unix시대 시간을 기준으로 초 및 나노초 수를 계산하고 있다고 생각하면 된다.

 

즉, 특정 시간을 표준 Unix 시대 시간을 기준으로 나타내기때문에 특정 시간들 사이의 간격을 잘 표현할 수 있다.

또한, long 형태로 Unix Timestamp를 저장하기 때문에 연산이 빠르다.

 

 

결론

 

Post 엔티티의 createdAt 컬럼의 자료형은 LocalDateTime이 아니라, 정확한 시간을 비교할 수 있는 Instant 자료형을 사용해야합니다.


번외로, java의 LocalDateTime은 MySQL에서 DateTime 자료형으로 저장되고 java의 Instant는 MySQL에서 TimeStamp로 저장된다.
MySQL의 DateTime은 time_zone에 의존하지 않기때문에, 글로벌 서비스에서는 적합하지 않다.

 

 

[참조]

Difference Between Instant and LocalDateTime | Baeldung

 

Difference Between Instant and LocalDateTime | Baeldung

Learn about the difference between the Instant and LocalDateTime classes introduced with Java 8.

www.baeldung.com

 

 

https://github.com/Step3-kakao-tech-campus/Team14_BE/issues/43

 

Instant 클래스 도입 · Issue #43 · Step3-kakao-tech-campus/Team14_BE

현재, 카카오테크캠퍼스 3단계에서 저희 팀 Spark는 게시물의 날짜를 저장하는 데 LocalDateTime 자료형을 사용하고 있습니다. @Entity @NoArgsConstructor(access = PROTECTED) @Getter public class Post { // Primary Key @Id @

github.com

 

728x90