• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

비동기 쿼리

20.12.08 17:33 작성 조회수 466

0

안녕하세요 기선님 항상 좋은 강의 감사드립니다! 매 영상마다 질문을 남기는 것 같아 죄송하네요.. 

비동기 쿼리에 대한 내용을 제 나름대로 요약해서 해석해보려 노력중인데 곡해가 있을까 걱정이 되어 이렇게 글을 남깁니다. 

비동기 쿼리를 사용하는 것을 보니, 쿼리를 날리고 데이터를 받아오기 전까지 메인 쓰레드를 놀리지 않기 위해 비동기 쿼리를 사용하는 것으로 보입니다.  그런데 Future 을 사용하면 결국 get 으로 받아오는 작업에서 메인쓰레드가 블로킹이 되니까 Future 보단 콜백메서드를 사용할 수 있는 ListenableFuture 을 사용하는 걸 추천하신거라고 이해 됩니다. 그렇다면 여기서 조금 쓸모없는(?) 작업이긴 하지만 Future 의 get 을 받는 Thread 를 직접 구현해도 되겠다는 생각도 듭니다. 

그리고 비동기 쿼리에 대한 테스트 코드 작성이 어려운 이유는  테스트의 특성상 위 테스트는 작업 전체가 한 트랜잭션이 될 테고,  save 된 데이터를 가져오기 위한 쓰레드가 작업을 마치기도 전에 메인쓰레드가 끝나버리면서 하이버네이츠의 DB에 변화를 가져오지 않는 쿼리는 날리지도 않는 특성에 의해 insert 쿼리 조차 날라가지 않는 테스트가 되는 거구요. 

의도적으로 flush() 를 통해 insert 를 할 수 는 있으나, insert 와 같은 트랜잭션 안에서 시작된 select 쿼리는 그 트랜잭션 내에서 insert가 된 데이터를 인지할 방법은 없게 된다는 설명으로 이해했습니다.  

그렇다면.. 테스트를 위해서 @BeforeEach 를 통해 데이터를 먼저 집어넣은 상태로 동작을 확인할 수 있진 않을까 했지만,

이 작업자체도 DB의 변화를 일으키는 작업이 아닌만큼

하이버네이츠가 insert 를 날리지조차 않더군요. 그래서 위 코드에서 flush()를 추가하여 insert를 날렸지만.. 

결과는 이렇더군요... 그런데 제 나름대로의 해석으로는 마지막 결과가 조금 이해가 되지 않네요..   데이터를 집어넣었고

select 를 하는게 보이는데, size 는 0 이뜨고 근데 또 테스트는 

성공하네요.. 

@BeforeEach도 결국은 한 트랜잭션안에서 동작하여 기존의 테스트 코드처럼 내부에서 Comment를 insert 하는 것과 동일한 작업인것인지.. 

근데 또 테스트는 어떻게 성공한건지...  

어디가 잘못된걸까요? 또 만약,, 제가 이상하게 이해한 부분이 있는 것 같다면 알려주시면 너무 감사하겠습니다!!   

답변 2

·

답변을 작성해보세요.

0

맞게 이해하신 것 같습니다. 그런데 테스트 케이스는 저도 잘 이해가 안되네요. size가 0인데 어떻게 0번째에 데이터가 들어있을까요. 디버거를 사용해서 result에 실제로 데이터가 들어있지만 size가 0인지 확인해 보시겠어요? 

0

jaden님의 프로필

jaden

질문자

2020.12.08

음.. 계속 보다보니 

2020-12-08 18:20:47.880  INFO 76868 --- [           main] .s.a.AnnotationAsyncExecutionInterceptor : No task executor bean found for async processing: no bean of type TaskExecutor and no bean named 'taskExecutor' either

다음과 같은 로그도 보이는데,  aynsc 관련 빈이 설정이 안된건가요? 

@DataJpaTest 로 슬라이싱 테스트해서 그런줄 알고 통합테스트로 변경해도 같은 로그가 남네요