본문 바로가기
Programming/Spring Boot

"your MySQL server version for the right syntax to use near 'N not null" 오류 해결 방법

by 돌방로그 2023. 2. 22.


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시간을 날리며 구글링해도 나오지 않아서 일단 남겨보는 기록입니다.

기록해두면 유사한 오류가 발생하면 내 블로그에서라도 찾아볼 수 있도록 너무 쉬운 해결 방법이지만 기록합니다.

 


댓글