Search
Duplicate

[스프링 게시판] 게시글 초깃값 설정

@3/12/2023

날짜 초기값 설정 시 오류

Post.java에 아래처럼 ddl 생성 시 초기값을 설정함
@ColumnDefault("current_timestamp") private LocalDateTime regDate; @ColumnDefault("0") private Integer view;
Java
복사
하지만 다음 ddl이오류가 남
create table post ( post_id bigint not null auto_increment, content varchar(255), reg_date datetime(6) default current_timestamp, title varchar(255), view integer default 0, user_id bigint, primary key (post_id) ) engine=InnoDB
Java
복사
실험해보니 datetime(6)의 (6) 부분이이 문제였음. 없애면 테이블이 정상적으로 생성되는데, JPA에서 (6) 부분을 없애는 방법을 찾지 못함.
소스코드를 뒤져보니 관련해서 아래 내용이 있었음
초 단위의 소수점 정밀도(fractional seconds precision)를 의미하는데, 생략할 경우 0이 된다고 함(초가 정수). 그래서 MySQL 워크벤치에서 datetime(0)으로 테이블을 만들었더니 default 값이 잘 적용됨
그렇다면 JPA에서 이를 적용할 수 없을까?
찾아보니 초기값을 지정하는 여러 방법이 있음
컬럼을 직접 정의하고 클래스 레벨에 @DynamicInsert 붙이기
@Column(columnDefinition = "...")
Java
복사
→ 이건 DB에 종속적으로 변함
엔티티 필드에 직접 지정하는 방법
→ 이건 다른 서버에서 DB를 건들 경우 유효하지 않음
@prePersist 사용
@PrePersist void preInsert() { if (this.createdTime == null) this.createdTime = new Date(); }
Java
복사
이래저래 테이블 속성에 default값을 주는 것은 JPA의 컨셉과 맞지 않는가 봄
제가 신규로 진행하는 프로젝트들은 테이블이 제공하는 default를 거의 사용하지 않습니다.
엔티티에 중심으로 개발하다 보니, 객체에 값을 넣는 방식으로 주로 진행합니다.
쉽게 이야기해서 생성자에서 기본값을 미리 설정하는 방식을 사용합니다.
다른 예를 들어드리면, 실무에서 @Index(인덱스 조건)도 DDL을 생성할 때만 사용하기 때문에 사실은 적을 필요가 없지만, 그래도 엔티티에 이 애노테이션이 있으면, 개발자분들이 엔티티만 보고 인덱스를 생각하고 JPQL을 작성할 수 있기 때문에 사용합니다. 말씀하신 default도 그런 관점에서 저는 적으면 좋겠다고 생각합니다.

엔티티 생성자 통한 초기화 설정

값은 엔티티 생성자를 통해 초기화하기로 함

관련 커밋

d2550f4928b7f350dc78f3b5fe002d49457b8c92
commit