어떠한 프로그램에서 제공하는 기능을 사용자가 이용할 수 있게 만들어 둔 인터페이스
API는 A프로그램에서 B프로그램의 기능을 활용할 수 있도록 중간에서 그 과정을 도와주는 중간 매개체
[API 간략 설명]
↑
- 식당의 메뉴판 = API 명세서(사용할 수 있는 기능,방법 등이 기술)
- 메뉴를 주문 = API 요청(request) => [요청자 = Client]
- 주문을 받고, 요리사에게 전달하는 직원 = API
- 주문에 따라 돌려받게 되는 음식 = 응답(response)
API와 같이 다른 서버와 통신을 할 때는 특정한 규칙에 맞춰 그 통신이 이루어져야 함
HTTP = 현재 웹에서 통신을 진행할 때 가장 흔하게 사용됨
HTTP(Hyper Text Transfer Protocol) = 서로 다른 서버 간 문자 형식으로 데이터를 주고받을 때 지켜야 하는 규약
HTTP 통신의 단계
HTTP에서 요청을 보낼 때는 대상 서버로 HTTP 메세지를 보내고 요청 헤더(Request header)와 요청 바디(Request body)가 그 안에 담겨짐
↑ ↑ ↑Request message
- 이미지 가장 윗줄의
GET /data/2.5/weather? HTTP/1.1
에 해당하는 부분은 start-line이라 부름- 사용자가 사용한 HTTP Method, 요청 URI, HTTP의 버전을 담고 있음
[Request Header]
- 그 아래의 Host부터가 요청 헤더에 속함
- Request header에는 요청을 받는 서버의 이름, 서버의 Version, 전달하는 컨텐츠의 Type, 요청 날짜, 요청을 보낸 컴퓨터의 정보 등 수많은 내용이 담겨짐
- 그리고 Request header의 내용이 모두 종료되면 하나의 빈 줄로 Request body와 구분해 줌
[Request Body]
- 사용자가 서버로 혹은 다른 사용자가 우리의 서버로 전달하고자 하는 컨텐츠를 담게 됨
- 이 때, 어떠한 메서드를 통한 요청인지에 따라 Request body를 담을 수 있는지, 없는지가 결정 됨
Response message
HTTP/1.1 200 OK
에 해당하는 부분은 status-line이라고 부릅니다. HTTP 버전과 상태 코드(Status code), 응답 메세지를 담고 있음
[Response header]
- 그 아래 두번째 줄부터 Response header에 속함
- Response header도 마찬가지로 응답 날짜, 응답을 전달한 서버의 이름, 서버의 Version, 컨텐츠의 Type 등을 담고 있음
- Response header의 내용이 모두 종료되면 하나의 빈 줄로 Response body와 구분해 줌
[Response body]
- Response body에는 실제로 응답 리소스 데이터가 담겨져 있음
HTTP는 요청마다 메소드를 사용하며, 각각의 메소드는 그 역할이 다름
↑
↑
동기, 비동기 예시
↑
- 위 코드를 실행하면 "1", "3" 이 먼저 출력되고 2초 후에 "3" 이 출력됨
(setTimeout을 건너띄고 "3" 이 먼저 출력된 것)
*이는 [call stack] 과 [callback queue] 영역의 차이점 때문에 발생
Javascript는 동기적으로 동작
- 자바스크립트는 [싱글 스레드] 이기 때문에 한 번에 하나의 동작만 수행 (동기적 동작)
- 자바스크립트의 [비동기 처리]
-특정 코드의 연산이 끝날 때까지 코드의 실행을 멈추지 않고 그 다음 코드를 먼저 실행하는 자바스크립트의 특성
-이런 식으로 실행 결과를 기다려주지 않는 비동기 처리의 문제로 결과값을 받기 전 다음 코드가 실행되는 문제가 발생
*해결책 = [Callback함수, Promise 등 활용]
↑
1. Javascript 에서 기본적인 함수들은 모두 [call stack] 에 쌓이게 됨
2. 비동기 함수(Web APIs 포함)는 모두 [callback queue] 에 쌓이게 됨
3. [call stack]에 쌓인 함수들이 담긴 순서의 역순으로 우선 처리됨
4. 모든 함수가 처리되고 [call stack]이 비워지면 [callback queue]에 존재하던 비동기 함수들이 모두 [call stack] 으로 이동해서 하나씩 처리됨
Call stack, Callback queue 예시
↑
- 위의 코드를 실행 시,
setTimeout
은 비동기 함수이기에 따로 시간을 지정하지 않아도 [callback queue] 영역으로 이동- [call stack]에 담긴 함수가 fun3( ),fun2( ),fun1( ) 순으로 처리된 이후,
setTimeout
함수가 [call stack] 으로 옮겨져 마지막으로 실행됨
비동기 작업을 수행하기 위해 callback함수를 사용하기 시작했으나, 함수가 중첩될 수록 가독성이 떨어지게 되는 callback 지옥
이 발생
↓
* 이 문제에 대한 대체방안으로 나온 것이 Promise
newPromise( )
라는 Promise 생성자를 이용해서 생성할 수 있으며, 그 상태에 따라 위의 3가지 경우(pending, fulfilled, rejected) 중 하나로 나타남
Promise ( )
는 매개변수로 Callback 함수를 받음 (익명함수도 가능)resolve
, reject
두 개의 함수를 받음+a) resolve, reject
- resolve( ), reject( ) 호출
-resolve(value)
— 일이 성공적으로 끝난 경우 그 결과를 나타내는 value와 함께 호출
-reject(error)
— 에러 발생 시 에러 객체를 나타내는 error와 함께 호출
*결과로 나타나는 value, error 는 이후.then( )
,.catch( )
의 인자로 사용됨
setTimeout
내에 resolver( ) 를 호출함resolver
, 실패하면 reject
호출resolver
, reject
중 어느 하나도 호출하지 않을 시 Promise 객체 내의 상태는 pending 상태가 됨setTimeout
이 resolver
를 호출하기 전에 Promise 객체를 돌려받기에 그 상태는 Pending 상태가 됨ex. promise 객체로 돌려받는 응답의 상태
-console.log(communicationResult)
를 입력하면 promise 객체를 반환 받음
-fetch( )
로 한 요청의 응답 결과를 아직 받지 못한 상태이기에 이 결과가 promise 객체로 반환됨
-코드 실행보다 통신의 응답을 받는 것이 느리기 때문에 이런 문제가 발생
* 이 때then( )
,catch( )
를 이용해서 결과를 바로 받을 수 있음
.then( )
을 붙여서 사용하면 응답의 결과를 바로 받을 수 있음.then( )
사용가능then( )
은 그 매개변수로 함수를 받을 수 있고, 해당 함수의 매개변수로 응답에 대한 결과 (res), 즉 반환되는 데이터를 받을 수 있음 then( )
을 이용해 요청에 대한 응답 결과를 바로 받고, 이를 then( )
내부 함수의 인자로 받아와서 활용
catch( )
를 이용해서 그 분기를 나눠줄 수 있음.then( )
뒤에 붙여서 사용가능, catch( )
또한 매개변수로 함수를 받을 수 있으며 해당 함수의 매개변수로 에러의 내용을 받을 수 있음 구조화 되어 있는 배열, 객체 같은 데이터를 destructuring(분해)시켜, 각각의 변수에 재할당하는 것
+a) 객체 구조분해할당 시 변수명 따로 지정하기
...
을 붙여서 사용 가능 spread 연산자를 활용해서 배열, 객체의 복사 가능 (얕은복사)
[BUT] 객체의 경우, 객체 내의 객체는 복사가 되지 않고 그 값이 변경될 경우 복사본에도 똑같이 적용됨
JSON.stringify( )
, JSON.parse
를 사용해서 얕은 복사의 문제점 해결 가능
JSON.stringify( )
=> ( ) 안의 값을 JSON 데이터 포맷으로 변환
JSON.parse( )
=> ( ) 안의 값을 기존의 데이터 형태로 다시 변환
...rest
로 사용 가능하며 꼭 rest 로 작성할 필요는 없음 (매개변수처럼 이름 지정 가능)
...rest
를 넣어주면, 매개변수가 몇 개가 되는지 모를경우 rest로 그 매개변수를 다 담을 수 있음