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

..님의 프로필 이미지

작성한 질문수

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

H2 데이터베이스 설치

회원가입 member 오류

해결된 질문

작성

·

307

0


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

[질문 내용]

프로젝트 먼저 첨부합니다.

https://drive.google.com/file/d/1xDPF5Zfm4ou2KgjOeroxDoAaXHuuiE9s/view?usp=sharing

 

중복회원예외와 회원가입 테스트에서 아래와 같은 오류가 발생합니다.

 

org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement [Table "MEMBER" not found (this database is empty); SQL statement:

select m1_0.id,m1_0.name from member m1_0 where m1_0.name=? [42104-224]] [select m1_0.id,m1_0.name from member m1_0 where m1_0.name=?]; SQL [select m1_0.id,m1_0.name from member m1_0 where m1_0.name=?]

 

Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement [Table "MEMBER" not found (this database is empty); SQL statement:

select m1_0.id,m1_0.name from member m1_0 where m1_0.name=? [42104-224]] [select m1_0.id,m1_0.name from member m1_0 where m1_0.name=?]

 

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" not found (this database is empty); SQL statement:

select m1_0.id,m1_0.name from member m1_0 where m1_0.name=? [42104-224]

 

이 오류가 뜨기 전에도 실행은 되나, 테이블이 생성이 되지 않았는지 h2에서 select * from member; 했을 때 아무것도 나오지 않는 문제가 있었습니다. 더하여 http://localhost:8080/ 이 연결거부됐다고 나오면서 아예 접속이 되지 않습니다. 어떤 부분에 오류가 있을까요? 계속 다른 오류들이 나오면서 조금씩 수정해봤던 것이라 어디서부터 잘못된지도 잘 모르겠습니다,,

 

답변 2

2

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

프로젝트 코드 실행해보았습니다.

저는 정상적으로 실행되었는데요, 강의를 따라서 코드를 열심히 작성하셨네요 😀

우선,

Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement [Table "MEMBER" not found (this database is empty); SQL statement:

이런 오류가 발생한 것은 h2 데이터베이스에 회원정보를 저장하는 회원 테이블(MEMBER)가 없어서 발생한 것이고, 댓글에서 작성하신 SQL을 실행하여 회원 테이블을 생성했기에 정상 동작한 것입니다.

(해결방법을 잘 적용하여 진행하셨습니다 ^^)

 

그리고 localhost:8080의 접근 오류는

아래 빨갛게 밑줄 친 테스트를 실행하는 실행 환경이 아닌!

image개발한 프로그램을 실행하기 위한 실행 버튼을 클릭하여 확인해보셔야 합니다 😀

image

 

감사합니다.

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

답변 감사합니다!

localhost:8080 은 해결되었습니다.

그런데 매번 h2에 테이블 생성 sql을 직접 작성하여 실행해야 하나요? 프로젝트 내의 ddl.sql 파일은 연결이 안된 것일까요..?

그리고 localhost:8080 에서 회원가입 버튼을 눌러 등록해야만 h2에 select * from member; 했을 때 조회가 되는 것이 맞을까요? MemberServiceIntegrationTest에서 회원가입() setName에 name을 넣어 테스트했을 때 h2에 자동 등록이 되었던 것 같은데 조회되지 않습니다. 혹시 이 부분에 대해 제가 잘못알고 있는 것일까요?

그런데 매번 h2에 테이블 생성 sql을 직접 작성하여 실행해야 하나요? 프로젝트 내의 ddl.sql 파일은 연결이 안된 것일까요..?

=> 아니요, 한번 생성한 테이블은 테이블 삭제 액션이 발생하지 않는 이상 그대로 남아있습니다.

따라서 매번 직접 실행할 필요는 없습니다.

 

localhost:8080 에서 회원가입 버튼을 눌러 등록해야만 h2에 select * from member; 했을 때 조회가 되는 것이 맞을까요?

=> 네 맞습니다. localhost:8080에서 회원가입한 대상이 실제 쿼리가 발생하고 조회 됩니다.

 

MemberServiceIntegrationTest에서 회원가입() setName에 name을 넣어 테스트했을 때 h2에 자동 등록이 되었던 것 같은데 조회되지 않습니다.

=> 테스트 실행환경인데요, 테스트 실행환경에서도 DB(h2)에 데이터를 INSERT(저장) 할 수 있습니다만, 별도의 조치가 필요합니다.

테스트 대상인 메서드 위에 @Commit 혹은 @Rollback(false) 둘 중 하나를 추가하시면 됩니다.

 

image

"구체적으로 어떤 코드나 액션을 취했을 때 어떠한 상황이 발생했다" 라는 정보가 없어서 더 구체적인 설명을 드리기는 힘들 것 같아요. 발생하는 상황을 확인할 수 있는 시나리오를 확인하여 추가로 글을 남겨주시면 도움 드리도록 하겠습니다 😀

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

다 해결되었습니다🥹

답변 정말 감사드립니다!!!!

0

안녕하세요, 인프런 AI 인턴입니다.

질문자님의 문제는 org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" not found (this database is empty); SQL statement 오류로, 스프링 부트에서 H2 데이터베이스에 접근하여 MEMBER 테이블을 조회하려 할 때 해당 테이블을 찾지 못하는 상황을 말합니다. 이는 주로 데이터베이스 연결 설정의 문제, 테이블 생성 관련 실수, 혹은 프로젝트와 데이터베이스 간의 경로 불일치 등 다양한 원인으로 발생할 수 있습니다.

이와 유사한 문제에 대한 해결 방안을 제공하는 질문들을 찾아 보았습니다:

해결책의 주요 포인트를 요약해보면 다음과 같습니다:

  1. H2 데이터베이스에 접속하여 MEMBER 테이블이 실제로 존재하는지 확인합니다.
  2. application.propertiesapplication.yml 파일에 설정된 데이터베이스 URL이 프로젝트에서 사용하고자 하는 데이터베이스와 일치하는지 검토합니다.
  3. H2 데이터베이스의 접속 URL이 jdbc:h2:tcp://localhost/~/test 등으로 시작하는 경우, 데이터베이스 접속 경로가 올바르게 설정되었는지 확인합니다.
  4. 프로젝트와 데이터베이스 간의 경로 불일치가 없는지, 데이터베이스 파일이 올바른 위치에 있는지 검토합니다.

이 문제를 해결하기 위해서는 먼저 데이터베이스 접속 설정을 철저히 확인하고, 필요한 경우 H2 데이터베이스 콘솔이나 관리 도구를 이용하여 MEMBER 테이블의 존재 유무를 확인하는 것이 좋습니다. 또한, 스프링 부트 설정 파일에서 데이터베이스 접속 정보가 정확히 구성되었는지 검토해볼 필요가 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

drop table if exists member CASCADE;

create table member

(

id bigint generated by default as identity,

name varchar (255),

primary key (id)

);

이걸 h2에 직접 입력했더니 실행이 되긴 합니다. 이건 코드를 어떻게 수정해야할까요..? 그리고 http://localhost:8080/ 은 연결이 안됩니다..

..님의 프로필 이미지

작성한 질문수

질문하기