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

hyun님의 프로필 이미지
hyun

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

JPA와 DB 설정, 동작확인

test오류

해결된 질문

작성

·

4K

0

테스트 진행 중 오류가 납니다.

구글링해두 해결을 못하겠네요 ㅠㅠ

어쩌다가 테스트 진행이 됐었는데 시퀀스를 계속 삭제해줘야 됐었습니다.

H2 1.4.200 버전맞고 다른 소스들 교재랑 같습니다.

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 듣고 기존에 쓰던 H2에서 database만 추가해서 사용중인데 이게 문제가 될까요?

 

java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@597a7afa testClass = jpabook.jpashop.MemberRepositoryTest, locations = [], classes = [jpabook.jpashop.JpashopApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceLocations = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@9da1, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@49d904ec, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@3c419631, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@3e2e18f2, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@63355449, org.springframework.boot.test.context.SpringBootTestAnnotation@8c81e9cd], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]

at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:141)

at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:127)

at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:192)

at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131)

at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:249)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:290)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:292)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)

at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)

at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)

at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)

at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)

at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)

at org.junit.runners.ParentRunner.run(ParentRunner.java:413)

at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)

at org.junit.runner.JUnitCore.run(JUnitCore.java:137)

at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)

at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)

at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)

at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)

at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)

at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=jpabook.jpashop.Member]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521)

at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)

at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1130)

at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:905)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584)

at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730)

at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)

at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137)

at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:59)

at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:47)

at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1386)

at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:543)

at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137)

at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108)

at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:183)

at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)

... 27 more

Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=jpabook.jpashop.Member]

at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421)

at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)

at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1797)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1747)

... 48 more

Caused by: org.hibernate.MappingException: Could not instantiate id generator [entity-name=jpabook.jpashop.Member]

at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:222)

at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:515)

at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:372)

at org.hibernate.internal.SessionFactoryImpl.lambda$new$1(SessionFactoryImpl.java:291)

at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)

at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)

at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1779)

at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)

at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)

at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)

at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)

at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)

at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)

at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:290)

at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:415)

at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1425)

at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66)

at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376)

at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)

... 52 more

Caused by: org.hibernate.HibernateException: Could not fetch the SequenceInformation from the database

at org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.sequenceInformationList(ExtractedDatabaseMetaDataImpl.java:302)

at org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.getSequenceInformationList(ExtractedDatabaseMetaDataImpl.java:151)

at org.hibernate.id.enhanced.SequenceStyleGenerator.getSequenceIncrementValue(SequenceStyleGenerator.java:561)

at org.hibernate.id.enhanced.SequenceStyleGenerator.configure(SequenceStyleGenerator.java:210)

at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:217)

... 70 more

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "start_value" not found [42122-214]

at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)

at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)

at org.h2.message.DbException.get(DbException.java:223)

at org.h2.message.DbException.get(DbException.java:199)

at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3492)

at org.h2.jdbc.JdbcResultSet.getLong(JdbcResultSet.java:745)

at com.zaxxer.hikari.pool.HikariProxyResultSet.getLong(HikariProxyResultSet.java)

at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.resultSetStartValueSize(SequenceInformationExtractorLegacyImpl.java:110)

at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.lambda$extractMetadata$0(SequenceInformationExtractorLegacyImpl.java:54)

at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:50)

at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39)

at org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.sequenceInformationList(ExtractedDatabaseMetaDataImpl.java:286)

... 74 more

 

답변 8

4

되게 오래전에 답글을 남겼었는데, 알림이 와서 새롭게 해결했던? 방안을 가지고 왔습니다!
물론, 기존의 운영 데이터 단에서는 사용하지 않는 것이 좋고 개발을 진행하는데에 있어서 초기 테스트 DB용에서만 이 방법을 택해주시면 좋을 것 같습니다~

h2 데이터베이스에서 h2 drop all objects 를 입력해주시면 저장되어있던 테이블이 싹 다 날라가게 됩니다.
h2 데이터베이스도 Intellij Build 와 동일하게 증분 빌드를 하는 과정에서 삭제 된 데이터(테이블)에 대해서는 관리를 하지 않는 것처럼 보였습니다.

이러한 이슈는 일대다 읽기 전용 테이블이 생성되었다가 해당 연관관계를 삭제하더라도 테이블이 계속해서 h2 데이터베이스에 남아있을 때에도 동일하게 적용되었습니다!

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

공유 감사합니다! 오래 전 질문인데도 답변 달아주시고 대단하시네요.

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. start_value 오류가 나시는 분들은 H2 데이터베이스의 버전과 애플리케이션에서 사용하는 H2 데이터베이스의 라이브러리 버전이 맞지 않아서 그렇습니다.

이런 경우 기존 H2 데이터베이스를 삭제하고 H2 데이터베이스 최신 버전으로 다시 설치해주세요. 그리고 기존에 있던 jpashop.mv.db 파일은 꼭! 삭제해주셔야 합니다.

2

로그를 보시면 Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=jpabook.jpashop.Member] 가 보이고, Column "start_value" not found 가 보이는데요.
아마도 H2 데이터베이스를 사용하시면서 엔티티 테이블의 기본키 생성 때

