728x90
1. Reserved Keyword
GenerationTarget encountered exception accepting command : Error executing DDL "create table evaluation (id bigint generated by default as identity, comment varchar(255), content_id bigint, like boolean, unlike boolean, user_id bigint, primary key (id))" via JDBC [Syntax error in SQL statement "create table evaluation (id bigint generated by default as identity, comment varchar(255), content_id bigint, [*]like boolean, unlike boolean, user_id bigint, primary key (id))"; expected "identifier";]
위에서 나온 부분은 Reserved Keyword (예약어) 에 대한 사용이다.
JPA 를 사용할 때에 JPA는 형상변환을 거쳐 SQL 문법 (Diarect)로 변환되게 되는데, 코드상에서 보면 당연히 '좋아요' 를 like로 지정할 수 있겠지만 이러한 부분은 SQL 문법에서의 like 와 문제를 일으키게 된다.
문제가 되는 코드를 살펴보자
package com.webtoon.webtoonservice.model;
import jakarta.persistence.*;
@Entity
public class Evaluation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long userId;
private Long contentId;
private Boolean like;
private Boolean unlike;
private String comment; // Ensure validation to disallow special characters
}
이 부분에서 해당하는 부분을 고치려면 like를 likes 로 고치거나 이스케이핑을 하면 된다.
@Entity
@Table(name = "evaluation")
public class Evaluation {
// other fields...
@Column(name = "`like`")
private Boolean like;
private Boolean unlike;
// getters and setters...
}
2. Reserved Keyword
GenerationTarget encountered exception accepting command : Error executing DDL "create table user (id bigint generated by default as identity, gender varchar(255), register_date timestamp(6), type varchar(255), user_email varchar(255), user_name varchar(255), primary key (id))" via JDBC [Syntax error in SQL statement "create table [*]user (id bigint generated by default as identity, gender varchar(255), register_date timestamp(6), type varchar(255), user_email varchar(255), user_name varchar(255), primary key (id))"; expected "identifier";]
가장 눈치채기 어려운 것 중 하나인 user 에 대한 부분이다. 변환하는 과정 도중 Directs 중에서 user 라는 부분은 이미 잡혀있는 user table 을 지칭하여 문제를 일으킬 수 있기 마련인데 이러한 부분 때문에 문제가 발생한다.
package com.webtoon.webtoonservice.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.*;
import java.util.Date;
@Entity
@Table(name = "`user`") // use backticks to escape
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userName;
private String userEmail;
private String gender; // Consider using an enum here
private String type; // Consider using an enum here
private Date registerDate;
}
마찬가지로 이스케이핑을 하여 처리할 수 있다.
'Java > Spring Boot JPA' 카테고리의 다른 글
[Trouble Shooting] Open API (1) | 2024.02.01 |
---|---|
HTTP 401 response code (0) | 2024.01.12 |
[Shop] 세션 끊김 문제 완전 해결 (0) | 2023.09.21 |
[Shop] Session Failure Problem (0) | 2023.09.16 |
[sync] Complete Session Sync issue (0) | 2023.09.01 |