문제
/board/add
요청 시 다음과 같은 예외가 발생한다.
1
java.sql.SQLException: Column 'regiDate' cannot be null
board/add
시 등록일 프로퍼티가 null이어도 시스템 시간이 자동 등록되도록 만들어줘야 한다.
시도 방법
DB 자체에 regiDate
기본값 표현식 now()
가 설정되어 있지 않아 발생하는 문제로 알았다. 따라서 게시글 테이블뿐만 아니라 사원, 대화, 휴가신청, 댓글 테이블의 생성일자 컬럼에 기본값 표현식 now()
를 추가하였다. 그러나 그럼에도 불구하고 같은 에러가 발생했다.
문제 원인
참고 사이트: https://stackoverflow.com/questions/61429609/in-springboot-what-is-the-correct-way-in-annotating-fields-with-default-value 만약 프로퍼티 값이 null
일 시 아무런 애노테이션도 적어두지 않으면 하이버네이트는 다음과 같은 insert 쿼리를 생성한다.
1
insert into bList(..., regidate, ...) values (..., null, ...);
이 쿼리는 not null인 필드에 null 값을 집어넣으려 하고 있으니 다음과 같은 예외가 발생하는 것이다.
1
java.sql.SQLException: Column 'regiDate' cannot be null
해결 방법
해결 방법에는 크게 두 가지가 있다.
null 대신 현재 시간을 등록하는 쿼리를 생성하도록 설정
@CreationTimestap
애노테이션을 사용하여 쿼리에 현재 시간을 등록하도록 만든다.
1
2
3
@Column(name="regidate")
@CreationTimestamp
private Date registrationDate;
생성되는 쿼리에서 해당 프로퍼티 제외하도록 설정
insertable = false
속성을 사용하여 하이버네이트가 생성하는 insert 스크립트에서 해당 필드를 제외하도록 만든다. 그러면 자동으로 데이터베이스 기본값이 사용될 것이다.
1
2
@Column(name="regidate", insertable = false)
private Date registrationDate;
이미 DB에 now() 기본값이 설정되어 있으니 두번째 방법을 사용하였다.