Framework/SpringBoot

[SpringBoot] CommandAcceptanceException : table명이 예약어일 때 발생하는 Exception

  • -

발생 배경

resourcedata.sql 파일에 값을 넣고 실행하니 CommandAcceptanceException 이 발생하였다

중략

맨 마지막 SQLSyntaxErrorException을 보고 문법이 잘못되었나 싶었는데 그건 아니었다.

원인 파악

CommandAcceptanceException에 대해 검색해보니 원인은 다양했다

  1. 하이버네이트가 table을 만들 때 drop하지 못해서
  2. 계정의 권한으로는 할 수 없는 쿼리를 작성해서
  3. SQL이나 H2의 예약어를 사용하여 Entity를 작성해서

나는 1번 사항에는 해당하지 않았다

하이버네이트가 table을 drop 하는 것은 확인되었기 때문이다.

2번 사항도 user 테이블 말고 다른 table에 insert하는 데에는 오류가 발생하지 않았기 때문에 해당하지 않았다.

해결 방법

나는 3번 사항에 해당된다고 파악하여 table의 이름을 user에서 users로 변경해보았다.

처음에는 모든 Entity, dto, repository, service를 모두 rename해야 하나 막막했는데

@Table어노테이션을 사용해 table과 Entity의 이름을 다르게 지정할 수 있었다

table의 이름이 바뀌어서 data.sql도 수정하였다.

이후 Exception 없이 정상적으로 실행되었다!!

에러를 해결하면서

이 에러를 해결하면서

  • Entity 객체명과 SQL, JPA, H2 의 예약어가 겹칠 때 예외 발생
  • @Table 어노테이션을 사용해 명시적으로 테이블 명을 지정

이 두 사실에 대해 알게되었다!

참고로 user는 H2의 예약어라고 한다. 

SQL의 예약어가 아니었어서 더 원인을 찾기 어려웠다.

 

앞으로 Entity 객체의 이름이 예약어와 겹칠 시 Table 어노테이션으로 table명을 명시해야겠다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.