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

harper.2님의 프로필 이미지

작성한 질문수

Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부

advancedTimeBy와 thenAwait 사용 예시가 궁금합니다

24.06.10 09:41 작성

·

77

0

안녕하세요, advancedTimeBy와 thenAwait 사용 예시를 모르겠어서 문의드립니다.

강의 중 advancedTimeBy는 '특정 시간을 당겨서 앞서 나가는 것'이라 설명해주셨고,

thenAwait은 해당 시간이 빠르게 다가오는 걸로 이해하면 된다고 설명해주셨습니다.

 

궁금한 점은

1) 각각의 테스트가 필요한 예시를 조금만 더 자세히 들어주실 수 있으실까요? 특정 프로젝트에서 어떤 상황일 때 해당 방법이 필요한지 감이 잡히지 않습니다.

1-2) 어떤 상황에 필요한 것인지 모르다보니, advancedTimeBy와 thenAwait의 쓰임이 분명히 구분돼 있을텐데도 유사한 방식이 아닌가? 라는 생각이 듭니다. 이 부분도 예시로 설명해주실 수 있다면 함께 설명해주시면 감사하겠습니다.

 

답변 1

1

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

2024. 06. 10. 12:24

안녕하세요? advancedTimeBy()와 thenAwait()의 차이점에 대해서 질문 주셨는데요.

일단 결론부터 말씀드리면 두 메서드는 정말 거의 동일한 기능을 하기 때문에 실제 시간을 당긴다는 측면에서는 둘 중 어떤걸 사용해도 상관없습니다.

다만, advancedTimeBy()는 능동적으로 시간을 제어한다고 볼 수 있고, thenAwait()은 수동적으로 가상의 시간이 흘러가는 걸 기다린다는 측면에서 수동적입니다.

 

반드시 어떤 상황에 이걸 사용해야 한다고 딱 꼬집어서 명시되어 있는건 아닌데 일반적으로 advancedTimeBy()는 복잡한 테스트 시나리오에서 직접적으로 시간을 세밀하게 제어하고 싶을 때 사용하고, thenAwait()은 스케쥴링이 되어 있는 반복적인 작업 등에서 상태 변화를 체크하는데 사용됩니다.

 

advancedTimeBy() 같은 경우, 복잡한 테스트 시나리오에 적용하니 코드 가독성도 좀 떨어질 수 있지만 thenAwait() 같은 경우는 메서드 자체도 굉장히 직관적이라서 코드 가독성이 좋을테구요.

 

예를 들어서 10분에 한번씩 데이터를 가져와서 캐시를 업데이트 하는 로직이 있는데, 테스트 할 때 마다 10분씩 기다리면 비효율적이니까 advancedTimeBy()와 thenAwait() 중에 하나를 이용해서 시간을 당기면 될텐데요.

 

이때 10분에 한번 씩 데이터를 가져오는 로직이 단순하면 thenAwait()을 사용하는게 더 바람직할 테구요.

만약에 어떤 로직이 복잡한 상황을 처리하는 로직일 경우 이를 테면,

Flux

      .concat(

           fetchDataSource1(),

           fetchDataSource2(), 

           fetchDataSource3()
      )

 

이런 식으로 데이터를 여러 곳에서 fetch 해야하는 상황인데, 각 Sequence에서 fetch 하는 시간이 다를 경우 각각의 sequence 별로 데이터를 fetch하는 시간 주기를 세밀하게 당겨서 테스트 하고 싶을 때, advancedTimeBy()를 사용하는게 조금 더 적절하지 않을까 생각합니다.

 

근데 둘 중 어떤걸 사용해도 둘 다 시간을 당기는 것이기 때문에 테스트를 수행할 수 있을겁니다.

결국 비슷한 기능을 사용자가 선택해서 사용할 수 있도록 여러 선택지를 주었다라고 생각해 볼 수도 있는 문제인거 같네요.

 

질문에 대한 답변이 충분히 되셨길 바랍니다.

감사합니다.

harper.2님의 프로필 이미지
harper.2
질문자

2024. 06. 10. 13:38

자세한 답변 감사합니다 :)

harper.2님의 프로필 이미지

작성한 질문수

질문하기