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

구준형님의 프로필 이미지

작성한 질문수

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

리포지토리를 사용하는 HelloService

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

작성

·

749

5

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

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

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

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

https://github.com/rnwnsgud/helloboot

 

답변 2

1

토비님의 프로필 이미지
토비
지식공유자

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

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

구준형님의 프로필 이미지
구준형
질문자

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

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

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

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

토비님의 프로필 이미지
토비
지식공유자

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

일단 해결 방법은 간단합니다. 강의에서처럼 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

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

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

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

토비님의 프로필 이미지
토비
지식공유자

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

답변 감사합니다!