- 자바스크립트의 타이머 함수는 콜백 함수를 호출하는가?
:
setTimeout
과 같은 타이머 함수는 콜백 함수를 호출하지 않음, 함수를 호출한다는 것은 태스크 큐에서 콜 스택으로 넘겨주는 것을 의미함
: 콜백 함수를 호출하는 과정은 브라우저의 이벤트 루프가 수행함
- 멀티 스레드는 무조건 좋은가?
: 멀티 스레드라면 각각의 콜 스택이 함수를 처리할 수는 있지만, 변수 등을 재할당할 때 처리 순서가 보장되지 않음
: 즉 멀티 스레드로 동작하면 코딩이 복잡해지고, 순서 문제가 발생할 수 있음
: 그러나 동시성의 확보를 포기할 수 없었기 때문에 자바스크립트는 싱글 스레드 방식으로 동작하되, 비동기를 처리하도록 한 것
- 타이머 함수의 경우 어떤 방식으로 비동기적인 처리가 진행되는가?
: 시간을 재는 일을 브라우저가 도와주어야 함
: 브라우저가 시간을 다 재면 tick 이벤트가 발생하고, 그제서야 태스크 큐로 콜백 함수를 넘겨주는 것
- 타이머 함수의 인수로 전달하는 지연 시간은 정확한가?
: 태스크 큐로 콜백 함수를 전달하는 시간이 또 따로 있기 때문에, 지연 시간을 1초로 설정해도 정확히 1초 후에 콜백 함수가 실행되지는 않음
- 블로킹의 관점에서 비동기는 무엇인가?
: 동기 처리에서 발생하는 블로킹을 해결하기 위한 방법
- 비동기 처리는 보편적으로 언제 사용하는가?
: 서버와 브라우저의 통신 과정에서 사용, 여기서의 통신은 클라이언트(브라우저가)가 서버에 리소스를 요청하고 서버를 통해 응답 받는 과정을 의미함
- REST란 무엇인가?
: 서버와 브라우저가 통신할 때 GET, POST, PUT, PATCH, DELETE와 같은 요청 메서드를 사용해서 리소스를 달라고 URL을 통해 요청하는 것을 HTTP라고 하는데, 여기서의 URL에 대한 약속이 바로 REST
- REST를 준수해야 하는 이유는 무엇인가?
: HTTP를 동일한 환경에서 사용하기 위해, 즉 컨벤션을 지키기 위해 REST를 준수해야 함
- 서버와의 통신은 무엇을 토대로 이루어지는가?
:
Promise
,fetch
등 어떤 방식을 사용해서 비동기를 처리하든 그 근본은XMLHttpRequest
객체
: 현재는JSON
데이터 포맷을 사용하여 통신을 하지만, 예전에는 통신 시XML
을 사용했기 때문에 이름이XMLHttpRequest
XMLHttpRequest
의send
메서드가 필요한 이유는 무엇인가?: HTTP 요청 시 페이로드, 즉 데이터를 전달하기 위해
- HTTP 요청 메서드 중 GET의 특징은 무엇인가?
: 무엇을 조회할지 알려주어야 함
: GET 메서드는 페이로드를 전달해도 무시됨
- HTTP 요청의 성공 여부를 어떻게 판단할 수 있는가?
:
XMLHttpRequest
생성자 함수로 생성한 객체에 이벤트 핸들러를 등록하여load
이벤트나readyStateChange
이벤트를 캐치하면, 객체의status
프로퍼티에 상태 코드가 할당되고 이 코드를 통해 판단할 수 있음
: 조건식을 통해 HTTP 요청의 성공 여부에 따라 각각 성공 처리, 실패 처리할 로직을 구현하면 됨
- 콜백 헬이란 무엇인가?
: HTTP 요청 시 전달하는 콜백 안에서 또 HTTP 요청을 하는 경우 그 안에 또 콜백이 중첩되는 현상이 많이 발생하는 것
- 기존 비동기 함수의 콜백 패턴이 가지는 문제점은 무엇인가?
: 함수의 반환 값은 Caller가 받을 수 있음, 즉 명시적으로 호출하지 않으면 받을 수 없음
: 그러나 이벤트 핸들러와 같은 비동기 함수는 우리가 명시적으로 호출할 수 없고, 브라우저가 호출하기 때문에 반환 값을 받을 수 없음
: 또한 에러 처리가 곤란함, 구체적으로 에러는 Caller(호출자) 방향으로 전파되는데 비동기 함수의 콜백 함수는 이미 비동기 함수가 실행 컨텍스트에서 제거된 후에 콜 스택에 푸시되므로 호출자를 찾지 못해서 에러가 소실됨
- 프로미스는 무엇인가?
: 비동기 함수 콜백 패턴의 문제점을 해결하기 위한 수단, 비동기 처리의 상태 정보와 결과 정보를 가지고 있는 객체
: 프로미스를 사용함으로써 비동기 함수의 콜백 함수에서도 HTTP 요청의 데이터인response
값을 반환하여 사용할 수 있게 됨
- 프로미스 사용의 의의는 무엇인가?
: 콜백 함수를 사용하지 않고 순차적으로 메서드를 체이닝하여 가독성을 개선할 수 있고, 에러 처리를 할 수 있음
- 프로미스 객체의
resolve
와reject
메서드는 어떤 역할을 하는가?:
resolve
와reject
는 공통적으로 프로미스 객체의 상태 정보를 변경하고, 내부 슬롯인[[PromiseResult]]
에 전달 받은 인수를 할당함
: 차이점이 있다면resolve
는 프로미스 객체의 상태 정보를fullfilled
로,reject
는 프로미스 객체의 상태 정보를rejected
로 변경
- 프로미스의 후속 처리 메서드는 무엇이고, 어떤 종류가 있는가?
: 프로미스 객체의
[[PromiseResult]]
에 할당된 값을 처리하기 위한 메서드로then
,catch
,finally
를 사용할 수 있음
then
과catch
의 차이는 무엇인가?:
then
은 프로미스 객체의 내부 상태가fullfilled
되었을 때 인수로 전달한 콜백 함수 호출, 호출할 때resolve
의 인수로 전달한 값이 넘어옴
:catch
는 프로미스 객체의 내부 상태가rejected
되었을 때 인수로 전달한 콜백 함수 호출, 호출할 때reject
의 인수로 전달한 값이 넘어옴
- 제너레이터는 언제 사용하는가?
: 이터러블의 구현을 간소화할 때 주로 사용
async
와await
는 무엇이고, 왜 사용하는가?: 프로미스 역시 콜백 패턴을 사용하여 가독성이 좋지 않기 때문에 비동기 처리를 보완하기 위해 ES8에 등장한 키워드
:async
와await
를 사용하면 전통적인 코딩 방식에서 크게 벗어나지 않기 때문에 가독성이 좋음
async
와await
사용 시 유의점은 무엇인가?:
async
함수에서는await
키워드를 통해 반환 값만 반환해야 함
:async
함수가 외부 상태와 상호작용하려면 제너레이터를 사용하는 것이 바람직함
:await
키워드 뒤에는 항상 프로미스 객체가 위치해야 함
: 모듈 내부에서await
는 항상async
내부에서만 사용해야 함
await
를async
밖에서 사용하려면 어떻게 해야 하는가?: 밖에서도 사용할 수 있는 것처럼 만들려면 즉시 실행 함수로 감싸서
async
내부에서 사용해야 함
:async
밖에서도await
를 사용할 수 있는 문법이 현재 제안되어 크롬 브라우저에서는 사용 가능하지만, Node.js 환경에서는 사용 불가능함