기술 면접 연습 질문
일반적으로 JavaScript를 불러오기위해<script>요소를 <body>요소가 끝나기 직전에 배치합니다. 이유가 무엇인가요?

<li>요소는왜<ul>요소의 자식요소여야만하나요?

id속성과 class속성의 차이에 대해서 설명해주세요.

CSSboxmodel에 대해서 설명해주세요.

스코프에 대해서 설명해주세요.

배열, 객체를 const로 선언했는데 요소나 속성을 추가할 수 있는 이유에 대해서 설명해주세요.

원시자료형과 참조자료형에 대해서 설명해주세요.

얕은복사와 깊은복사에 대해서 설명해주세요.

preventDefalut 메소드는 무엇인가요?

innerHTML메서드와 textContent메서드의 차이에 대해서 설명해주세요.

Promise의 기능과 필요한 이유에 대해서 설명해 주세요.

순수함수란 무엇인가요? 불변성과 사이드 이펙트와 연결하여 설명해 주세요.

React의 state와 props에 대해서 설명해 주세요.

React 컴포넌트의 key 속성에 대해서 설명해 주세요.

useEffect의 dependency array에 대해서 설명해 주세요.

CSR과 SSR의 차이점에 대해서 설명해 주세요.

GET 메서드와 POST 메서드의 차이점에 대해 설명해 주세요.

HTTP 메시지 구조에 대해 설명해 주세요.

Same-Origin Policy에 대해서 설명해 주세요.

CORS에 대해서 설명해 주세요.

재귀가 무엇이고, 활용하기 좋은 상황은 언제인지 예시를 들어 설명해 주세요.

UI, UX의 개념과 두 개념의 관계에 대해서 설명해 주세요.

useRef가 필요한 상황을 예시를 들어 설명해 주세요.

상태관리 라이브러리의 필요성에 대해서 설명해 주세요.

Semantic HTML의 필요성을 예시를 들어 설명해 주세요.
- <header>: 페이지나 요소의 최상단에 위치하는 머리말 역할의 요소입니다.
- <nav>: 메뉴, 목차 등에 사용되는 요소입니다.
- <aside>: 문서와 연관은 있지만, 직접적인 연관은 없는 내용을 담는 요소입니다.
- <main>: 이름 그대로 문서의 메인이 되는 주요 콘텐츠를 담는 요소입니다.
- <article>: 게시글, 뉴스 기사 등 독립적으로 구분해 재사용할 수 있는 부분을 의미하는 요소입니다. 각각의 <article>을 구분하기 위한 수단이 필요하며, 보통 제목(<hgroup>)을 포함하는 방법을 사용합니다.
- <section>: 문서의 독립적인 구획을 나타내며, 딱히 적합한 의미의 요소가 없을 때 사용합니다. 제목(<hgroup>)을 포함하는 경우가 많습니다.
- <hgroup>: 제목을 표시할 때 사용하는 요소로, <h1> ~ <h6> 요소가 <hgroup>입니다.
- <footer>: 페이지나 요소의 최하단에 위치하는 꼬리말 역할의 요소입니다.

IP 프로토콜의 한계에 대해서 설명해 주세요.

HTTP 프로토콜의 특징에 대해 설명해 주세요.

Cookie의 MaxAge, Expires 옵션이 무엇인지, 설정하지 않으면 어떻게 되는지 설명해 주세요.

Hoisting과 Temporal Dead Zone이 어떻게 연관되어 있는지 설명하세요.

브라우저 렌더링 방식에 대해 설명하세요.

리플로우와 리페인트에 대해 설명하세요.

반응형 웹은 무엇이고 장단점에 대해 설명하세요.

자바스크립트 엔진의 콜 스택이 무엇인지 설명할 수 있나요?

번들링은 왜 필요한가요?

Virtual DOM이 무엇이고, Virtual DOM이 어떤 면에서 좋은가요?

JavaScript는 싱글 스레드입니다. 어떻게 싱글 스레드 방식으로 비동기 호출을 할 수 있는지에 대해 설명할 수 있나요?

Event Loop에 대해 설명할 수 있나요?

가비지 컬렉션이란 무엇이며, 가비지 컬렉션을 가진 언어에는 무엇이 있나요?

Stack과 Queue의 차이점은 무엇인가요?

Tree와 Graph의 차이점은 무엇인가요?

