
Domain/Entity 클래스 정의 후 DDL 실행시 발생하는 오류
상황
Spring Boot 프로젝트에서 신규 테이블을 추가하기 위해 Entity/Domain 클래스를 정의한 후 빌드시 Hibernate에서 DDL 구문 오류가 발생한 경우입니다.
안내되는 오류 메세지를 텍스트로 써보자면 아래와 같습니다.
Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'N not null, update_datetime datetime(6) not null, update_emplo' at line 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 관련 설정에 문제가 있는 것으로 예상하였습니다.
코드 상에서 문제가 없어 보여 구글링을 해도 답이 나오지 않아서 몇 시간동안 머리를 굴려보다가 혹시나 하며 N과 Null 관련 코드를 수정해보았으나 Default Value로 설정하는 'N'에서 발생하는 오류였습니다.
오류 발생 원인 코드
...
{
...
@ColumnDefault("N") // ERROR REASON
private String temporaryPwState;
}
해결 방법
Annotaion으로 지정된 Value가 쌍따옴표(Double Quotation Mark)를 생략하여 N이라는 글자가 그대로 노출되어 Not Null의 약어와 혼동이 된 것으로 보였습니다.
그래서 쌍따옴표 안에 작은 따옴표(Single Quotation Mark)를 한번 더 감싸주니 오류가 해결되었습니다.
변경된 코드
...
{
...
@ColumnDefault("'N'") // ERROR REASON (BEFORE: "N")
private String temporaryPwState;
}
덧,
정말 너무너무 어이없는 작은 실수로 2시간을 날리며 구글링해도 나오지 않아서 일단 남겨보는 기록입니다.
기록해두면 유사한 오류가 발생하면 내 블로그에서라도 찾아볼 수 있도록 너무 쉬운 해결 방법이지만 기록합니다.

'Programming > Spring Boot' 카테고리의 다른 글
"java.lang.IllegalStateException: Failed to introspect Class" 오류 해결 방법 (0) | 2023.02.24 |
---|---|
"No property found for type Traversed path" 오류 해결 방법 (0) | 2023.02.23 |
[실습] 스프링부트(Spring Boot)로 비밀번호 관리 기능 구현하기 - DB, API 기획/설계하기 (0) | 2023.02.21 |
[실습] 스프링부트(Spring Boot)로 회원 관리 기능 구현하기 - REST API 테스트하기 (0) | 2023.02.15 |
[실습] 스프링부트(Spring Boot)로 회원 관리 기능 구현하기 - REST API 구현하기 (0) | 2023.02.14 |
댓글