[220901] 오늘의 배움(TIL) - JavaScript

💛 nalsae·2022년 9월 1일
2

📚 오늘의 배움(TIL)

목록 보기
39/84
post-thumbnail

🔶 JavaScript

  • 자바스크립트의 타이머 함수는 콜백 함수를 호출하는가?

: setTimeout과 같은 타이머 함수는 콜백 함수를 호출하지 않음, 함수를 호출한다는 것은 태스크 큐에서 콜 스택으로 넘겨주는 것을 의미함
: 콜백 함수를 호출하는 과정은 브라우저의 이벤트 루프가 수행함

  • 멀티 스레드는 무조건 좋은가?

: 멀티 스레드라면 각각의 콜 스택이 함수를 처리할 수는 있지만, 변수 등을 재할당할 때 처리 순서가 보장되지 않음
: 즉 멀티 스레드로 동작하면 코딩이 복잡해지고, 순서 문제가 발생할 수 있음
: 그러나 동시성의 확보를 포기할 수 없었기 때문에 자바스크립트는 싱글 스레드 방식으로 동작하되, 비동기를 처리하도록 한 것

  • 타이머 함수의 경우 어떤 방식으로 비동기적인 처리가 진행되는가?

: 시간을 재는 일을 브라우저가 도와주어야 함
: 브라우저가 시간을 다 재면 tick 이벤트가 발생하고, 그제서야 태스크 큐로 콜백 함수를 넘겨주는 것

  • 타이머 함수의 인수로 전달하는 지연 시간은 정확한가?

: 태스크 큐로 콜백 함수를 전달하는 시간이 또 따로 있기 때문에, 지연 시간을 1초로 설정해도 정확히 1초 후에 콜백 함수가 실행되지는 않음

  • 블로킹의 관점에서 비동기는 무엇인가?

: 동기 처리에서 발생하는 블로킹을 해결하기 위한 방법

  • 비동기 처리는 보편적으로 언제 사용하는가?

: 서버와 브라우저의 통신 과정에서 사용, 여기서의 통신은 클라이언트(브라우저가)가 서버에 리소스를 요청하고 서버를 통해 응답 받는 과정을 의미함

  • REST란 무엇인가?

: 서버와 브라우저가 통신할 때 GET, POST, PUT, PATCH, DELETE와 같은 요청 메서드를 사용해서 리소스를 달라고 URL을 통해 요청하는 것을 HTTP라고 하는데, 여기서의 URL에 대한 약속이 바로 REST

  • REST를 준수해야 하는 이유는 무엇인가?

: HTTP를 동일한 환경에서 사용하기 위해, 즉 컨벤션을 지키기 위해 REST를 준수해야 함

  • 서버와의 통신은 무엇을 토대로 이루어지는가?

: Promise, fetch 등 어떤 방식을 사용해서 비동기를 처리하든 그 근본은 XMLHttpRequest 객체
: 현재는 JSON 데이터 포맷을 사용하여 통신을 하지만, 예전에는 통신 시 XML을 사용했기 때문에 이름이 XMLHttpRequest

  • XMLHttpRequestsend 메서드가 필요한 이유는 무엇인가?

: HTTP 요청 시 페이로드, 즉 데이터를 전달하기 위해

  • HTTP 요청 메서드 중 GET의 특징은 무엇인가?

: 무엇을 조회할지 알려주어야 함
: GET 메서드는 페이로드를 전달해도 무시

  • HTTP 요청의 성공 여부를 어떻게 판단할 수 있는가?

: XMLHttpRequest 생성자 함수로 생성한 객체에 이벤트 핸들러를 등록하여 load 이벤트나 readyStateChange 이벤트를 캐치하면, 객체의 status 프로퍼티에 상태 코드가 할당되고 이 코드를 통해 판단할 수 있음
: 조건식을 통해 HTTP 요청의 성공 여부에 따라 각각 성공 처리, 실패 처리할 로직을 구현하면 됨

  • 콜백 헬이란 무엇인가?

: HTTP 요청 시 전달하는 콜백 안에서 또 HTTP 요청을 하는 경우 그 안에 또 콜백이 중첩되는 현상이 많이 발생하는 것

  • 기존 비동기 함수의 콜백 패턴이 가지는 문제점은 무엇인가?