이진 탐색 방법에 대해 설명할 수 있나요?
캐시란 무엇인가요? 캐시의 일반적인 작동원리를 설명해주세요.
캐시 메모리란 메인 메모리와 CPU 사이의 데이터 속도 향상을 위해 중간 버퍼 역할을 하는 메모리로, 데이터를 미리 저장해 다음에 동일한 요청이 있을 때 원래의 저장소로부터 데이터를 가져오는 시간, 비용을 줄일 수 있습니다. 이는 지역성에 기반하는 것으로, 지역성이란 데이터에 대한 액세스 패턴이 시간적이거나 공간저긍로 집중되는 경향이 있다는 뜻입니다. 그렇기에 최근에 액세스한 데이터나 주변 데이터에 대한 액세스가 거 높은 확률로 발생하며, 이를 캐시를 통해 활용하여 속도를 향상시킬 수 있습니다.
Session과 Cookie 그리고 Token 인증방식에 대해 설명해주세요.
세션은 서버 측에서 상태 정보를 유지하고 클라이언트를 식별하는 데 사용됩니다. 쿠키는 클라이언트 측에서 상태 정보를 유지하고 클라이언트와 서버 간의 통신에 사용됩니다. 토큰은 인증 및 인가를 위한 보안 메커니즘으로 사용되며 클라이언트가 자원에 대한 권한을 얻는 데 사용됩니다.
REST API에 대해 설명해주세요.
REST API는 웹 서비스의 자원을 표현하고 상태를 주고받기 위한 아키텍처 스타일로, HTTP 프로토콜을 기반으로 동작합니다. REST는 자원 기반, 상태 없음, 통일된 인터페이스, 자체 표현, 계층 구조 등의 특징을 가지며, HTTP 메서드와 상태 코드를 사용하여 자원을 조작하고 응답합니다.
AJAX에 대해 설명해주세요.
AJAX는 Asynchronous JavaScript And XMLHttpRequest의 약자로, JavaScript, DOM, Fetch, XMLHttpRequest, HTML 등의 다양한 기술을 사용하는 웹 개발 기법입니다. AJAX의 가장 큰 특징은, 웹 페이지에 필요한 부분에 필요한 데이터만 비동기적으로 받아와 화면에 그려낼 수 있다는 것입니다. 예를 들어, 우리가 사용하는 페이스북 메시지나 네이버 포털사이트의 뉴스 탭 역시 비동기적으로 데이터를 서버에서 받아와 브라우저에 렌더링을 하는 것이며, 이러한 기법을 AJAX라고 합니다.
이벤트 버블링이란 무엇이며 막을 수 있는 방법은 무엇인가요?
이벤트 버블링(Event Bubbling)은 HTML 요소들이 중첩된 구조에서 이벤트가 발생했을 때, 해당 이벤트가 발생한 요소에서 시작하여 부모 요소들을 거슬러 올라가면서 처리되는 메커니즘입니다. 즉, 하위 요소에서 발생한 이벤트가 상위 요소로 전파되는 것을 의미합니다.
TCP와 UDP 방식의 차이점을 설명해주세요.
우선, TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)는 인터넷 프로토콜입니다. 하지만 차이점 역시 존재합니다. 우선, TCP는 연결 지향성 프로토콜이지만 UDP는 비연결성 프로토콜입니다. 그리고 TCP는 패킷의 신뢰성을 보장하지만 UDP는 그렇지 않습니다. 또한 TCP는 신뢰성이 높지만 속도는 낮은 반면, UDP는 신뢰성은 낮지만 속도는 높습니다.
Node.js는 싱글쓰레드인가요?
Node.js는 싱글 스레드 기반의 비동기 이벤트 처리 모델을 가지고 있습니다. 이는 JavaScript 코드가 한 번에 하나씩 실행된다는 것을 의미합니다. 하지만 Node.js는 싱글 스레드로 동작하지만 여러 개의 동시 연결을 처리할 수 있습니다.
Props Drilling 이란 무엇인가요?
Props Drilling은 상위 컴포넌트의 state를 props를 통해 전달하는데, 이 때 몇몇 컴포넌트가 그저 props를 전달하는 용도로만 쓰이는 경우를 의미합니다. Props Drilling이 심해지면 코드의 가독성이 매우 나빠지고 유지 보수가 힘들어집니다. 또한 state 변경 시 props 전달 과정에서 불필요하게 관여된 컴포넌트들이 리렌더링이 발생하여 웹성능에 악영향을 줄 수 있습니다. 이를 방지하기 위해 별도의 상태관리 라이브러리를 이용할 수 있습니다.
JSX가 무엇인가요?
JSX란 JavaScript를 확장한 문법입니다. 이를 이용해 React Element를 만들 수 있습니다. JSX를 이용한 코드는 마치 html 코드같아 보고 이해하기가 상대적으로 수월합니다. 하지만 브라우저는 이를 이해할 수 없기에 Babel 등을 이용해 JavaScript로 컴파일하여야 합니다.
state를 직접 변경하지 않고 setState를 사용하는 이유에 대해서 설명하세요.
setState는 state를 갱신할 수 있는 함수입니다. 이를 통해 state가 변경되면 리렌더링이 됩니다. 하지만 setState를 이용하지 않고 state를 변경하면 리렌더링이 되지 않거나 state가 제대로 변경되지 않을 수도 있습니다.
클로져에 대해서 설명하세요.
클로저는 함수와 그 함수 주변의 상태의 주소 조합이라 할 수 있습니다. 클로저는 함수가 정의될 때의 환경을 기억하고, 함수가 호출될 때에도 해당 환경에 접근할 수 있도록 합니다. 주로 클로저는 데이터 은닉, 정보 보존,
callback, promise, async/await 의 특징과 차이점에 대해서 설명하세요.
우선 callback은 비동기 작업의 결과를 다루기 위해 콜백 함수를 이용하는 방식으로, 특정 작업이 완료되면 해당 콜백 함수를 호출합니다. 그런데 콜백 함수가 많아지면 콜백 헬이라는 문제가 발생해 가독성과 유지보수성이 떨어질 수 있습니다.
그리고 Promise는 성공, 실패라는 각 상태에 대해 작업을 진행할 수 있습니다. 이는 then과 catch를 이용해 처리할 수 있습니다. 또한 Promise 체인을 이용해 여러 비동기 작업을 연결하고 콜백 헬을 방지할 수 있습니다.
마지막으로 Async/Await은 async 함수 내에서 await 키워드를 사용하여 Promise가 처리될 때까지 기다린 후 결과를 반환합니다. 또한 코드가 동기적으로 작성되기 때문에 가독성이 좋고, 콜백 헬을 피할 수 있습니다. Promise를 기반으로 동작하며, async 함수 내에서 Promise를 반환하면 비동기 작업의 결과를 처리할 수 있습니다.
브라우저 저장소에 대해서 차이점을 설명해주세요.(LocalStorage, SessionStorage, Cookie)
브라우저 저장소의 주요 세 가지 방식인 LocalStorage, SessionStorage, 그리고 Cookie는 웹 데이터를 저장하는 방식으로 사용되지만, 각각의 특징과 사용 케이스에 따라 차이점이 있습니다.
- LocalStorage
- 지속성: LocalStorage에 저장된 데이터는 만료 기간이 없으며, 사용자가 직접 삭제하거나 웹 사이트가 프로그래밍적으로 삭제하지 않는 한 브라우저를 종료해도 계속해서 남아 있습니다.
- 용량: 대부분의 브라우저에서 LocalStorage의 저장 용량은 약 5~10MB입니다.
- 접근성: 웹 페이지의 동일 출처 정책(same-origin policy)에 따라 접근 가능합니다.
- SessionStorage
- 지속성: SessionStorage의 데이터는 페이지 세션이 끝나면(브라우저나 탭을 닫을 때) 삭제됩니다.
- 용량: LocalStorage와 마찬가지로, 대부분의 브라우저에서 SessionStorage의 저장 용량은 약 5~10MB입니다.
- 접근성: 웹 페이지의 동일 출처 정책에 따라 접근 가능하며, 페이지 리로드나 복원에도 데이터가 유지됩니다.
- Cookie
- 지속성: Cookie는 설정된 만료 날짜/시간까지 유지됩니다. 만료 날짜/시간이 지정되지 않으면, 브라우저가 닫힐 때 Cookie는 삭제됩니다.
- 용량: 각 Cookie의 크기는 약 4KB로 제한되며, 도메인당 저장할 수 있는 Cookie의 수도 제한되어 있습니다.
- 접근성: 서버와 클라이언트 모두에서 접근 가능합니다. 따라서, 서버에서 사용자를 식별하거나 특정 정보를 추적하는 데 사용됩니다.
- 보안: 보안 상의 이유로, HTTP-only 플래그가 설정된 Cookie는 JavaScript에서 접근할 수 없습니다.
- 요약
LocalStorage와 SessionStorage는 웹 스토리지(Web Storage)의 두 가지 방식으로, 큰 데이터 저장 용량을 가지며, 동일 출처 정책에 따라 동작합니다.
Cookie는 작은 데이터 저장 용량을 가지지만, 서버와의 통신에 유용하게 사용되며, 보안 및 만료 옵션을 포함할 수 있습니다.
HTML이 렌더링 중에 JavaScript가 실행되면 렌더링이 멈추는데 그 이유는 무엇인가
브라우저가 HTML을 파싱하여 DOM (Document Object Model) 트리를 생성하는 동안 <script> 태그를 만나게 되면, 그 시점에서 파싱과 렌더링이 일시 중지됩니다. 이러한 동작의 주요 이유는 다음과 같습니다.
- 순서적 실행: JavaScript는 웹 페이지의 구조나 스타일 등을 변경할 수 있습니다. 따라서, 스크립트가 HTML 요소에 의존하거나 해당 요소들을 수정할 수 있는 경우, 해당 스크립트가 예상한 대로 동작하려면 정확한 순서로 실행되어야 합니다.
- DOM 조작: JavaScript는 DOM을 조작할 수 있습니다. 만약 브라우저가 스크립트 실행을 대기하지 않고 계속 HTML 파싱을 진행한다면, JavaScript가 예상한 DOM 구조와 실제 DOM 구조가 달라질 수 있습니다. 이는 웹 페이지의 예상치 못한 동작을 초래할 수 있습니다.
- 동기적 실행: 기본적으로 <script> 태그는 동기적으로 실행됩니다. 이는 브라우저가 스크립트를 완전히 로드하고 실행하기 전까지 HTML 파싱을 중지한다는 것을 의미합니다. 이러한 이유로, 많은 웹사이트는 렌더링 차단을 최소화하기 위해 JavaScript를 문서의 하단에 배치하거나, async나 defer 속성을 사용하여 스크립트 로딩과 실행의 방식을 변경합니다.
SPA와 서버사이드 렌더링의 차이점은 무엇인가요?
SPA (Single Page Application)와 서버사이드 렌더링 (Server-Side Rendering, SSR)은 웹페이지의 컨텐츠를 사용자에게 제공하는 두 가지 주요한 방법입니다. 이 두 방식의 핵심 차이점과 특징은 다음과 같습니다:
렌더링 위치
SPA: 클라이언트 사이드 (즉, 브라우저)에서 주로 렌더링이 이루어집니다. 사용자가 애플리케이션 내에서 다른 페이지나 뷰로 이동할 때, 전체 페이지를 다시 로드하는 대신 필요한 데이터만 서버로부터 받아와서 현재 페이지를 갱신합니다.
SSR: 서버에서 페이지의 초기 상태를 렌더링하고, 그 결과인 HTML을 클라이언트에게 전송합니다. 이 방식은 전통적인 웹 페이지 로딩 방식과 유사하며, 사용자는 서버로부터 완전히 렌더링된 페이지를 받게 됩니다.
시작 시 로딩 시간
SPA: 애플리케이션 코드 (JavaScript, CSS 등)를 처음에 모두 다운로드 받아야 하므로 초기 로딩 시간이 길 수 있습니다. 그러나 이후의 페이지 전환은 빠르게 이루어집니다.
SSR: 사용자가 페이지를 처음 방문할 때 빠른 화면 표시가 가능합니다. 왜냐하면 필요한 컨텐츠가 이미 서버에서 렌더링된 상태로 전송되기 때문입니다.
SEO (검색 엔진 최적화)
SPA: 전통적인 SPA는 검색 엔진이 JavaScript를 실행하지 않으면 페이지의 내용을 인식할 수 없었습니다. 따라서 SEO에 문제가 있을 수 있습니다. 하지만 최근의 검색 엔진들은 JavaScript를 실행할 수 있으므로 이 문제는 점점 감소하고 있습니다.
SSR: 서버에서 렌더링된 페이지는 검색 엔진이 쉽게 크롤링하고 인덱싱할 수 있기 때문에, SEO에 유리합니다.
서버 부하
SPA: 서버는 주로 데이터를 제공하는 API 역할만 하기 때문에 렌더링 부하가 적습니다.
SSR: 각 페이지 요청마다 서버에서 렌더링을 수행해야 하므로 서버의 부하가 SPA에 비해 높을 수 있습니다.
this에 대해 설명해주세요
JavaScript에서 this는 현재의 실행 컨텍스트에 따라 참조하는 객체가 바뀌는 키워드입니다. 그 특징은 다음과 같습니다
- 전역 컨텍스트에서 this는 전역 객체, 브라우저에서는 window를 참조합니다.
- 일반 함수 호출에서 기본적으로 this는 전역 객체를 참조합니다. 하지만 strict mode에서는 undefined를 참조합니다.
- 메서드 호출에서 this는 해당 메서드를 호출한 객체를 참조합니다.
- 생성자 함수에서 this는 새롭게 생성된 객체를 참조합니다.
- 이벤트 핸들러에서 this는 이벤트를 발생시킨 DOM 요소를 참조합니다.
- call, apply, bind 메서드를 사용할 때 이 메서드들을 통해 this의 참조를 명시적으로 설정할 수 있습니다.
타입스크립트의 Type과 Interface의 차이점에 대해 설명해주세요.
타입스크립트에서 Type과 Interface는 객체의 형태나 함수, 클래스 등을 정의할 때 사용되는 두 가지 주요 도구입니다. 그들 사이에는 몇 가지 중요한 차이점이 있습니다:
확장성
Interface: 여러 인터페이스가 같은 이름을 가질 때, 자동으로 합쳐져 하나의 인터페이스로 합쳐지는 특징이 있습니다. 이를 인터페이스 선언 병합(declaration merging)이라 합니다.
Type: 타입 별칭은 선언 병합을 지원하지 않습니다. 대신 유니온(|)이나 교차(&) 연산자를 이용하여 새로운 타입을 생성할 수 있습니다.
컴포지션과 확장
Interface: 다른 인터페이스를 extends를 사용하여 확장할 수 있습니다.
Type: & 연산자를 사용하여 여러 타입들을 조합할 수 있습니다.
표현력
Interface: 주로 객체의 형태를 정의하는데 사용됩니다.
Type: 객체 뿐만 아니라 원시값, 유니온, 튜플 등 보다 다양한 값을 표현할 수 있습니다.
바운디드 컨텍스트
Type: 조건부 타입과 같은 고급 타입을 사용하여 복잡한 타입 로직을 표현할 수 있습니다. 이는 인터페이스로는 구현할 수 없습니다.
코드 에미션 및 성능
Interface: 인터페이스는 컴파일 결과에서 제거됩니다. 따라서 런타임에는 영향을 주지 않습니다.
Type: 타입 별칭도 마찬가지로 컴파일 결과에서 제거됩니다.
결론적으로, 어떤 것을 사용할지는 주어진 문제와 요구 사항에 따라 달라집니다. 일반적인 객체의 형태를 정의하고 확장하는 경우에는 Interface를 사용하는 것이 좋을 수 있습니다. 그러나 복잡한 타입 연산이 필요하거나 다양한 값을 표현해야하는 경우에는 Type을 사용하는 것이 적절합니다.
react-query의 장점을 말해주세요.
- 자동 캐싱: 서버에서 가져온 데이터는 자동으로 캐시되며, 동일한 요청은 캐시된 데이터를 사용하여 불필요한 네트워크 요청을 줄입니다.
- 백그라운드 데이터 동기화: 데이터가 백그라운드에서 자동으로 주기적으로 동기화될 수 있습니다. 이는 사용자가 항상 최신의 데이터를 보게 해줍니다.
- 재시도 로직: 네트워크 요청이 실패한 경우, 설정된 횟수만큼 자동으로 재시도할 수 있습니다.
- 패치된 데이터 상태 관리: 'isLoading', 'isError', 'data' 등 패치된 데이터의 상태를 쉽게 관리할 수 있습니다.
- 병렬 및 종속 요청: 여러 데이터 패치를 동시에 처리하거나 한 요청이 다른 요청을 결과에 종속되게 할 수 있습니다.
- 최적화: 불필요한 리렌더링을 줄이기 위해 데이터 패치와 상태 업데이트가 촤적화되어 있습니다.
질문
답변
질문
답변
질문
답변
질문
답변