__Mysql 상의 LocalDateTime 관련 기본값 오류 - Invalid Default value for 발생 해결__

문제상황

  • ddl-auto : create 후 db 에 테이블이 생기는 것을 확인하는 중이였다.
  • 하지만..
  • error code 1067 invalid default value for 가 발생하면서 에러가 발생하는 것이 아닌가..

해결

  • 별도의 docker-compose.yml 을 사용하여 Mysql 이미지를 가져와서 로컬 컨테이너에 띄워서 사용중이였다.
  • 하지만 원래 Mysql 도 그런지 모르겠지만, 해당 Mysql 5.7 버전 이미지에서는 sql_mode 에 여럿 제약 조건이 추가되어 있었다.
    • 뭐 무결성을 위한 제약이겠지만, 날짜 관련된 부분은 그냥 삭제해주려고하였지만..

어떤 제약조건이 있었나

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  1. NO_ZERO_IN_DATE:
    1. 이 모드가 활성화되면, 날짜에서 월 또는 일에 '0'이 포함된 값을 허용하지 않는다. 예를 들어, '2024-00-01' 또는 '2024-01-00'과 같은 날짜는 거부된다.
  1. NO_ZERO_DATE:
    1. 이 모드가 설정되면, '0000-00-00'과 같은 '0'으로 구성된 날짜 값의 사용을 거부한다. 이는 유효하지 않은 날짜를 방지하기 위해 사용된다.

SQL_MODE 를 전부 해제하고 DB를 살펴보니

  • ㅡ ㅡ 이런..
    • tiemstamp 에 0000-00-00 같은 말도 안되는 데이터가 들어가고 있었다.
    • 결국 기본적으로 필요한 제약인 것을 알 수 잇었다.

빈값이 들어가는 경우

  • 그냥
    @Column(name = "last_login_date", columnDefinition = "TIMESTAMP")
    private LocalDateTime lastLoginDate;
    • 이런식으로 설정하지말고
@Column(name = "last_login_date")
private LocalDateTime lastLoginDate;
  • 그냥 하이버네이트에게 맡기는 것이 더 생각할게 적어지는것 같다..
  • 기본적으로 LocalDateTime 의 경우 datetime 형태로 기입되는것을 확인

Uploaded by N2T