인프런 커뮤니티 질문&답변

b27ell님의 프로필 이미지
b27ell

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

45강. 빌드와 실행, 그리고 접속

45강) 빌드까지 모두 완료하고 v1 화면으로 가서 사용자 추가를 했더니 오류가 나요 ㅜㅜ

작성

·

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의 ifelse 처럼 특수한 문자로써 동작한다는 의미입니다. Java에서는 저희가 if 라는 이름으로 변수를 만들 수 없죠!

따라서

  • MySQL이 잘 적용될 수 있도록 application.yml 을 한 번더 확인해주시거나

  • H2를 계속 사용하실 생각이라면, <38강. profile과 H2 DB>에서 설명드리는 설정을 적용해 위의 에러를 해결할 수 있을 것으로 예상됩니다.

    • 에러의 원인은 H2에서 "user"라는 이름이 어떠한 명령어로 예약되어 있기 때문입니다! 따라서 user 테이블을 사용하면, H2는 예약된 명령어라고 에러를 발생시키게 되요. 이를 막기 위해서는 테이블의 이름을 변경할 수도 있고, 38강에서 적용하고 있는 NON_KEYWORDS=USER 옵션을 쓸 수도 있습니다.

 

아마 로컬호스트에서는 MySQL을 사용하고 있나 봐요!! 꼭 해결되셨으면 좋겠습니다.

언제나 편하게 질문 남겨주세요! 감사합니다. 😊 🙇

0

b27ell님의 프로필 이미지
b27ell
질문자

인텔리제이로 돌아가서 로컬호스트로 접속했을 때는 문제없이 잘 됩니다...ㅜ

b27ell님의 프로필 이미지
b27ell

작성한 질문수

질문하기