AJAX(Asynchronous JavaScript And XML)은 비동기식 자바스크립트와 XML의 약자이다.
이름과 달리, JSON, XML, HTML 등 다양한 포맷을 주고 받을 수 있다.
특히 이 중 JSON을 많이 사용한다!
JSON을 더 많이 쓰는 이유?
- JSON이 XML보다 용량이 가볍다.
- JSON은 JavaScript의 일부
데이터를 받아오기 위한 객체
서버와 상호작용하기 위해 사용한다. 주로 AJAX 프로그래밍에 사용한다.
생성자 : XMLHttpRequest()
XMLHttpRequest 대신에 promise-style(Axios)을 많이 사용한다.
XML 사용 예제는 아래 비동기에 있는 코드를 확인한다.
하나가 끝나야 다음 것을 한다.
자바스크립트는 싱글 쓰레드 : Call Stack이 하나!
스레드(thread)
프로그램이 작업을 완료하기 위해 사용할 수 있는 단일 프로세스
OS에서 배운다.
각 스레드는 한 번에 하나의 작업만 수행
다음 작업을 시작하려면 앞의 작업이 완료되어야 함.
병렬적으로 수행한다.
요청을 보낸 후 응답을 기다리지 않고 다음 동작이 이루어짐(non-blocking)
사용자 경험 : 데이터를 불러오는 동안 지속적으로 응답하는 화면을 보여줌, 많은 웹 API 기능은 비동기 코드를 사용하여 실행
const request = new XMLHttpRequest() // 브라우저 창 열기
const URL = 'http://jsonplaceholder.typicode.com/todos/1'
request.open('GET', URL) // URL을 주소창에 넣기
reqeust.send() // enter
const todo = request.response
console.log(todo)
JSON.parse(todo) // string을 Json으로 파싱!
한꺼번에 실행하면 응답이 없다.
request.send()만 비동기식이라 send()의 응답이 끝나길 기다려주지 않고 response를 가져오니 아무것도 존재하지 않는다.
Event loop를 기반으로 하는 동시성 모델(Concurrency model)
JavaScript 엔진이 아닌 브라우저 영역에서 제공하는 API
Web API는 다중 쓰레드이다.
콜백함수는 다른 함수에 인자로 전달된 함수이다.
콜백함수는 자바스크립트 파이썬 장고 등등 여러 군데에서 사용된다!
비동기 작업이 완료된 후 코드 실행을 계속하는 데 사용되는 경우를 비동기 콜백(asynchronous callback)이라고 함.
비동기 작업의 최종 완료 또는 실패를 나타내는 객체, 객체가 Promise 객체
Chaining : 코드가 깔끔해진다. - 메서드 체인으로 나타내는 방법!!
비동기의 엄격한 순서를 보장해준다.
반환 값이 반드시 있어야 한다.
.then()
.catch()
.finally()
브라우저를 위한 Promise 기반의 클라이언트
Axios 공식 문서 : 공식문서에서 javascript CDN을 불러와 사용한다.
XMLHttpRequest 대신 사용한다.
훨씬 편리한 AJAX 요청이 가능하도록 도움을 준다.
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
const API_URI = 'https://dog.ceo/api/breeds/image/random'
const img_path = document.querySelector('img')
function getDog() {
// axios를 사용하여 API_URI로 GET 요청을 보낸다.
axios.get(API_URI)
// .then 메서드를 통해 요청이 성공적인 경우의 콜백함수를 정의한다.
// 응답객체의 데이터에서 이미지에 대한 리소스를 img 요소의 src 속성으로 할당한다.
.then(res => img_path.setAttribute('src', res.data.message))
.catch(error => console.log(error)) // error를 처리한다.
}
const button = document.querySelector('button')
button.addEventListener('click', getDog)
</script>
async await
문법을 편하게 쓰게 해준다.
async await는 promise에서 성능이 달라지는게 아니라 동기 표현처럼 좀 더 다듬는 느낌
promise 구조의 then chaining 제거하고 좀 더 파이썬같은 코드를 나타낸다.
나타내는 방법
함수로 묶어야 한다.
해당 함수 앞에 async 키워드로 표시를 남긴다.
블록 내부에 비동기로 동작하는 함수들을 찾아서 앞에 await을 남긴다.