작성
·
454
1
강사님 안녕하세요! 수업 잘 듣구 있습니다!
다름이 아니라, AWS에 빌드까지 완료하고 인바운드 규칙까지 편집해준 다음, v1 화면으로 돌아가서 사용자 추가 부터 해보았는데 갑자기 서버 내부 오류라는 창과 함께 오류가 뜹니다..
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table if exists user CASCADE " via JDBC Statement
2023-10-15 08:12:50.119 WARN 18125 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 42001, SQLState: 42001
2023-10-15 08:12:50.119 ERROR 18125 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper : Syntax error in SQL statement "insert into [*]user (id, age, name) values (default, ?, ?)"; expected "identifier"; SQL statement:
insert into user (id, age, name) values (default, ?, ?) [42001-214]
2023-10-15 08:12:50.123 ERROR 18125 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into user (id, age, name) values (default, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement] with root cause
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "insert into [*]user (id, age, name) values (default, ?, ?)"; expected "identifier"; SQL statement:
insert into user (id, age, name) values (default, ?, ?) [42001-214]
혹시 제가 SQL문을 잘못 작성한 것일까요?
답변 2
0
안녕하세요!! b27ell님! 에러가 발생해서 답답하실 것 같습니다!! 😭
결론부터 말씀드리면, 해당 에러는 "MySQL이 아니라 H2를 사용하고 있고, 스프링 2.7.x 이상 버전을 사용하고 있기 때문에" 발생하는 에러입니다!
2023-10-15 08:12:50.123 ERROR 18125 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into user (id, age, name) values (default, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement] with root cause
라는 에러에서 끝 부분 user; expected "identifier
라는 의미가 user 라는 이름은 DB의 키워드로 잡혀 있어 사용할 수 없다 라는 뜻이거든요!
키워드로 잡혀 있다는 의미는 Java의 if
나 else
처럼 특수한 문자로써 동작한다는 의미입니다. Java에서는 저희가 if
라는 이름으로 변수를 만들 수 없죠!
따라서
MySQL이 잘 적용될 수 있도록 application.yml
을 한 번더 확인해주시거나
H2를 계속 사용하실 생각이라면, <38강. profile과 H2 DB>에서 설명드리는 설정을 적용해 위의 에러를 해결할 수 있을 것으로 예상됩니다.
에러의 원인은 H2에서 "user"라는 이름이 어떠한 명령어로 예약되어 있기 때문입니다! 따라서 user 테이블을 사용하면, H2는 예약된 명령어라고 에러를 발생시키게 되요. 이를 막기 위해서는 테이블의 이름을 변경할 수도 있고, 38강에서 적용하고 있는 NON_KEYWORDS=USER
옵션을 쓸 수도 있습니다.
아마 로컬호스트에서는 MySQL을 사용하고 있나 봐요!! 꼭 해결되셨으면 좋겠습니다.
언제나 편하게 질문 남겨주세요! 감사합니다. 😊 🙇
0