: 함수의 반환 값은 Caller가 받을 수 있음, 즉 명시적으로 호출하지 않으면 받을 수 없음
: 그러나 이벤트 핸들러와 같은 비동기 함수는 우리가 명시적으로 호출할 수 없고, 브라우저가 호출하기 때문에 반환 값을 받을 수 없음
: 또한 에러 처리가 곤란함, 구체적으로 에러는 Caller(호출자) 방향으로 전파되는데 비동기 함수의 콜백 함수는 이미 비동기 함수가 실행 컨텍스트에서 제거된 후에 콜 스택에 푸시되므로 호출자를 찾지 못해서 에러가 소실됨

  • 프로미스는 무엇인가?

: 비동기 함수 콜백 패턴의 문제점을 해결하기 위한 수단, 비동기 처리의 상태 정보와 결과 정보를 가지고 있는 객체
: 프로미스를 사용함으로써 비동기 함수의 콜백 함수에서도 HTTP 요청의 데이터인 response 값을 반환하여 사용할 수 있게 됨

  • 프로미스 사용의 의의는 무엇인가?

: 콜백 함수를 사용하지 않고 순차적으로 메서드를 체이닝하여 가독성을 개선할 수 있고, 에러 처리를 할 수 있음

  • 프로미스 객체의 resolvereject 메서드는 어떤 역할을 하는가?

: resolvereject는 공통적으로 프로미스 객체의 상태 정보를 변경하고, 내부 슬롯인 [[PromiseResult]]에 전달 받은 인수를 할당
: 차이점이 있다면 resolve는 프로미스 객체의 상태 정보를 fullfilled로, reject는 프로미스 객체의 상태 정보를 rejected로 변경

  • 프로미스의 후속 처리 메서드는 무엇이고, 어떤 종류가 있는가?

: 프로미스 객체의 [[PromiseResult]]에 할당된 값을 처리하기 위한 메서드로 then, catch, finally를 사용할 수 있음

  • thencatch의 차이는 무엇인가?

: then은 프로미스 객체의 내부 상태가 fullfilled 되었을 때 인수로 전달한 콜백 함수 호출, 호출할 때 resolve의 인수로 전달한 값이 넘어옴
: catch는 프로미스 객체의 내부 상태가 rejected 되었을 때 인수로 전달한 콜백 함수 호출, 호출할 때 reject의 인수로 전달한 값이 넘어옴

  • 제너레이터는 언제 사용하는가?

: 이터러블의 구현을 간소화할 때 주로 사용

  • asyncawait는 무엇이고, 왜 사용하는가?

: 프로미스 역시 콜백 패턴을 사용하여 가독성이 좋지 않기 때문에 비동기 처리를 보완하기 위해 ES8에 등장한 키워드
: asyncawait를 사용하면 전통적인 코딩 방식에서 크게 벗어나지 않기 때문에 가독성이 좋음

  • asyncawait 사용 시 유의점은 무엇인가?

: async 함수에서는 await 키워드를 통해 반환 값만 반환해야 함
: async 함수가 외부 상태와 상호작용하려면 제너레이터를 사용하는 것이 바람직함
: await 키워드 뒤에는 항상 프로미스 객체가 위치해야 함
: 모듈 내부에서 await는 항상 async 내부에서만 사용해야 함

  • awaitasync 밖에서 사용하려면 어떻게 해야 하는가?

: 밖에서도 사용할 수 있는 것처럼 만들려면 즉시 실행 함수로 감싸서 async 내부에서 사용해야 함
: async 밖에서도 await를 사용할 수 있는 문법이 현재 제안되어 크롬 브라우저에서는 사용 가능하지만, Node.js 환경에서는 사용 불가능함

profile
𝙸'𝚖 𝚊 𝚍𝚎𝚟𝚎𝚕𝚘𝚙𝚎𝚛 𝚝𝚛𝚢𝚒𝚗𝚐 𝚝𝚘 𝚜𝚝𝚞𝚍𝚢 𝚊𝚕𝚠𝚊𝚢𝚜. 🤔

0개의 댓글