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

박기태님의 프로필 이미지

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" not found; SQL statement:

작성

·

4.9K

0

=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
안녕하세요..ㅎㅎ
h2 데이터베이스에 sql 문 실행하는 과정에서 막혀서 질문 드립니다..
저는 일단 spring boot 를 gradle 로 빌드할 때 오류가 생겼고 이를 해결하지 못해서 maven 으로 프로젝트를 구성했습니다.
이전 과정까진 잘 따라왔는데 순수 JDBC 강의에서 h2 디비와 연동하는 과정에서 막혔습니다.
일단 localhost:8080으로 접속해 회원목록으로 이동하면 제목에 단 텍스트와 같은 에러가 intellij 에 발생합니다.
앞서 비슷한 질문이 있길래 참고하였으나 하시는 방식들으 전부 먹히지 않았습니다.
- DB 재설치
- 시스템 재시작
- DB_CLOSE_DELAY=-1 키워드 붙이기 등
여러 시도를 해봤지만 안되고 있고..사실 강의 진행에는 문제가 없지만 이후 진행할 JPA 강의에서 문제가 발생할 것 같은 염려가 생겨 질문을 남겨서 해결을 하고 싶었습니다.
해결에 도움을 주신다면 정말 감사드리겠습니다.
추가적인 질문으로 만약 Connection 객체의 getMetaData 메소드를 호출해서 다음과 같이 정보가 나온다면 DB와 연결은 잘 되었다고 볼 수 있는 걸까요?
HikariProxyDatabaseMetaData@2114582379 wrapping dbMeta0: conn0: url=jdbc:h2:mem:26ae78c5-4f2e-4527-9ab8-d028e289479c user=SA
다음은 에러 내용 전문입니다.
2021-08-16 12:40:38.391 ERROR 21160 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" not found; SQL statement: select * from member [42102-200]] with root cause org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" not found; SQL statement: select * from member [42102-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.readTableOrView(Parser.java:7628) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.readTableFilter(Parser.java:1970) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parseSelectFromPart(Parser.java:2827) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parseSelect(Parser.java:2959) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parseQuerySub(Parser.java:2817) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parseSelectUnion(Parser.java:2649) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parseQuery(Parser.java:2620) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parsePrepared(Parser.java:868) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parse(Parser.java:843) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.parse(Parser.java:815) ~[h2-1.4.200.jar:1.4.200] at org.h2.command.Parser.prepareCommand(Parser.java:738) ~[h2-1.4.200.jar:1.4.200] at org.h2.engine.Session.prepareLocal(Session.java:657) ~[h2-1.4.200.jar:1.4.200] at org.h2.engine.Session.prepareCommand(Session.java:595) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76) ~[h2-1.4.200.jar:1.4.200] at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:352) ~[h2-1.4.200.jar:1.4.200] at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-4.0.3.jar:na] at hellomaven.hellomavenspring.repository.JdbcMemberRepository.findAll(JdbcMemberRepository.java:75) ~[classes/:na] at hellomaven.hellomavenspring.service.MemberService.findMembers(MemberService.java:42) ~[classes/:na] at hellomaven.hellomavenspring.controller.MemberController.list(MemberController.java:39) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.9.jar:5.3.9] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.9.jar:5.3.9] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.9.jar:5.3.9] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.9.jar:5.3.9] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.9.jar:5.3.9] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.9.jar:5.3.9] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064) ~[spring-webmvc-5.3.9.jar:5.3.9] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.9.jar:5.3.9] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.9.jar:5.3.9] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.9.jar:5.3.9] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.50.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.9.jar:5.3.9] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.50.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:228) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.50.jar:9.0.50] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.9.jar:5.3.9] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.9.jar:5.3.9] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.9.jar:5.3.9] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.9.jar:5.3.9] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.9.jar:5.3.9] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.9.jar:5.3.9] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.50.jar:9.0.50] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

답변 14

2

우선 해결 되었다니 강의 수강 진행하시고 문제 생기면 질문글 남겨주세요.

열공하세요!

1

박기태님의 프로필 이미지
박기태
질문자

와..

와..

와!!!! 정말 되네요!!! ㅠㅠㅠㅠ 아 정말 감사드립니다...

org.apache.maven.plugin 이 동작에 영향을 준 것일까요? 정말 신기하네요

정말 마술같이 되는게 너무 신기하고 방법을 어떻게 찾으셨는지 궁금합니다. 그리고 도와주셔서 다시 한번 감사드립니다!! ♥

2가지 중 하나이지 않을까 예상해요

