Skip to content

feat: sleep util function#22

Merged
prgmr99 merged 3 commits into
mainfrom
feature/utils-workspace-yeom
Aug 31, 2025
Merged

feat: sleep util function#22
prgmr99 merged 3 commits into
mainfrom
feature/utils-workspace-yeom

Conversation

@prgmr99
Copy link
Copy Markdown
Member

@prgmr99 prgmr99 commented Aug 30, 2025

Description

sleep 유틸리티 함수 추가

  • 지정된 시간(ms)만큼 코드 실행을 지연시키는 Promise 기반의 sleep 함수를 구현했습니다.
  • Math.max(0, ...)를 사용하여 음수 입력값에 대한 방어 로직을 추가하여 안정성을 높였습니다.

테스트 케이스:

  • 지정된 시간 이후에 resolve 되는 경우
  • 지정된 시간 이전에는 resolve 되지 않는 경우
  • 0ms 및 음수 값을 입력했을 때의 엣지 케이스

closes #20

@prgmr99 prgmr99 requested a review from klmhyeonwoo August 30, 2025 12:19
@prgmr99 prgmr99 self-assigned this Aug 30, 2025
@klmhyeonwoo
Copy link
Copy Markdown
Member

klmhyeonwoo commented Aug 30, 2025

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 61.26% 87 / 142
🔵 Statements 61.26% 87 / 142
🔵 Functions 92.85% 13 / 14
🔵 Branches 95.65% 44 / 46
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
package/commonUtil/sleep/index.ts 100% 100% 100% 100%
Generated in workflow #36 for commit 5b2b242 by the Vitest Coverage Report Action

@prgmr99
Copy link
Copy Markdown
Member Author

prgmr99 commented Aug 30, 2025

💡 공유 사항: 테스트 코드 Q&A

테스트 코드에 사용된 Vitest의 타이머 관련 API에 대해 제가 궁금했던 점들을 정리해보았습니다.

Q1. vi.advanceTimersByTimeAsync()는 왜 사용하나요?

A:
실제 시간을 기다리지 않고 테스트를 즉시 실행하기 위함입니다.
vi.useFakeTimers()로 타이머를 가상으로 만든 뒤,
이 함수로 가상 시계를 원하는 시간만큼 '빨리 감기'하여 setTimeout이 즉시 실행되도록 만듭니다.
덕분에 sleep(5000) 같은 테스트도 5초를 기다릴 필요 없이 순식간에 끝낼 수 있습니다.

Q2. afterEach에서 vi.useRealTimers()로 타이머를 되돌리는 이유는 무엇인가요?

A:
테스트 간의 독립성을 지키기 위함입니다. 만약 한 테스트 파일에서 타이머를 가짜로 바꾼 채로 끝내면, 그 상태가 다음에 실행되는 다른 테스트 파일에 영향을 미쳐 예상치 못한 오류를 발생시킬 수 있습니다. afterEach에서 원래 타이머로 되돌리는 것은, 내가 사용한 환경을 깨끗하게 정리하여 다른 테스트에 부작용(Side Effect)을 일으키지 않도록 하는 좋은 습관입니다.

Q3. await expect(promise).resolves.toBeUndefined() 코드는 어떤 의미인가요?

A:
"promise라는 Promise가 성공적으로 완료(resolve)될 때까지 기다린 후, 그 결과값이 undefined일 것이라고 단언한다"는 의미입니다.
resolves: Promise가 성공할 때까지 기다리라는 비동기 Matcher입니다.
toBeUndefined(): sleep 함수는 resolve() 시 아무 값도 반환하지 않으므로, 그 결과값이 undefined가 맞는지 확인하는 과정입니다.

@prgmr99 prgmr99 force-pushed the feature/utils-workspace-yeom branch from 3514943 to b9f994e Compare August 30, 2025 12:26
@prgmr99 prgmr99 force-pushed the feature/utils-workspace-yeom branch from d92e91b to 5b2b242 Compare August 30, 2025 12:51
Comment thread vite.config.ts
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before

image

After

image

이제는 로직들만 검사를 하고 있어요..!

image

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

우와 exclude 추가해준거 너무너무 굿입니다!

// Vitest에게 setTimeout, setInterval 같은 타이머 함수들을
// 직접 제어할 수 있는 가짜(Fake) 함수로 대체하도록 지시합니다.
// 이렇게 하면 실제로 시간을 기다리지 않고 테스트할 수 있습니다.
vi.useFakeTimers();
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이게 vitest의 mocking 관련 함수군요, 학습을 해봐야겠네요 😯

Copy link
Copy Markdown
Member

@klmhyeonwoo klmhyeonwoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!
문득 아이디어가 생각이 났는데 만들어주신 유틸함수를 보다보니까 나중에 이런 함수도 있으면 많이 사용할 것 같다는 생각이 들었어요!

sleep(0).then(fn()) // 이번에 추가된 sleep util function

sleep(`promise 함수`).then(fn()) // 타이머 숫자가 아닌 다른 서버 통신 등의 비동기 promise 함수가 끝날 때까지 자동으로 감지해준 후, fn()을 실행해주는 함수

@prgmr99
Copy link
Copy Markdown
Member Author

prgmr99 commented Aug 31, 2025

고생하셨습니다! 문득 아이디어가 생각이 났는데 만들어주신 유틸함수를 보다보니까 나중에 이런 함수도 있으면 많이 사용할 것 같다는 생각이 들었어요!

sleep(0).then(fn()) // 이번에 추가된 sleep util function

sleep(`promise 함수`).then(fn()) // 타이머 숫자가 아닌 다른 서버 통신 등의 비동기 promise 함수가 끝날 때까지 자동으로 감지해준 후, fn()을 실행해주는 함수

좋은 아이디어 공유해주셔서 감사합니다! sleep 함수에 대한 리뷰를 보고 저도 더 깊게 생각해볼 수 있었어요..!

제안해주신 sleep('promise 함수').then(fn()) 코드를 보니까,
'어떤 비동기 작업이 끝날 때까지 기다렸다가, 그 다음에 다른 작업을 실행하고 싶다'는 의도를 명확하게 이해했습니다.
정말 필요한 기능이라고 생각을 했어요!!

곰곰히 생각을 하다보니, 말씀해주신 기능은 async/await문법과 굉장히 유사하다는 생각을 했어요!

// 제안해주신 방법
sleep(어떤_Promise_함수()).then(fn);

// async/await 문법
await 어떤_Promise_함수();
fn();

그래서 sleep은 지금처럼 시간 기반의 지연만 담당하게 하고,
'Promise 함수'를 기다리는 작업은 await를 사용하는 것이 각자의 역할을 명확하게 분리할 수 있어서 좋지 않을까 생각했습니다!

혹시 제가 놓치고 있는 부분이 있거나 다른 특별한 케이스를 생각하고 제안주신 거라면, 언제든 편하게 알려주세요!

@prgmr99 prgmr99 merged commit 914075f into main Aug 31, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

commonUtil > sleep()

2 participants