웹 - World Wide Web의 줄임말로 가상의 연결망 세계이다.
URL
Uniform Resource Locator, 웹에 존재하는 특정 데이터를 나타내는 문자열
.
(이론적으로 더 완벽한 도메인 네임 😆ㅋㅋ)HTTPS - Hyper Text Transfer Protocol Secure
[헤드][바디]로 이루어져있다.
메소드: equest에 header에 담겨져있다.
GET
- 데이터 조회
POST
- 데이터 추가. body에 데이터 담아서 보내야한다.
PUT
- 데이터 수정. body에 데이터를 담아서 보낸다.
DELETE
- 데이터 삭제
path 정보 - 웹브라우저가 무슨 데이터를 원하는 지 알 수 있다.
user-agent
: request를 보낸 브라우저와 그것이 설치된 운영체제에 대한 정보가 담겨져있다.
Callback : 어떤 조건이 만족되었을 때 실행되는 함수
.then
: promise 객체가 pending 상태에서 fulfilled 상태가 될 때 Callback을 등록해주는 메소드. fetch함수가 리턴하는 Promise 객체의 메소드이다.
fetch('https://www.google.com')
.then((response) => response.text()) // 1
.then((result) => { console.log(result); }); // 2
// 1.response객체가 넘어오고 response객체의 text메소드를 호출해
// 그 리턴값(promise객체)를 result라는 이름의 파라미터로 넘겨준다.
// 2. 받은 result 라는 이름의 promise 객체를 출력하는 함수
(response) => response.text()
는 response가 있어야만 실행되는 callback이다.then
메소드로 response가 왔을 때 실행할 콜백을 등록할 수 있다.then
메소드로 등록한 순서대로 실행되고, 이전 콜백의 리턴값을 이후 콜백이 넘겨받아서 사용할 수 있다.fetch('https://learn.codeit.kr/api/members',{
//옵션객체
method: 'POST', //PUT, DELETE는 옵션객체에 적어서 보내야한다. 안적으면 기본 GET
body: JSON.stringify(newMember), // js객체를 string타입의 JSON객체로 변환
})
.then((response) => response.text()) // 1
.then((result) => { console.log(result); }); // 2
REST architecture : 웹이 갖추어야 할 이상적인 아키텍처(구조)
JSON 데이터 다루기
Javascript Object Notation의 줄임말로, 자바스크립트의 Object Literal 문법 및 배열 표현법 등과 일정 부분 호환되는 데이터포맷
JSON.parse
: 역직렬화JSON.stringify
: 직렬화json
메소드각 코드에 대응하는 상태 메시지를 가지고 있다
현재 request 또는 response의 바디에 들어있는 데이터가 어떤 타입인지 나타낸다. main type/sub type
형식이다.
text/html
: html 데이터image/jpeg
: jpeg, jpg 이미지 데이터audio/mpeg
: mp3, mpeg 오디오 데이터application/json
: json 데이터application/octet-stream
: 확인되지 않은 바이너리 파일 (텍스트 파일 이외의 파일을 binary file이라고 함. 즉 특정 확장자(mp4 등)에 해당하지 않는 바이너리 파일)application/x-www-form-urlencoded
id=6&name=Jason&age=34&department=engineering
이런 식으로 “이름=값” 프로퍼티를 “&”으로 연결된 데이터타입이다.multipart/form-data
: 여러 종류의 데이터를 하나로 합친 데이터 ex) 텍스트 + 이미지 + 동영상 데이터웹브라우저가 현재 페이지를 그대로 유지한 채로 서버에 리퀘스트를 보내는 response를 받아서 새로운 페이지를 로드하지 않고도 변화를 줄 수 있게 해주는 기술
컴퓨터끼리 통신하는 프로토콜에는 HTTP, HTTPS 이외에도, FTP, SSH, TCP, UDP, IP, Ethernet 등 정말 다양한 종류의 프로토콜이 있다.
비동기 실행에서는 코드가 꼭 등장하는 순서대로 실행되는 것이 아니다.
console.log('Start!');
fetch('https://www.google.com')
.then((response) => response.text()) // 콜백 1
.then((result) => { console.log(result); }); // 콜백 2
console.log('End');
fetch 함수가 리퀘스트를 보내고, 서버의 리스폰스를 받게 되면 콜백들이 순서대로 실행
console.log('Start');
console.log('End');
then
메소드로 등록해뒀던 콜백 실행비동기 실행 함수들
작업에 관한 상태정보를 가지고 있는 객체
fetch함수는 Promise 객체를 리턴한다. 이때 promise객체는 pending 상태
then
메소드로 작업이 성공하여 promise객체가 pending → fulfilled가 되면 실행할 콜백을 등록할 수 있다.프로미스 객체에 then 메소드를 연속적으로 작성하는 것.
then
메소드는 새로운 프로미스 객체를 리턴한다.
① 의 경우 then 메소드가 return한 promise 객체는 callback이 return한 promise 객체와 동일한 상태와 결과를 가진다
② 의 경우 then 메소드가 return한 promise 객체는 fulfilled 상태와 작업 성공 정보를 가진다.
③ 의 경우는 ① 경우와 똑같이 then 메소드가 리턴했던 Promise 객체는 fulfilled 상태가 되고, 그 작업 성공 결과로 undefined를 가진다.
④ then 메소드가 리턴한 Promise 객체는 rejected 상태가 되고, 그 작업 실패 정보로 해당 Error 객체를 갖게 된다
⑤의 경우 then 메소드가 리턴하는 promise 객체는 이전 promise 객체와 동일한 상태와 결과를 가진다.
잠깐! text 메소드, json 메소드는 promise 객체를 반환한다.
promise chaining이 필요한 경우
catch
메소드
then(undefiend, 콜백)
fetch("https://jsonplaceholder.typicode.commmmm/users")
.then((response) => response.text()) //①
.then((result) => {
console.log(result);
throw new Error('test'); // ②
})
.catch((error) => {console.log(error);});
//결과 - TypeError: Failed to fetch
유효하지 않은 url로 request를 보냈을 때 fetch가 return 한 promise는 rejected 상태와 error라는 작업 실패 정보를 가진다. ①의 callback은 실행되지 않고 then이 return한 promise는 fetch가 return 한 promise 와 똑같은 상태와 작업정보를 가진다. 즉 ①의 then의 promise는 rejected 상태와 error라는 작업 실패 정보를 가진다.
②의 callback은 실행되지 않고 ②의 then의 promise는 직전 promise와 동일하게 rejected 상태와 error라는 작업 실패 정보를 가진다.
따라서 catch문은 rejected 상태와 error라는 작업 실패 정보를 출력하는 것이다!
finally
메소드
callback hell에서 빠져나오기 위해 promise 객체가 생겼다.
const p = Promise((resolve, reject) => {
setTimeout(() => { resolve('success');}, 2000);
})
p.catch((error) => {console.log(error); });
const p = Promise.resolve('success')
.then(//어쩌고~)
const p = Promise.reject(new Error('fail'));
all
메소드 - all([p1, p2, p3 ...])
race
메소드 - .race([p1, p2, p3 ... ])
allSettled
메소드
any
기존의 Promise 객체를 사용하는 코드(Promise Chaining)를
(1) 개발자가 더 편하게 작성할 수 있도록 하고
(2) 코드의 가독성을 높이기 위해서
도입된 일종의 Syntactic sugar(기존 문법을 더 편하게 사용할 수 있도록 하는 문법적 장치)이다.
async
async function fetchAndPring(){
return 3 // promise 객체가 반환됨
}
await
try…catch…finally 문을 사용해서 rejected가 되었을 경우 catch로 캐치하거나 상태에 상관없이 finally로 항상 실행
어떤 값을 리턴하는 경우
async 함수 안에서
① Promise 객체를 리턴하는 경우, 동일한 상태와 작업 결과를 가진 Promise 객체를 리턴한다.
② Promise 객체 이외의 값을 리턴하는 경우, fulfilled 상태이면서, 리턴된 값을 작업 성공 결과로 가진 Promise 객체를 리턴
아무것도 리턴하지 않는 경우, fulfilled 상태, undefined를 작업 성공 결과로 가진 Promise 객체를 리턴
async 함수 내부에서 에러가 발생했을 때, rejected 상태, 해당 에러 객체를 작업 실패 정보로 가진 Promise 객체가 리턴
async 함수는 promise 객체를 반환하기 때문에 await을 붙여 async 함수 안의 async 함수 … 를 사용 가능하다!
💡 자바스크립트에서 함수를 표현하는 방법에는 여러 가지가 있는데요.등이 있습니다. 그리고
Function Expression의 경우에는
2-1. 함수에 이름이 붙어있는 Named Function Expression과
2-2. 함수에 이름이 없는 Anonymous Function Expression으로 나눌 수 있고,
Arrow Function의 경우 함수 내부의 내용에 따라 더 축약(shorten)해서 나타낼 수도 있습니다.
async 함수를 작성할 때 생각해야하는 성능 문제
async function fetchUrls(urls){
for(const url of urls){
(async () => { // 추가된 부분!
const response = await fetch(url);
console.log(await response.text());
})(); // 추가된 부분!
}
}
여기서 추가된 async가 없다면 urls에서 이전 url에 대해 await문이 붙은 promise 객체가 fulfilled 상태가 될 때까지는 그 다음 url에 대한 작업이 시작될 수 X왜냐하면 하나가 다른 하나를 완벽히 대체하지는 못하기 때문이다!
자바스크립트의 각 문법별 브라우저 지원 현황을 이런 사이트에서 조사한 후 개발 할 것!
자바스크립트에서 콜백은 어떤 함수의 파라미터로 전달되는 모든 함수를 의미한다. 따라서 어떤 함수의 파라미터로 전달되기만 하면 콜백인 것!
1. 동기 실행되는 콜백, 2. 비동기 실행되는 콜백 이 있다.
지금까지는 2번의 비동기 실행되는 콜백의 관점에서만 봤다.
1번의 콜백에는 filter 메소드
가 있다. 즉 동기 실행되는 콜백이 있다는 점에서 유의해야함!!!!
Q. 동기 실행, 비동기 실행 이런 것들은 자바스크립트 실행 환경에서 실제로 어떻게 구현되고 있는가?