1. h2 db 파일 testdb의 문제

- 기태님이 여러 설정을 건드려서 해당 설정이 적용되어 안되었거나

2. 말씀하신대로 플러그인이 문제가 되었거나.

- 이 부분은 제가 실행하려는데 오류가 생겨 11로 바꾼것인데 자바16을 설치하셨었는지 아니면 디폴트 설정이었는지 궁금하네요.ㅎㅎ

박기태님의 프로필 이미지
박기태
질문자

엇..? 2번 답변에서 자바는 11을 설치했었습니다!

그렇군요.. 왜 16으로 되어있는지 의아하네요 ㅎㅎ 원래 그런것인지..

실행이 안되어 바꿔본것인데 해결되었다니 다행입니다 ㅎㅎㅎ

긴시간 테스트 하시느라 고생많으셨어요~

1

추가로 테스트 해봤는데 정상 작동합니다.

1

박기태님의 프로필 이미지
박기태
질문자

말씀하신대로

- testdb를 추가하면서 h2 경로를 jdbc:h2:tcp://localhost/~/testdb 로 설정하였고

- application.properties를 아래와 같이 설정해주었습니다.

spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb

spring.datasource.driver-class-name=org.h2.Driver

spring.datasource.username=sa

그러나 여전히..문제가 뜨고 있습니다 ㅠㅠ..

1

박기태님의 프로필 이미지
박기태
질문자

바탕화면에 있는 내 계정 대신 다음과 같이 C 드라이브에 있는 계정으로 대체가 가능할까요?..

나머지 설정은 말씀하신 그대로 했습니다!

네 가능합니다.

해당 경로에 testdb.mv파일은 없나요??

박기태님의 프로필 이미지
박기태
질문자

앗, 네네 지금 추가했습니다!!

추가하셨다는게 임의로 testdb.mv파일을 생성하신걸 얘기하는건가요? 아니면 이미지를 첨부하였다는건가요?

만약 후자라면 이대로 진행하시고 결과를 알려주세요.

 

2.resources/application.properties 에 아래 3줄만 작성해주세요. 다른 것 추가하지마세요.

spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb

spring.datasource.driver-class-name=org.h2.Driver

spring.datasource.username=sa

3.  H2 접속을 아래와 같이 하시되 JDBC URL을 

 jdbc:h2:tcp://localhost/~/testdb로 해주세요. 나머지는 아래와 동일하게 선택 및 입력해주세요.

-

1

지금 답변 드리는 내용을 순차적으로 진행해주세요

1.  바탕 화면의 내계명명의 폴더를 선택 후

확장자가 mv인 폴더가 어떤것이 있는지 확인 해주세요.

2.resources/application.properties 에 아래 3줄만 작성해주세요. 다른 것 추가하지마세요.

spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb

spring.datasource.driver-class-name=org.h2.Driver

spring.datasource.username=sa

3.  H2 접속을 아래와 같이 하시되 JDBC URL을 

 jdbc:h2:tcp://localhost/~/testdb로 해주세요. 나머지는 아래와 동일하게 선택 및 입력해주세요.

-

이렇게 했을 때 접속이 되어야 하는데 안될 경우 다른 메시지가 출력될 것으로 예상합니다. 결과를 공유해주세요.

1

박기태님의 프로필 이미지
박기태
질문자

안녕하세요, 네! DB에는 member 테이블이 존재하고 있습니다!

application.properties 의 내용도 보여주실수 있을까요??

0

확인해보았습니다.

제가 진행한 방법은 다음과 같습니다.

자바 코드는 일절 수정하지 않았습니다. 

properties 파일도 요청드린대로 잘 바꾸셨습니다.

0. 제가 수정한 부분은 총 2가지 입니다.

0-1. spring.datasource.url=jdbc:h2:tcp://localhost/~/test2 

저는 test2.mv.db로 테스트 할 것이기에 test2로 바꿨습니다.

spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb

spring.datasource.url=jdbc:h2:tcp://localhost/~/test2

로 수정하여 진행해주세요.

 

0-2. 

<source>16</source>

<target>16</target>

을 위의 이미지처럼 11로 바꿨습니다. pom.xml을 수정하고 나서

우측 상단의 reload 버튼을 반드시 클릭하셔야 합니다.

1. testdb.mv와 test.mv를 삭제해주세요. 

2. https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.3ryn0qha48vi 

의 H2 데이터베이스 접속 오류 "해결방안2" 를 참고하여 test2.mv 파일을 직접 생성해주세요.

3.  H2를 실행시키고 

