pwoogi
자신의 왜곡된 경험을 진실이라고 생각하지 말자

에러일지

에러일지 [07/29] H2 error: "Syntax error in SQL statement ... expected identifier"

pwoogi 2022. 7. 29. 11:08

 

 

조용히 하루를 넘어가는 날이 없다

 

문제

Spring security를 이용하여 H2 DB와 연결하는 과정중에 SQL 상태 메시지에 [*]가 있는 위치에 구문 오류가 있다고 표시된다. 테이블에 대한 식별자가 필요한데 user 가 여기의 identifier(식별자) 라는 의미가 대체 무엇일까?

 

Syntax error in SQL statement "select user0_.user_id as col_0_0_ from [*]user user0_ where user0_.email=? limit ?"; expected "identifier"; SQL statement:
select user0_.user_id as col_0_0_ from user user0_ where user0_.email=? limit ? [42001-212]

 

 

원인

 

미친듯이 구글링 이후 나를 숨쉬게 해준 하나의 문장을 발견했다.

 

 

즉, SQL/H2 를 사용할 때 User라는 단어가 예약된 키워드라서 테이블 이름을 user -> users 이런식으로 바꾸어서 저장해야한다는 것이다. 

UserRoleEnum role = UserRoleEnum.USER;
if (requestDto.isAdmin()) {
    if (!requestDto.getAdminToken().equals(ADMIN_TOKEN)) {
        throw new IllegalArgumentException("관리자 암호가 틀려 등록이 불가능합니다.");
    }
    role = UserRoleEnum.ADMIN;
}

User user = new User(username, password, email, role);
userRepository.save(user);

나는 user라고 Repository를 이용해 db에 저장했기 때문에 syntax error가 발생했다. 

 

해결

properties에 설정을 바꾸어주면 h2에 정상적으로 data가 db에 담기는 것을 확인 할 수 있다.

jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;MODE=MySQL;NON_KEYWORDS=USER

 

 

* SQL 문을 이용할 때 그대로 user로 테이블에 저장하면 USER 테이블의 명이 위에 문장으로 인해서 " "가 붙은 형식으로 바뀌기 때문에 당황하지말고 db명을 바꾸거나 바꾸지않고 그대로 사용했다면 " "를 붙여서 data를 불러오면 된다.