Fetch API & CORS
Fetch API
네트워크 통신을 포함한 리소스 취득을 위한 인터페이스
HTTP Request, Response, Headers를 추상화하는 인터페이스와, 비동기적 리소스 요청을 시작하기 위한 fetch() 메서드
모든 API가 Promise에 기반함.typescript
ReadableStream
Readable streams는 어떠한 data가 소비되는 것에 대한 추상화
Unit8Array
Uint8Array
형식화 배열(TypedArray)은 플랫폼의 바이트 순서를 따르는 8비트 부호 없는 정수의 배열
Text Decoder
이진 데이터가 문자열이라면 어떨지 생각해봅시다. 예를 들어 텍스트 데이터가 있는 파일을 받았다고 가정하겠습니다.
내장 객체, TextDecoder는 주어진 버퍼와 인코딩으로 값을 실제 자바스크립트 문자열로 읽을 수 있게 해줍니다.
Uint8Array
타입은 나중에 자세히 다룰 예정이다. 간단하게만 짚고 넘어가면 ArrayBuffer
객체의 일종으로 원시(raw
) 이진 데이터에 액세스하기 위한 메커니즘을 제공해 배열 최적화를 수행하는데 기여한다.
await reader.read()
의 호출 결과는 두개의 프로퍼티를 가지고 있는 객체를 반환하는데, 각각의 프로퍼티는 위 코드에서 쓰이고 있는 것과 같다.
done
: 읽기가 끝난 경우true
, 아니면false
value
: 바이트를 나타내는 형식화 배열(Uint8Array
)
ReadableStream
객체는Stream API
에 명시되어 있는데, 해당API
는 명세에 따르면 비동기 반복자가 가능하다. 따라서 무한 반복문 말고for await ... of
반복문을 사용할 수 있다. 그렇지만 이는 아직 모든 브라우저에서 지원되지 않기에 보통while
을 이용한 무한 루프를 사용한다.
Fetch ReadableStream Step
fetch
메서드를 호출하고 응답을 받는다. 그리고response.body.getReader()
를 호출해서Stream API
를 처리할 수 있는reader
객체를 생성한다.데이터를 읽기에 앞서
Content-Length
헤더를 통해 응답 전체의 크기를 미리 구한다. 이는CORS
이슈로 접근이 불가할 수도 있는데 보통의 경우 문제없이 크기를 구할 수 있다.데이터를
await reader.read()
를 통해 순차적으로 읽는다. 응답 청크를chunks
배열에 차례대로 삽입한다. 일단 응답을 한 번 소비하고 나면response.json()
과 같은 다른 메서드를 사용할 수 없기 때문에 해당 배열을 가지고 원하는 응답 본문에 접근할 것이다.모든 데이터를 읽으면 그 값을 가지고 있는
chunks
배열이 만들어진다. 이 배열을 다시Uint8Array
형식화 배열로 변환한다. 우리가 필요한 것은 단일화 된 데이터 형태인데, 안타깝게도chunks
배열을 단번에Uint8Array
로 변환하기 위한 단일 메서드는 없다. 따라서 반복문을 통해 순회하며 변환작업을 수행하자.chunksAll
변수에는 변환이 완료된 결과가 들어있다. 이는 아직 문자열이 아닌 바이트 배열이기 때문에 이를 다시 문자열로 변환해주어야 한다. 이는TextDecoder
를 통해 수행할 수 있다.최종적으로
TextDecoder
를 통해 변환된 결과를 다시JSON.parse()
메서드를 통해JSON
으로 변환하면 원하는 응답 본문에commits
에 접근할 수 있다.
Unicode
유니코드(Unicode)는 전 세계의 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식
Promise
Promise
객체는 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타냅니다.
대기(pending): 이행하지도, 거부하지도 않은 초기 상태.
이행(fulfilled): 연산이 성공적으로 완료됨.
거부(rejected): 연산이 실패함.
then
Promise를 리턴하고 두개의 콜백 함수를 인수로 받았을 때, 이행 or 거부를 위한 콜백함수
async & await
funciton 앞에 async를 붙이면, 함수는 항상 Promise를 반환
awiat 키워드를 만나면, Promise가 처리될때까지 기다림
await
는promise.then
보다 좀 더 세련되게 프라미스의result
값을 얻을 수 있도록 해주는 문법입니다.promise.then
보다 가독성 좋고 쓰기도 쉽습니다.
에러핸들링은 try, catch를 이용하여 할 수 있다.
try...catch가 없을 경우, Promise는 거부상태가 됨
CORS(CrossOrigin)
웹 브라우저는 Same Origin Policy에 따라 웹 페이지와 리소스를 요청한 곳(여기서는 REST API 서버)이 서로 다른 출처(포트까지 포함)일 때 서버에서 얻은 결과를 사용할 수 없게 막는다.
출처는 Protocol
과 Host
, 그리고 위 그림에는 나와있지 않지만 :80
, :443
과 같은 포트 번호까지 모두 합친 것을 의미한다.
포트 번호까지 모두 일치해야 같은 출처라고 인정된다.
SOP(Same-Origin Policy)
“같은 출처에서만 리소스를 공유할 수 있다”라는 규칙
리소스 요청은 출처가 다르더라도 허용하기로 했는데, 그 중 하나가 “CORS 정책을 지킨 리소스 요청”
출처를 비교하는 로직은 서버에 구현된 스펙이 아니라 브라우저에 구현되어 있는 스펙이다.
서버에 요청하고 응답을 받아오는 것까지는 이미 진행이 다 된 상황이란 점에 주의!
REST API 서버에서 Headers에 “Access-Control-Allow-Origin” 속성을 추가하면 된다.
Express에선 그냥 CORS 미들웨어를 설치해서 사용하면 됨.
패키지 설치
CORS 미들웨어 사용
일정상 작업하고 백엔드 API가 안나왔을 때, Express를 이용하여, 작업할 수 있다.
Last updated