로 접속해주세요. (jdbc:h2:tcp://localhost/~/test2 복사붙여넣기)

4. 접속하시면 MEMBER 테이블을 비롯하여 어떤 테이블도 없을거에요. 빈 데이터베이스 상태일겁니다.

create와 insert를 각각 실행시켜 주세요.

복붙용

create table member

(

id bigint generated by default as identity,

name varchar(255),

primary key (id)

);

insert into member values(1,'spring');

-

다음과 같이 select 조회 테스트를 해보시고,

브라우저 테스트하면 정상 출력됩니다.

0

1. 처음 올리신 이미지를 보면 testdb.mv에 Member 테이블이 있는것을 확인하였습니다.

2. application.properties와 동일하게 맞춰달라고 요청하였고(spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb)

3. testdb의 경로도 올바른 위치에 생성되어 있는것 또한 확인하였습니다.

4. db에 접속하실 때 (spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb)

동일하게 맞춰주시면 MEMBER 테이블을 찾을수 없다는 메시지가 출력되지 않을 것입니다.

만약 이대로 진행하여도 문제가 발생할 경우 

박기태님의 위 화면(H2접속)을  포함하여 브라우저 전체 화면 캡쳐하여 올려주세요.

박기태님의 프로필 이미지
박기태
질문자

네 알겠습니다. 좀 더 확인해보도록 하겠습니다..긴 시간 도와주셔서 감사드립니다!

박기태님의 프로필 이미지
박기태
질문자

브라우저 전체 화면입니다! 감사합니다!!!

확인 도와드리겠습니다.

자주 하는 질문 - Google Docs

를 참고하여 구글 드라이브로 링크 공유해주세요. 올리실 때 액세스 권한이 출력되지 않도록 내용 확인하여 공유 부탁드립니다. 

문제 상황이 application 설정과 h2 접속 경로 관련된 것으로 보이는데 또 다른 문제로도 발생하지 않으리란 법은 없으니 제가 해당 내용 포함하여 찾아보겠습니다.

박기태님의 프로필 이미지
박기태
질문자

감사합니다..파일 링크입니다. 도움 주셔서 정말 정말 감사드립니다!!

https://drive.google.com/file/d/19xLyCwqtG0OAdVpM4lIr9PyWU5RPUH2n/view?usp=sharing

확인 후 답변 드리겠습니다.

확인까지 시간이 소요될 수 있지만 오늘내로 답변 드리도록 할게요

0

1번 파일을 c드라이브로 진입하여 확인하시려면

C:\Users\OMG(내계정명)

다음과 같이 하셔도 됩니다.

0

추가적으로 바탕화면의 내계정명 폴더

를 클릭하여 test.mv가 있는지 확인부탁드립니다.( os가 윈도우라면)

0

박기태님의 프로필 이미지
박기태
질문자

음..여전히 오류가 똑같이 나옵니다. 왜 이럴까요..ㅠㅠ 번거롭게 해드려서 죄송해요..

다음과 같이 수정했고 보여지는오류 입니다.

spring.datasource.url=jdbc:h2:tcp://localhost/~/testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.initialize=true
spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true

수강생분들 도와드리는게 제 역할인걸요 ㅎㅎ 전혀 번거롭지 않습니다.

강의자료를 참고하여 application.properties 세팅을 강의와 동일하게 해주시고, 강의자료를 참고하여

화면 접속도 동일하게 진행해주세요.

지금 올려주신 프로퍼티 설정은 박기태님이 해결을 위해 여러 설정을 포함하고 있어 문제 확인에 어려움이 있습니다.

0

박기태님의 프로필 이미지
박기태
질문자

감사합니다. application.properties의 내용입니다.

spring.datasource.url=jdbc:h2:tcp://localhost/~/test;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.initialize=true
spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true
spring.datasource.url=jdbc:h2:tcp://localhost/~/test

testdb와 test의 차이가 보이네요 뒤 내용은 지우고 확인해보시겠어요?

DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1

첫 답변에서 말씀드린 db 경로세팅 문제로 보입니다

0

안녕하세요. 박기태님, 공식 서포터즈 OMG입니다.

h2 DB를 직접 접속하면 Member 테이블이 존재할까요?

위 이미지는 USER 테이블이지만 MEMBER 테이블이 존재하는지 확인이 필요합니다.

에러 문구에도 나와있듯이 MEMBER 테이블이 존재하지 않아 발생하는 문제입니다.

혹은 잘못된 DB 경로를 세팅하여서 찾지 못하는 것일수도 있습니다.

감사합니다.