@GeneratedValue(strategy = GenerationType.IDENTITY)

를 사용하신 적이 있을 경우에, 발생하는 오류인데요.
https://stackoverflow.com/questions/64615730/how-to-fix-error-with-h2-plugin-version-1-4-200-when-run-spring-tests-jdbcsql
해당 글 참고 하시면 H2 방언 추가해줘서 해결됐다는 경우가 있어요.
추가적으로 만약 DB가 초기화되어도 문제가 없으시다면 create로 하면 테이블이 초기화 되면서 해당 문제가 해결이 될거에요. 만약에 DB의 값을 유지하고 싶으면
저도 mysql DB로 한 번 테스트 해봤다가 H2로 데이터베이스 바꾸면서 동일한 문제가 발생중인데요.
spring:
jpa:
hibernate:
ddl-auto: update
데이터는 유지하고 싶어서 update를 사용하였는데, 스프링 부트 내부 로직에서 참조 시에 이전에 추가된 start_value를 계속 찾는 것 같아요... 찾을 수 있으면 좋을텐데요.. 만약에 찾게되면 알려드리겠습니다!

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

우선 답변 감사합니다!

저는 이전강의에서 H2를 사용했었기 때문에 이번강의에서는 jpashop이라는 database를 새로만들어서 application.yml에서 ddl-auto: create로 진행을 했었습니다. 링크따라서 properties 하위에도 ddl-auto:create를 선언해줬지만 아무 변화가 없네요.. H2랑 DB도 다 지우고 다시해봤는데도 똑같구요.. 원하시던 답변이 아니라서 죄송합니다 ㅠ 저도 더 찾아보려구요

ㅠㅠ 도움이 못되서 아쉽네요... 혹시나 ddl-auto: create를 사용하셔도 동일한 오류시라면
datasource의 url의 db이름 문제 일수도 있어요!
새로 데이터베이스를 만들었다고 하시니, 혹시나 해서요!

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

url에 기존 db이름을 적는 상황을 말씀하시는걸까요 ? 새로 만든 db이름으로 적었어요 흑흑 교재 소스 그대로 복붙도 다 해보고 했는데도... ㅎㅎㅎㅎ

1

기존에 저도..

spring:
  jpa:
    hibernate:
      ddl-auto: create

ddl-auto를 create로 안하고 update로 바꿔줬더니 에러가 나더나고요..

저도 Entity에

@GeneratedValue(strategy = GenerationType.IDENTITY)

로 쓰고 있었고요..

spring:
  jpa:
    hibernate:
      hbm2ddl.auto: update

이렇게 하니까 되긴 하더라고요?

이유는 잘 모르겠네요.. 찾아봐야겠어요 ㅜ_ㅜ

 

0

저 이거 application.yml에서

url 작성부분에

url: jdbc:h2:tcp://localhost/~/jpashop;MVCC=TRUE

에서

url: jdbc:h2:tcp://localhost/~/jpashop

로 고쳤더니 해결됐습니다.. ;MVCC=TRUE는 못쓰나봐요

h2버전에 따라 오류가 발생할 수 있습니다.

메뉴얼을 참고하여 수강하시면 버전 차이로 인한 오류 내용을 확인하실 수 있으니 참고 부탁드립니다

image

0

이거 해결하셨나요? 저는 지금 해결 못해서 진행을 못하고 있어요ㅠㅠ

발생하는 오류 상황을 정리하여 글을 남겨주세요. 영한님과 서포터즈가 확인 후 답변 드리겠습니다

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

image

네 저는 이 부분을 못봐서 생긴 문제였어요! build.gradle 을 복붙하니까 바로 됐어요

0

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

추가로 이렇습니다.

member테이블 삭제O, 시퀀스 삭제X > 테스트 오류

member테이블 삭제O, 시퀀스 삭제O > 테스트 가능

member테이블 삭제X, 시퀀스 삭제O > 테스트 가능

 

+Member클래스에서 id컬럼 @GeneratedValue(strategy = GenerationType.IDENTITY) 로 설정하면

테스트는 계속 가능하나 ID: 1, USERNAME:memberA 가 들어가있는 상태에서

USERNAME를 memberB로 넣고 테스트 진행하면 ID: 1, USERNAME:memberB로 USERNAME만 바꿔치기 되는 상황입니다...

(Rollback옵션은 false인 상황)

 

0

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

start_value라고 지정한 컬럼이 있나요? 강의 중에는 작성하지 않은 컬럼으로 보이는데 에러메시지에 포함되어 있네요.

start_value라고 지정한 컬럼이 있다면 제거 후에 확인해보시고, 해결이 안될 경우 댓글남겨주세요 ^^

image
.
감사합니다.

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

없습니다... ㅠㅠ 어디에도 저 컬럼은 없어서 저도 의문입니다 저게 왜 뜨는지...

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


전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

구글 드라이브 업로드 방법 링크

주의: 업로드시 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

hyun님의 프로필 이미지
hyun

작성한 질문수

질문하기