에러 내용
could not prepare statement [Table "MEMBER" not found; SQL statement:
insert into member (username,id) values (?,default) [42102-224]] [insert into member (username,id) values (?,default)]; SQL [insert into member (username,id) values (?,default)]
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement [Table "MEMBER" not found; SQL statement:
insert into member (username,id) values (?,default) [42102-224]] [insert into member (username,id) values (?,default)]; SQL [insert into member (username,id) values (?,default)]
// at 부분 생략
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement [Table "MEMBER" not found; SQL statement:
insert into member (username,id) values (?,default) [42102-224]] [insert into member (username,id) values (?,default)]
// at 부분 생략
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" not found; SQL statement:
insert into member (username,id) values (?,default) [42102-200]
Table을 찾을 수 없다고 한다.
발생 상황
H2 데이터베이스로 연결하여 데이터를 저장하는 테스트를 실행할 때 발생하였다.
내가 작성한 코드는 아래와 같다.
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
}
@Repository
public class MemberRepository {
@PersistenceContext
EntityManager em;
public Long save(Member member) {
em.persist(member);
return member.getId();
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
아무리 봐도 잘못된 부분은 없어 보였다. 잘못되기엔 테스트용이라 내용이 아주 간단하기도 하고..?
게다가 테이블이 생성되지 않았다는 건 데이터베이스 관련 설정이 뭔가 잘못되어 있어서 그럴 거라는 생각이 들었다.
해결
문제는 application.yml 파일이었다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
logging.level:
org.hibernate.SQL: debug
application.properties로만 설정을 하다가 이번에 처음으로 yml을 써봤는데,
띄어쓰기가 제대로 되어 있지 않아서 ddl-auto가 되지 않았던 거였다.
다음과 같이 수정했다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
driver-class-name: org.h2.Driver
#jpa 이하 부분을 spring 내에 들어가도록 띄어쓰기를 해야 함
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
logging.level:
org.hibernate.SQL: debug
jpa쪽 설정 부분을 datasource와 같은 줄로 맞췄다.
yml로 작성할 때는 띄어쓰기를 유의해야 한다고 듣긴 했지만.. 저 부분 때문일 거란 생각을 못했었다.
이렇게 한번 틀려서 시간을 날렸으니 다음엔 틀리지 않길🥹