generated from muhandojeon/study-template
-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[백지연] 챕터 9: 비동기 프로그래밍 패턴 #72
The head ref may contain hidden characters: "\uCC55\uD1309/\uBC31\uC9C0\uC5F0"
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
# CHAPTER 09 비동기 프로그래밍 패턴 | ||
|
||
비동기 자바스크립트 프로그래밍은 다른 코드를 실행하는 동안 백그라운드에서 오래 걸리는 작업을 수행하게 해줌 | ||
`Promise`, `async/await` 개념은 메인 스레드를 차단하지 않으면서도 코드를 깔끔하고 읽기 쉽게 만들어줌 | ||
|
||
## 비동기 프로그래밍 | ||
|
||
동기 코드는 블로킹 방식으로 실행됨 = 한 번에 한 문장씩 코드가 순서대로 실행됨 | ||
**비동기 코드는 논블로킹 방식으로 실행됨** = 다른 작업을 기다리는 동안 백그라운드에서 비동기 코드 실행 | ||
|
||
코드의 나머지 부분을 차단하지 않고, 오래 실행되는 작업을 수행할 때 유용 | ||
ex. 네트워크 요청, 데이터베이스 읽기/쓰기, 입력/출력 작업 | ||
|
||
## 배경 | ||
|
||
### 콜백 함수 | ||
|
||
다른 함수에 인수로 전달되어, 비동기 작업이 완료된 후 실행됨 | ||
네트워크 요청, 사용자 입력 등 비동기 작업의 결과를 처리하기 위해 사용됨 | ||
콜백 지옥을 초래할 수 있다는 게 단점 | ||
|
||
## 프로미스 패턴 | ||
|
||
프로미스는 비동기 작업의 결과를 나타내는 객체 | ||
`pending`, `fulfilled`, `rejected` 상태를 가질 수 있음 | ||
|
||
`Promise` 생성자는 함수를 인수로 받고, 이 함수는 `resolve`와 `reject`를 인수로 전달받음 | ||
비동기 작업이 성공적으로 완료되었을 때 `resolve` 호출, 실패했을 때 `reject` 호출 | ||
|
||
```javascript | ||
return new Promise((resolve, reject)) => { | ||
fetch(url) | ||
.then(response => response.json()) | ||
.then(data => resolve(data)) | ||
.catch(error => reject(error)); | ||
}; | ||
``` | ||
|
||
- 프로미스 에러 처리 : `catch` 메서드 | ||
- 프로미스 병렬 처리 : `Promise.all` 메서드 | ||
- 프로미스 순차 실행 : `Promise.resolve` 메서드 | ||
- 프로미스 메모이제이션 : 캐시를 사용해 프로미스 함수 호출 결과 저장하고 중복 요청 방지 | ||
- 프로미스 데코레이터 : 고차 함수로 데코레이터를 생성해 프로미스에 추가 기능 부여 | ||
- 프로미스 경쟁 : `Promise.race` 메서드로 여러 프로미스를 동시에 실행하고 가장 먼저 완료되는 프로미스의 결과 반환 | ||
|
||
## async/await 패턴 | ||
|
||
비동기 코드를 마치 동기 코드처럼 작성할 수 있음 | ||
`await` 키워드는 `fetch` 호출이 완료될 때까지 함수 실행을 일시 중지함 | ||
|
||
- 비동기 반복 : [for-await-of](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for-await...of) 반복문을 사용해 반복 가능 객체를 순회 | ||
- 비동기 에러 처리 : `try-catch` 블록 | ||
- 비동기 병렬 : `Promise.all` 메서드 | ||
- 비동기 순차 실행 : `Promise.resolve` 메서드 | ||
- 비동기 메모이제이션 : 캐시를 사용해 비동기 함수 호출 결과 저장하고 중복 요청 방지 | ||
- async/await 데코레이터 : 고차 함수로 데코레이터를 생성해 비동기 함수에 추가 기능 제공 | ||
|
||
> 자바스크립트 데코레이터 | ||
> https://github.com/tc39/proposal-decorators | ||
> 현재는 표준이 아니기 때문에 바벨로 트랜스파일하거나 타입스크립트를 사용해야 합니다. | ||
|
||
> 바벨로 데코레이터 사용하기 | ||
> https://babeljs.io/docs/babel-plugin-proposal-decorators | ||
> https://www.youtube.com/watch?v=9SuuHi7qk24 | ||
> | ||
> ```json | ||
> // babel.config.json | ||
> { | ||
> "presents": ["@babel/preset-env"], | ||
> "plugins": [["@babel/plugin-proposal-decorators", { "version": "2023-11" }]] | ||
> } | ||
> ``` | ||
|
||
> 타입스크립트에서 데코레이터 사용하기 | ||
> https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#decorators | ||
> https://blog.logrocket.com/practical-guide-typescript-decorators | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👏 👏 👏 👏 👏 👏