작성
·
749
5
오류 내용을 보니 hello 테이블을 찾을 수 없다고 뜹니다.
그래서, @PostContruct가 안 동작하나? 생각해서 프린트로 찍어보게 메인메서드를 돌리면 잘 찍힙니다.
그리고 기존 방식처럼 jdbctemplate을 주입해서 @BeforeEach로 생성하는 방식으로는 잘 동작하네요.
너무 궁금해서 git 주소를 남겨봅니다 ㅠ
https://github.com/rnwnsgud/helloboot
답변 2
1
서버를 실행하고 API 테스트를 수행하는 중에 에러가 난 것인가요?
좀 더 구체적으로 어떤 작업을 수행하는 중에 어떤 에러가(에러 메시지를 다 올려주세요) 났는지를 알려주셔야 원인을 찾아볼 수 있습니다.
올려주신 프로젝트를 받아서 테스트를 해보니 저도 동일한 에러가 발생합니다.
일단 해결 방법은 간단합니다. 강의에서처럼 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 이후에도 별도의 초기화 과정이 수행되지 않는 것 같습니다.
HelloApiTest에서 helloApi()에서 오류발생.
HelloRepositoryTest, HelloServiceCountTEst에서 오류가 발생합니다.
강의 11분 14초 쯤 @PostConstcut로 테이블을 생성하고 위 테스트를 돌리면 에러가 납니다. 아래는 오류 메시지 입니다.
오류메시지 출력전에 디버그 메시지(?) 이게 너무 많네요 일단 전부 올리겠습니다.