백엔드 프로젝트

[Spring] 엔티티 이름을 User로 지으면 안되는 이유와 해결 방법 (H2 버전 2.x.x)

Campus Coder 2024. 1. 10. 01:22
728x90
반응형

코드

@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라는 클래스를 계속 사용하다가 나중에 또 문제가 생기지 않을지 걱정되었고
프로젝트 초반 단계에서 발생한 오류였기에 클래스 이름을 바꾸어 오류를 해결하기로 결정하였다.

728x90
반응형