[트러블 슈팅] H2에서 엔티티 이름을 User로 지으면 안되는 이유와 해결 방법 (H2 버전 2.x.x)

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
반응형

'백엔드 > 백엔드' 카테고리의 다른 글

[백엔드] AWS S3 엑세스 키 발급 방법  (0) 2024.11.09
[백엔드] AWS S3 버킷 생성  (6) 2024.11.08
[Java, Kotlin Spring] 인텔리제이 application.yml 환경변수 설정하기  (0) 2024.10.20
[면접 후기] 첫 번째 백엔드 면접 후기 및 회고  (0) 2024.08.21
'백엔드/백엔드' 카테고리의 다른 글
  • [백엔드] AWS S3 엑세스 키 발급 방법
  • [백엔드] AWS S3 버킷 생성
  • [Java, Kotlin Spring] 인텔리제이 application.yml 환경변수 설정하기
  • [면접 후기] 첫 번째 백엔드 면접 후기 및 회고
dev_ares
dev_ares
대학에서 컴퓨터공학을 전공하고 있는 학생입니다.
    반응형
    250x250
  • dev_ares
    노트
    dev_ares
  • 전체
    오늘
    어제
    • 분류 전체보기 (187)
      • IT 트랜드 (2)
      • 백엔드 (18)
        • Java + Spring (8)
        • Kotlin + Spring (5)
        • 백엔드 (5)
      • 프론트엔드 (1)
        • React (1)
      • 대외활동 (17)
        • 42서울 (17)
      • 백준 (6)
        • Java (2)
        • C++ (3)
      • 전공 (121)
        • 객체지향프로그래밍 (17)
        • 자료구조 (23)
        • 리눅스시스템관리 (16)
        • 컴퓨터구조 (25)
        • 네트워크 (25)
        • 데이터베이스 (15)
        • 기타 전공 (0)
      • 프로그래밍 언어 (18)
        • Java (5)
        • Swift (4)
        • C++ (1)
        • Kotlin (8)
      • 기타 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C++
    단일 사이클
    리눅스
    42서울
    상속
    데이터패스
    티스토리챌린지
    자바
    컴공 포트폴리오
    추가 문제
    코틀린
    사설 문제
    반복자
    메모리 계층 구조
    백준
    컴퓨터 구조 및 설계
    오블완
    컴퓨터구조
    자료구조
    명령어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
dev_ares
[트러블 슈팅] H2에서 엔티티 이름을 User로 지으면 안되는 이유와 해결 방법 (H2 버전 2.x.x)
상단으로

티스토리툴바