1. 메인 작업이 모두 수행되어야 마지막 작업이 수행됨
print('첫번째 작업')
for i in range(10):
print('메인 작업')
print('마지막 작업') // 위의 반복문이 종료된 후에 실행됨
2. 함수의 작업이 완료될 때까지 기다렸다가 값을 반환해야 계속 진행할 수 있음 (동기 함수)
const makeGreeting = function (name) {
return 'Hello, my name is %{name}!'
}
const name = 'Alice'
const greeing = makeGreeting(name)
console.log(greeting) // 'Hello, my name is Alice!'
const slowRequest = function(callBack){
console.log('1. 오래 걸리는 작업 시작 ...')
setTimeout(function () {
callBack()
}, 3000)
}
const myCallBack = function () {
console.log('2. 콜백함수 실행됨')
}
slowRequest(myCallBAck)
console.log('3. 다른 작업 실행')
Single Thread 언어, JavaScrpt
Thread 란?
- 작업을 처리할 때 실제로 작업을 수행하는 주체로, multi-thread라면 업무를 수행할 수 있는 주체가 여러 개라는 의미
브라우저에서
제공하는 runtime 환경(JavaScript 엔진은 하나밖에 처리 못하니까)
- 모든 작업은
Call Stack
(LIFO)으로 들어간 후 처리된다.- 오래 걸리는 작업이 Call Stack으로 들어오면
Web API
로 보내 별도로 처리하도록 한다.- Web API에서 처리가 끝난 작업들은 곧바로 Call Stack으로 들어가지 못하고
Task Queue
(FIFO)에 순서대로 들어간다.Event Loop
(감시자 역할)가 Call Stack이 비어있는 것을 계속 체크하고 Call Stack이 빈다면 Tasck Queue에서 가장 오래된 (가장 먼저 처리되어 들어온)작업을 Call Stack으로 보낸다.
- 런타임 = 브라우저의 환경
console.log('Hi') => Call Stack에 conlole.log('Hi') 들어간다 -> 호출되면서 빠진다 -> 그러면서 Output에 'Hi' 출력되면서 Call Stack 비게 되고 -> setTimeout() Call stack에 들어감 -> 3초 기다려야해서 Web API로 넘어가게 됨(처리중) -> 빠지자 마자 console.log('Bye')가 Call Stack에 들어감 -> console.log('Bye')가 빠지면서, output 'Bye' 출력 -> 스택이 비고 3초가 다 경과했으면 콜스택으로 돌아가는 것이 아니라 Task Queue(대기실)로 일처리가 끝난 순서로 들어간다. Event Loop이 계속 감시하고 있음( Call stack이 비었는지 확인 ) -> myFunc() 를 콜스택에 넣고 console.log'Work' 호출되서 빠지면서 'Work'출력됨 -> myfunc()까지 사라지면 완료!
정리
- JavaScript는 한 번에 하나의 작업을 수행하는 Single Thread 언어로 동기적 처리를 진행
- 하지만 브라우저 환경에서는 Web API에서 처리된 작업이 지속적으로 Task Queue를 거쳐 Event Loop에 의해 Call Stack에 들어와 순차적으로 실행됨으로써 비동기 작업이 가능한 환경이 됨
(줄여서 XHR 객체라고 함)
이벤트 핸들러는 비동기 프로그래밍의 한 형태
- 이벤트가 발생할 때마다 호출되는 함수(콜백 함수)를 제공하는 것
- XMLHttpRequest(XHR)는 JavaScript를 사용하여 서버에 HTTP 요청을 할 수 있는 객체
- HTTP 요청은 응답이 올 때까지의 시간이 걸릴 수 있는 작업이라 비동기 API이며, 이벤트 핸들러를 XHR 객체에 연결해 요청의 진행 상태 및 최종 완료에 대한 응답을 받음
<script src=""https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
'성공하면 수행할 로직'
을 작성'실패하면 수행할 로직'
을 작성axios({
method: 'post',
url: '/user/12345/',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
})
.then(요청에 성공하면 수행할 콜백함수)
.catch(요청에 실패하면 수행할 콜백함수)
<script>
const URL = 'https://api.thecatapi.com/v1/images/search/'
axios ({
method: 'get',
url: URL,
})
.then((response) => {
console.log(response)
console.log(response.data)
})
.catch((error) => {
console.log(error)
console.log('실패했다옹')
})
console.log('야옹야옹')
</script>
요청 후 cat api로부터 응답을 기다려야 하는 작업은 비동기로 처리하기 때문에 '야옹야옹' 출력 이후 응답 데이터가 출력되는 것을 확인 할 수 있음 |
---|
버튼작성하고 axios 동작을 콜백 함수로 작성 및 이벤트 핸들러 부착 |
---|
응답 데이터에서 필요한 이미지 주소 값 찾기 |
---|
찾은 이미지 주소를 활용해 THML img 태그 구성하기 |
---|
결과 확인 |
---|
정리
- axios는 브라우저에서 비동기로 데이터 통신을 가능하게 하는 라이브러리 : 브라우저를 위해 XMLHttpRequest 생성
- 같은 방식으로 DRF 로 만든 API 서버로 요청을 보내서 데이터를 받아온 후 처리할 수 있도록 함
비동기 처리의 단점
- 비동기 처리의 핵심은 Web API로 들어오는 순서가 아니라
작업이 완료되는 순서에 따라 처리
한다는 것- 그런데 이는 개발자 입장에서 코드의 실행 순서가 불명확하다는 단점 존재
- 이와 같은 단점은 실행 결과를 예상하면서 코드를 작성할 수 없게 함
=> 콜백 함수를 사용하자!!
순차적으로 동작
할 수 있게 함콜백 함수 정리
- 콜백 함수는 비동기 작업을 순차적으로 실행할 수 있게 하는 반드시 필요한 로직
- 비동기 코드를 작성하다 보면 콜백 함수로 인한 콜백 지옥은 빈번히 나타나는 문제이며 이는 코드의 가독성을 해치고 유지 보수가 어려워 짐
-> 지옥에 빠지지 않는 다른 표기 형태가 필요하다!
- 콜백 지옥 문제를 해결하기 위해 등장한 비동기 처리를 위한 객체
- "작업이 끝나면 실행 시켜줄게" 라는 약속(Promise)
- 비동기 작업의 완료 또는 실패를 나타내는 객체
- Promise 기반의 클라이언트가 바로 이전에 사용한 Axios 라이브러리
- 성공에 대한 약속then()
/ 실패에 대한 약속catch()
👀 then & catch
then(callback)
- 요청한 작업이 성공하면 callback 실행
- callback은 이전 작업의 성공 결과를 인자로 전달 받음
catch(callback)
- then()이 하나라도
실패하면
callback 실행- callback은 이전 작업의 실패 객체를 인자로 전달 받음
chaining
을 할 수 있음'순차적인'
처리 가능직관적이고 가독성 좋게
작성할 수 있도록 도움then 메서드 chaining의 장점
1. 가독성
- 비동기 작업의 순서와 의존 관계를 명확히 표현할 수 있어 코드의 가독성이 향상
2. 에러 처리
- 각각의 비동기 작업 단계에서 발생하는 에러를 분할에서 처리 가능
3. 유연성
- 각 단계마다 필요한 데이터를 가공하거나 다른 비동기 작업을 수행할 수 있어서 더 복잡한 비동기 흐름을 구성할 수 있음
4. 코드 관리
- 비동기 작업을 분리하여 구성하면 코드를 관리하기 용이