코드
@Entity
@Getter @Setter
public class User {
@Id @GeneratedValue
@Column(name = "user_id")
private Long userId;
@Column(name = "user_name")
private String userName;
}
발생한 오류
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000a create table [*]user (\000a user_id bigint not null,\000a user_name varchar(255),\000a primary key (user_id)\000a )"; expected "identifier"; SQL statement:
오류 해석과 오류 발생 부분 탐지
해당 오류는 SQL 문에서 구문 오류가 발생했음을 나타낸다. H2 데이터 베이스에서는 예약어라는 개념이 있는데, 예약어를 식별자(테이블 이름, 열 이름 등)으로 사용할 수 없다. int를 변수 이름으로 지정하지 않는 것과 같은 느낌.
H2 버전 2.x.x에서 "user"라는 키워드가 예약어로 사용 된다.
위 코드에서 문제가 되는 부분은 User라는 클래스 이름이다. User 클래스에 @Entity 어노테이션이 붙어 있어서 코드를 실행할 때 테이블을 생성하는 SQL 문이 발생한다. 그런데 user는 SQL에서 예약어로 사용되므로, 이를 테이블 이름으로 사용할 수 없기 때문에 오류가 발생하였다.
create table user (
member_id bigint not null,
member_name varchar(255),
primary key (member_id)
)
코드를 실행시켰을 때 발생하는 SQL 문
오류 해결
오류 해결을 위해 클래스 위에 Table 이름을 지정하거나
@Table(name = "users")
클래스 이름을 바꾸는 방법을 사용할 수 있다.
@Entity
@Getter @Setter
public class Member {
...
}
클래스 이름을 바꾸게 된다면 관련하여 많은 리펙토링을 해야 할 수 있는데, (userId -> memberId 일관성을 위해..)
user라는 클래스를 계속 사용하다가 나중에 또 문제가 생기지 않을지 걱정되었고
프로젝트 초반 단계에서 발생한 오류였기에 클래스 이름을 바꾸어 오류를 해결하기로 결정하였다.
'백엔드 > Java + Spring' 카테고리의 다른 글
[백엔드] Blog - 실행 오류 정리 (application.yml, SDK, test) (0) | 2024.09.19 |
---|---|
[백엔드] 회원탈퇴(Soft delete) 및 회원복구 (1) | 2024.09.08 |
[벡엔드] 카테고리 Java Enum 활용 (0) | 2024.09.06 |
[면접 후기] 첫 번째 백엔드 면접 후기 및 회고 (0) | 2024.08.21 |
[Spring] DB에서 조건 검색 하는 방법 (Specification, Predicate) (0) | 2024.01.14 |