반응형
문제1
MySQL 자료형 중 datetime(6) 과 같이 괄호 속 숫자는 무엇일까
이번 뉴스피드 프로젝트에서 JPA로 엔티티를 만들던 중 JPA가 만들어준 SQL문을 보고 있었다.
Hibernate:
create table users (
created_at datetime(6),
id bigint not null auto_increment,
modified_at datetime(6),
login_id varchar(20) not null,
nickname varchar(20) not null,
description varchar(40),
password varchar(60) not null,
primary key (id)
) engine=InnoDB
Hibernate:
alter table users
add constraint UK_i3xs7wmfu2i3jt079uuetycit unique (login_id)
Hibernate:
alter table users
add constraint UK_2ty1xmrrgtn89xt7kyxx6ta7h unique (nickname)
created_at, modified_at 이 datetime(6) 으로 되어 있었다.
..어라? (6)이 뭐지?
해결
MySQL의 DATE, TIME, DATETIME 자료형의 경우, 정확도(percision) 를 최대 6까지 지정할 수 있다.
정확도는 초를 기준으로 0부터 1까지 실수의 자릿수를 의미한다. 예를 들면 위와 같이 datetime(6)의 경우에는 2023-11-23 11:18:48.123456 으로 맨 마지막의 123456 까지 저장이 되고, 이는 11시 18분 48.123456초 가 된다.
이 정확도를 초과하는 값을 입력을 하면 정확도 자릿수까지 반올림하여 저장을 한다.
예를 들어, ~~11:18:48:9999994 와 같이 7자리 실수를 입력하면 11:18:48:999999 로 마지막 4가 버려지지만,
~~11:18:48:9999997 와 같이 입력하면 올림되어 11:18:49:000000 가 된다.
문제2
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
@Column(updatable = false)
@Temporal(TemporalType.TIME)
private LocalDateTime createdAt; // 생성일자
@LastModifiedDate
@Temporal(TemporalType.DATE)
private LocalDateTime modifiedAt; // 수정일자
}
@Temporal(TemporalType.DATE) 어노테이션을 붙이니 다음과 같은 에러가 났다.
Caused by: java.lang.UnsupportedOperationException: TemporalJavaType(javaType=java.time.LocalDateTime) as `jakarta.persistence.TemporalType.TIME` not supported
해결
TIME 이나 DATE 로 할 경우, 필드의 타입을 Date 로 해주면 된다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
@Column(updatable = false)
@Temporal(TemporalType.TIME)
private Date createdAt; // 생성일자
@LastModifiedDate
@Temporal(TemporalType.DATE)
private Date modifiedAt; // 수정일자
}
Hibernate:
create table post (
created_at time(6),
modified_at date,
id bigint not null auto_increment,
author varchar(20) not null,
title varchar(30) not null,
password varchar(128) not null,
contents text not null,
primary key (id)
) engine=InnoDB
TemporalType을 TIME, DATE 로 하면 각각 time(6), date 가 된다.
반응형
'TIL ✍️' 카테고리의 다른 글
23년 11월 28일(화요일) - 40번째 TIL (0) | 2023.11.28 |
---|---|
23년 11월 24일(금요일) - 39번째 TIL (0) | 2023.11.24 |
23년 11월 22일(수요일) - 37번째 TIL (0) | 2023.11.22 |
23년 11월 21일(화요일) - 36번째 TIL (1) | 2023.11.21 |
23년 11월 20일(월요일) - 35번째 TIL (0) | 2023.11.20 |