[스프링 부트][문제해결] MySQL에서 JPA로 Table 생성시 만나게된 에러, 범인은 columnDefinition!
패스트 캠퍼스의 "Java&Spring boot로 시작하는 웹 프로그래밍"의 Final 과제를 수행하고 있다. "데이터베이스 연동 설계와 구현"의 6번 "게시판 테이블과 시퀀스는 Board 엔티티에 설정된 Annotation을 기반으로 자동으로 생성되도록 합니다."를 구현하던 중 아래와 같은 에러를 만나게 되었다.
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing 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 블라 블라~
해당 Entity 코드는 다음과 같다.
package com.example.board.model.entity;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.ColumnDefault;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long seq;
@Column(length = 200, nullable = false)
private String title;
@Column(length = 20, nullable = false)
private String writer;
@Column(length = 2000, nullable = false)
private String content;
@Column(nullable = false, columnDefinition = "date default sysdate")
private LocalDateTime regDate;
@Column(columnDefinition = "number default 0")
private Long cnt;
}
private 변수를 모두 주석 처리 후 하나씩 주석을 풀어가며 어떤 변수에서 문제가 발생하는지 확인했다. 그 결과 @Column 어노테이션의 columnDefinition 설정 값이 문제였음을 확인할 수 있었다.
시스템 날짜 정보가 자동으로 입력되어야 하는 regDate의 경우 Default 값으로 "CURRENT_TIMESTAMP"가 적용되어야 하는데 "date default sysdate"는 올바른 문법이 아니었던 모양이다. 검색 결과 다음의 자료가 속 시원한 답을 주었다.
https://dev-elop.tistory.com/entry/JPA-Entity-CURRENTTIMESTAMP-%EC%83%9D%EC%84%B1%EB%B2%95
JPA Entity CURRENT_TIMESTAMP 생성법
@Column(name = "timestamp", nullable = false, updatable = false, insertable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") public Timestamp timestamp; 위와 같이 만들면 CURRENT_TI..
dev-elop.tistory.com
private 변수 중 Long cnt의 경우에는 MySQL에서 datatype을 BIGINT로 설정되도록 해야 하므로 columnDefinition을 "bigint default 0"으로 설정하였더니 원하는 결과를 얻을 수 있었다. 최종 코드는 다음과 같다.
package com.example.board.model.entity;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long seq;
@Column(length = 200, nullable = false)
private String title;
@Column(length = 20, nullable = false)
private String writer;
@Column(length = 2000, nullable = false)
private String content;
@Column(nullable = false, updatable = false, insertable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private LocalDateTime regDate;
@Column(columnDefinition = "bigint default 0")
private Long cnt;
}
이제 모두가 평화로워졌다!