inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

토비의 스프링 부트 - 이해와 원리

리포지토리를 사용하는 HelloService

@PostConstruct로 테이블을 생성하지 못합니다.

917

구코딩

작성한 질문수 12

6

 오류 내용을 보니 hello 테이블을 찾을 수 없다고 뜹니다.

그래서, @PostContruct가 안 동작하나? 생각해서 프린트로 찍어보게 메인메서드를 돌리면 잘 찍힙니다.

그리고 기존 방식처럼 jdbctemplate을 주입해서 @BeforeEach로 생성하는 방식으로는 잘 동작하네요.

너무 궁금해서 git 주소를 남겨봅니다 ㅠ

https://github.com/rnwnsgud/helloboot

 

spring-jdbc spring spring-boot

답변 2

1

토비

서버를 실행하고 API 테스트를 수행하는 중에 에러가 난 것인가요?

좀 더 구체적으로 어떤 작업을 수행하는 중에 어떤 에러가(에러 메시지를 다 올려주세요) 났는지를 알려주셔야 원인을 찾아볼 수 있습니다.

0

구코딩

HelloApiTest에서 helloApi()에서 오류발생.

HelloRepositoryTest, HelloServiceCountTEst에서 오류가 발생합니다.

강의 11분 14초 쯤 @PostConstcut로 테이블을 생성하고 위 테스트를 돌리면 에러가 납니다. 아래는 오류 메시지 입니다.

오류메시지 출력전에 디버그 메시지(?) 이게 너무 많네요 일단 전부 올리겠습니다.

5

토비

올려주신 프로젝트를 받아서 테스트를 해보니 저도 동일한 에러가 발생합니다.

일단 해결 방법은 간단합니다. 강의에서처럼 DataSourceConfig의 DataSource타입을 리턴하는 @Bean 메소드의 순서를 hikariDataSource를 앞으로 가져오면 hikariDataSource가 빈으로 선택되어서 동작하고 테스트까지 문제 없이 잘 동작합니다.

그렇다면 스프링의 SimpleDriverDataSource는 왜 DB 연결도 되고 SQL 실행도 잘 되는데, 생성한 테이블이 다음 요청을 할 때는 사라지는가라는 의문이 남습니다.

강의에서는 SimpleDriverDataSource라는 스프링에 포함된, 실전에서는 절대 사용하지 말라는 아주 단순하게 매번 커넥션을 새로 생성하는 DataSource 구현을 이용해서 일단 DataSource를 통해서 DB 연결까지 잘 수행되는지까지만 테스트를 하는데 사용했습니다. 그런데 왜 이게 생성된 DB 정보가 유지되지 않고 사라지는지는, 아마도 h2 내장형 DB와 관련이 있지 않을까 싶습니다.

이부분은 제가 아직 정확한 원인을 파악은 해보지 못했습니다. Hikari Datasource에서는 잘 동작하는 것으로 봐서는 단순 DataSource에서도 잘 동작해야할 것 같은데, 메모리에만 생성되는 내장형 DB로 동작할 때 뭔가 요구되어지는 다른 처리등이 필요한게 아닌가 싶습니다.

일단 강의에서 설명하는 내용을 테스트 해보시는 용도로는
DataSource hikariDataSource(MyDataSourceProperties properties) 메소드를 앞으로 가져오셔서 사용되게 만드시고 진행을 해보세요.

SimpleDriverDataSource가 내장형 h2를 사용할 때는 왜 에러가 나지 않고 SQL이 잘 동작했음에도, 만들어진 테이블이 사라지는지, 어떤 초기화 등이 돌아가는지 등에 관해서는 제가 시간이 날 때 한번 차근차근 살펴보도록 하겠습니다. 실전에서 쓸 기술은 아니지만, 그래도 궁금하네요.

0

구코딩

자세한 답변 감사드립니다! 좋은 강의 잘 보고 있어요.

0

강의계정

제 생각으로는 @postContruct 에서 별도 create 쿼리가 수행된 이후에 커넥션을 닫아서 h2의 인메모리 모드에서 데이터베이스가 초기화되어서 그런것 같습니다.

이후 update 나 insert 를 수행할때는 SimpleDataSource 에서는 다시 커넥션을 연결을 시도하겠지만, 결국 인메모리 모드 h2 상에서는 create 한 테이블이 없기에.. 그런 것 같습니다.

Hikari cp 같은 경우에는 최소한의 idle Connection 을 유지하기에 h2 는 계속적으로 연결이 되어 있다고 생각하여, create 이후에도 별도의 초기화 과정이 수행되지 않는 것 같습니다.

1

토비

좋은 의견 감사합니다. 아무리 메모리 DB라도 애플리케이션이 종료된 것도 아닌데 connection이 끊어졌다고 테이블을 날리느 건 좀 이상하긴 합니다. 뭔가 잘 안 맞는 조합인 것 같기도 하고요. 어쨌든 SimpleDriverDataSource와 H2를 같이 사용하지 않는게, 아무리 테스트에서도 필요할 듯합니다.

0

강의계정

답변 감사합니다!

 

11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지

0

75

2

TestRestTemplate 을 통해 테스트 실행시 웹 요청 정보가 콘솔에 표시되지 않습니다.

0

85

1

섹션7. 자동구성 정보파일분리 강의 질문(@MyAutoConfiguration 붙힌 이유)

0

201

2

WebApplicationContext를 DispatcherServlet에 this로 넘기는 것

0

279

2

인프라 빈 구성 정보의 분리에서 EnableMyAutoConfiguration 질문드립니다.

0

210

2

질문드립니다.

0

232

2

spring boot 3.3.7로 학습중입니다.

0

369

2

Serverproperties 객체 생성 후 @Impor 어노테이션 사용 이유 용도

0

162

2

spring start io 에서 이제더이상 2.x버전은 지원하지 않는 것 같습니다.

1

296

2

Springboot 3.2 이상에서 파라미터 추론관련

0

913

4

binding error

0

220

3

Arrays.copyOf 메서드의 타입 세이프

1

155

2

MyOnClassCondition에 있는 matches method의 Invoke 횟수

1

233

3

인용구의 출처가 궁금합니다.

0

259

1

프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용

0

236

2

SimpleCacheConfiguration과 빈 등록

0

168

2

MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점

0

244

1

IntelliJ project jenerator spring initailizr

0

150

1

강의 자료 레퍼지토리에 업로드

0

216

1

강의자료

0

388

1

Hikari 라이브러리가 없으면 오류가 나는거 아닌가요

0

314

2

Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의

0

476

5

@Import 로 Bean을 등록해야하는 기준이 뭔지 궁금합니다.

0

340

2

application.properties파일내 프로퍼티 이름

0

210

1