
도메인/엔티티 클래스 정의 후 DDL 실행 오류
상황
엔티티/도메인 클래스 정의 후 생성 중 Spring Boot 프로젝트에서 새로운 테이블 추가 시 Hibernate에서 DDL 구문 오류가 발생하는 경우입니다.
발생한 오류 메시지의 텍스트는 다음과 같습니다.
| 원인: java.sql.SQLSyntaxErrorException: SQL 구문에 오류가 있습니다. 설명서를 확인 동 ‘N not null’ 근처에서 사용할 올바른 구문에 대한 MySQL 서버 버전, update_datetime datetime(6) null이 아님, update_emplo’ 10번째 줄 |
발생 시 사용된 코드는 다음과 같습니다.
package com.logsjejustone.webapiserver.user.domain;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
import java.time.LocalDateTime;
@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name="AdminUserPasswordHistory")
public class AdminUserPassword {
@Id
@NotNull
@Column(length = 6)
private String employeeNo;
@Id
@NotNull
private Integer no;
@NotNull
@Column(length = 6)
private String registerEmployeeNo;
@NotNull
private LocalDateTime registerDatetime;
@NotNull
@Column(length = 6)
private String updateEmployeeNo;
@NotNull
private LocalDateTime updateDatetime;
@NotNull
@Column(columnDefinition = "TEXT")
private String currentPw;
@Column(columnDefinition = "TEXT")
private String previousPw1;
@Column(columnDefinition = "TEXT")
private String previousPw2;
@NotNull
@Column(length = 1)
@ColumnDefault("0")
private String pwTrialState;
@NotNull
@Column(length = 1)
@ColumnDefault("N")
private String temporaryPwState;
}
원인
오류 메시지는 수동으로 확인해야 한다고 하는데 null 관련 메시지가 표시되는 것을 보니 null 관련 설정에 문제가 있는 것으로 예상했습니다.
코드상으로는 문제가 없어보였는데 구글링을 해도 답을 찾을 수가 없었습니다.
오류 이유 코드
...
{
...
@ColumnDefault("N") // ERROR REASON
private String temporaryPwState;
}
해결
주석이 달린 값은 큰따옴표를 생략하고 문자 N을 있는 그대로 표시했는데 이는 Not Null 약어와 혼동된 것으로 보입니다.
그래서 작은따옴표를 큰따옴표로 다시 묶으면 오류가 수정됩니다.되었습니다.
변경된 코드
...
{
...
@ColumnDefault("'N'") // ERROR REASON (BEFORE: "N")
private String temporaryPwState;
}
나,
그것은 정말 정말 바보 같은 작은 버그 때문에 2시간 동안 인터넷 검색을 한 후에도 나타나지 않았기 때문에 내가 남기는 기록입니다.
너무 간단한 해결책이라도 적어두니 비슷한 오류가 발생하면 제 블로그에서 찾아보실 수 있습니다.
