패스잇

백엔드 개발

Node.js 면접 질문

이벤트 루프와 논블로킹 I/O, 스트림, 클러스터, 미들웨어 — Node.js 면접은 싱글 스레드 위에서 어떻게 동시성을 다루는지를 묻습니다. 핵심 동작 원리를 모범답안으로 정리했습니다.

총 21문제 · 기초 7 · 중급 7 · 심화 7 · 모범답안 포함

Node.js 면접 질문 — 기초

Q1 기초

Node.js란 무엇이며, 어떤 특징을 가지고 있나요?

힌트 · JavaScript 런타임 환경이며, 비동기 I/O와 이벤트 기반 아키텍처가 핵심 특징입니다.

Node.js는 Chrome V8 엔진으로 빌드된 JavaScript 런타임 환경입니다. 웹 브라우저 밖에서도 JavaScript를 실행할 수 있게 해주는 것이죠.

전체 모범답안 펼치기

Node.js는 Chrome V8 엔진으로 빌드된 JavaScript 런타임 환경입니다. 웹 브라우저 밖에서도 JavaScript를 실행할 수 있게 해주는 것이죠.

가장 큰 특징은 비동기 I/O와 이벤트 기반 아키텍처를 사용한다는 점입니다. Non-Blocking I/O 방식을 통해 싱글 스레드 환경에서도 높은 처리량을 유지할 수 있습니다. 예를 들어, 데이터베이스 쿼리를 날리고 응답을 기다리는 동안 다른 작업을 처리할 수 있어서 효율적입니다.

이벤트 루프라는 메커니즘을 통해 이러한 비동기 작업을 관리하고, 콜백 함수를 실행하는 방식으로 동작합니다. 덕분에 실시간 애플리케이션이나 데이터 스트리밍과 같이 I/O가 많은 작업에 특히 강점을 보입니다.

#비동기#이벤트 루프#V8 엔진#Non-Blocking I/O#싱글 스레드

이 질문 단독 페이지 →

Q2 기초

npm이란 무엇이고 어떤 역할을 하나요?

힌트 · Node Package Manager로 패키지 설치, 관리, 버전 관리 등을 담당합니다.

npm은 Node Package Manager의 약자로, 자바스크립트 패키지 관리자입니다. Node.js 프로젝트에서 필요한 다양한 모듈들을 쉽게 설치하고 관리할 수 있도록 도와주는 도구라고 생각하시면 됩니다.

전체 모범답안 펼치기

npm은 Node Package Manager의 약자로, 자바스크립트 패키지 관리자입니다. Node.js 프로젝트에서 필요한 다양한 모듈들을 쉽게 설치하고 관리할 수 있도록 도와주는 도구라고 생각하시면 됩니다.

주요 역할은 다음과 같습니다.

  • 패키지 설치 및 관리: 필요한 패키지를 npm 레지스트리에서 검색하여 프로젝트에 설치하고, 업데이트하거나 삭제할 수 있습니다. npm install 패키지명 명령어를 통해 간단하게 설치할 수 있습니다.
  • 의존성 관리: 프로젝트에서 사용하는 패키지들의 의존성을 package.json 파일에 기록하고 관리합니다. 이를 통해 다른 환경에서도 동일한 의존성 환경을 구축할 수 있습니다.
  • 버전 관리: 패키지의 버전을 명시적으로 관리하여 프로젝트의 안정성을 높입니다.
  • 스크립트 실행: package.json 파일에 정의된 스크립트를 실행하여 빌드, 테스트, 배포 등의 작업을 자동화할 수 있습니다. 예를 들어, npm start 명령어를 통해 서버를 실행할 수 있습니다.

npm 덕분에 개발자들은 직접 코드를 작성하지 않고도 다양한 기능을 쉽게 활용할 수 있으며, 코드 재사용성을 높여 개발 생산성을 향상시킬 수 있습니다.

#패키지 관리자#의존성 관리#모듈#npm 레지스트리#package.json

이 질문 단독 페이지 →

Q3 기초

package.json 파일의 역할과 주요 속성들을 설명해주세요.

힌트 · 프로젝트 메타데이터 관리 파일이며, dependencies, scripts, version 등이 주요 속성입니다.

package.json 파일은 Node.js 프로젝트의 핵심적인 메타데이터 관리 파일입니다. 프로젝트에 대한 정보, 의존성 패키지 목록, 실행 스크립트 등을 정의합니다.

전체 모범답안 펼치기

package.json 파일은 Node.js 프로젝트의 핵심적인 메타데이터 관리 파일입니다. 프로젝트에 대한 정보, 의존성 패키지 목록, 실행 스크립트 등을 정의합니다.

주요 역할은 다음과 같습니다.

  • 의존성 관리: 프로젝트가 사용하는 외부 패키지들을 dependenciesdevDependencies 속성을 통해 명시하고, npm이나 yarn 같은 패키지 관리자를 통해 쉽게 설치하고 관리할 수 있도록 합니다.
  • 스크립트 실행: scripts 속성을 통해 자주 사용하는 명령어를 단축된 형태로 정의하여 npm run <스크립트 이름>으로 실행할 수 있습니다. 예를 들어, npm run start는 서버를 실행하는 명령어가 될 수 있습니다.
  • 프로젝트 정보: 프로젝트 이름, 버전, 설명, 작성자, 라이센스 등 프로젝트에 대한 기본적인 정보를 담고 있습니다.
  • 버전 관리: 프로젝트의 버전을 명시하여 배포 및 업데이트 관리를 용이하게 합니다.

이러한 정보들을 통해 협업하는 개발자 간에 프로젝트 환경을 일관성 있게 유지하고, 배포 과정을 자동화하는 데 도움을 줍니다.

#의존성 관리#스크립트 실행#메타데이터#버전 관리#npm

이 질문 단독 페이지 →

Q4 기초

Node.js에서 모듈을 불러오는 방법들을 설명해주세요.

힌트 · require() 함수(CommonJS)와 import/export 구문(ES6 모듈) 두 가지 방식이 있습니다.

Node.js에서 모듈을 불러오는 방법은 크게 두 가지가 있습니다.

전체 모범답안 펼치기

Node.js에서 모듈을 불러오는 방법은 크게 두 가지가 있습니다.

첫 번째는 require() 함수를 사용하는 CommonJS 방식입니다. 이 방식은 Node.js 초기부터 사용되던 방식으로, module.exports를 통해 모듈을 내보내고 require() 함수로 불러옵니다. 예를 들어, const moduleA = require('./moduleA'); 와 같이 사용합니다.

두 번째는 ES6 모듈 방식인 importexport 구문을 사용하는 방법입니다. 이 방식은 JavaScript 표준에 정의된 모듈 시스템으로, export 키워드를 사용하여 모듈을 내보내고 import 키워드를 사용하여 불러옵니다. 예를 들어, import moduleA from './moduleA'; 와 같이 사용합니다. ES6 모듈을 Node.js에서 사용하려면 package.json 파일에 "type": "module"을 추가하거나 파일 확장자를 .mjs로 지정해야 합니다.

두 방식 모두 모듈을 재사용하고 코드 구조를 개선하는 데 도움을 줍니다.

#require#import#module.exports#export#CommonJS

이 질문 단독 페이지 →

Q5 기초

Express.js란 무엇이며 Node.js와 어떤 관계인가요?

힌트 · Node.js 기반의 웹 애플리케이션 프레임워크로, HTTP 서버 구축을 간단하게 해줍니다.

Express.js는 Node.js 위에서 동작하는 웹 애플리케이션 프레임워크입니다. Node.js는 JavaScript로 서버를 만들 수 있게 해주는 런타임 환경이고, Express.js는 이러한 Node.js 환…

전체 모범답안 펼치기

Express.js는 Node.js 위에서 동작하는 웹 애플리케이션 프레임워크입니다. Node.js는 JavaScript로 서버를 만들 수 있게 해주는 런타임 환경이고, Express.js는 이러한 Node.js 환경에서 웹 애플리케이션을 더 쉽고 빠르게 개발할 수 있도록 도와주는 도구 모음이라고 생각하시면 됩니다.

Express.js는 특히 HTTP 요청을 처리하는 라우팅 기능과, 요청과 응답 사이에서 다양한 작업을 수행하는 미들웨어 기능을 제공하여 웹 애플리케이션 개발 생산성을 높여줍니다. 예를 들어, 특정 URL로 접속했을 때 어떤 코드를 실행할지 쉽게 정의하거나, 요청 데이터를 검증하고 변환하는 등의 작업을 간편하게 처리할 수 있습니다. Node.js만으로 웹 서버를 구축하는 것보다 훨씬 효율적입니다.

#Node.js#프레임워크#웹 애플리케이션#라우팅#미들웨어

이 질문 단독 페이지 →

Q6 기초

Express에서 라우팅(Routing)이란 무엇인가요?

힌트 · 클라이언트 요청의 경로와 HTTP 메서드에 따라 적절한 핸들러 함수를 연결하는 메커니즘입니다.

Express에서 라우팅은 클라이언트의 요청에 따라 적절한 응답을 제공하기 위한 핵심 메커니즘입니다. 쉽게 말해, 특정 URL 경로와 HTTP 메서드(GET, POST 등)로 들어온 요청을 처리할 함수를 연결해주는…

전체 모범답안 펼치기

Express에서 라우팅은 클라이언트의 요청에 따라 적절한 응답을 제공하기 위한 핵심 메커니즘입니다. 쉽게 말해, 특정 URL 경로와 HTTP 메서드(GET, POST 등)로 들어온 요청을 처리할 함수를 연결해주는 역할을 합니다.

예를 들어, /users 경로로 GET 요청이 들어오면 사용자 목록을 반환하는 함수를 실행하고, POST 요청이 들어오면 새로운 사용자를 생성하는 함수를 실행하도록 설정할 수 있습니다.

이때, 라우팅은 단순히 경로와 함수를 연결하는 것뿐만 아니라, 미들웨어를 사용하여 요청을 가로채고 수정하거나, 인증 및 권한 부여를 수행하는 등 다양한 기능을 수행할 수 있도록 확장될 수 있습니다. 라우팅을 통해 Express 애플리케이션은 효율적으로 요청을 처리하고 다양한 기능을 제공할 수 있습니다.

#HTTP 메서드#미들웨어#경로#라우트 핸들러#요청-응답

이 질문 단독 페이지 →

Q7 기초

Node.js에서 콜백(Callback) 함수의 개념과 사용법을 설명해주세요.

힌트 · 다른 함수의 인자로 전달되는 함수로, 비동기 작업 완료 후 실행됩니다.

Node.js에서 콜백 함수는 비동기 프로그래밍의 핵심적인 부분입니다. 간단히 말해, 다른 함수의 인자로 전달되는 함수인데, 특정 작업이 완료된 후에 실행되도록 설계되었습니다.

전체 모범답안 펼치기

Node.js에서 콜백 함수는 비동기 프로그래밍의 핵심적인 부분입니다. 간단히 말해, 다른 함수의 인자로 전달되는 함수인데, 특정 작업이 완료된 후에 실행되도록 설계되었습니다.

예를 들어, 파일 시스템에서 파일을 읽는 함수를 호출할 때, 파일을 읽는 데 시간이 걸릴 수 있습니다. 이 때, 파일을 다 읽은 후에 실행될 코드를 콜백 함수로 전달하는 거죠.

콜백 함수를 사용하면, 파일 읽기가 완료될 때까지 프로그램이 멈추는 것을 방지하고, 다른 작업을 계속 수행할 수 있습니다. 비동기 작업이 끝나면, Node.js는 콜백 함수를 호출하여 결과를 처리하거나 에러를 처리할 수 있게 합니다.

다만, 콜백 함수가 중첩되어 사용될 경우, 코드가 복잡해지는 "콜백 지옥" 문제가 발생할 수 있습니다. 이를 해결하기 위해 Promise나 async/await 같은 패턴을 사용하기도 합니다.

#비동기#함수 호출#제어 역전#에러 처리#콜백 지옥

이 질문 단독 페이지 →

읽기만으론 부족합니다 — 직접 말해보세요

패스잇 앱에서 Node.js 질문에 직접 답하면 AI가 1:1로 답변을 코칭합니다.

Node.js 면접 질문 — 중급

Q8 중급

Express.js에서 미들웨어의 실행 순서와 next() 함수의 역할에 대해 설명해주세요.

힌트 · 미들웨어는 등록 순서대로 실행되며, next()를 호출해야 다음 미들웨어로 제어권이 넘어갑니다.

Express.js에서 미들웨어는 요청이 들어왔을 때 실행되는 함수들의 스택이라고 생각하시면 됩니다. 이 미들웨어들은 app.use()나 app.get(), app.post() 등을 통해 등록된 순서대로 실행됩니다.

전체 모범답안 펼치기

Express.js에서 미들웨어는 요청이 들어왔을 때 실행되는 함수들의 스택이라고 생각하시면 됩니다. 이 미들웨어들은 app.use()나 app.get(), app.post() 등을 통해 등록된 순서대로 실행됩니다.

각 미들웨어는 요청 객체(req), 응답 객체(res), 그리고 next() 함수를 인자로 받습니다. next() 함수는 현재 미들웨어의 작업을 마치고 다음 미들웨어로 제어 흐름을 넘겨주는 역할을 합니다. 만약 next()를 호출하지 않으면 요청은 거기서 멈추게 되고, 응답이 클라이언트로 전송되지 않을 수 있습니다.

예를 들어, 로깅 미들웨어, 인증 미들웨어, 그리고 최종 라우트 핸들러가 있다면, 요청이 들어왔을 때 로깅 미들웨어가 먼저 실행되고, next()를 호출하면 인증 미들웨어가 실행됩니다. 인증이 성공하면 다시 next()를 호출하여 최종 라우트 핸들러가 실행되는 방식으로 진행됩니다.

#미들웨어 스택#요청-응답 주기#next()#실행 순서#제어 흐름

이 질문 단독 페이지 →

Q9 중급

Node.js의 Event Loop과 콜백 큐(Callback Queue)의 동작 원리를 설명해주세요.

힌트 · Event Loop은 콜 스택이 비어있을 때 콜백 큐의 작업을 콜 스택으로 이동시키는 메커니즘입니다.

Node.js는 단일 스레드 기반으로 동작하지만, 비동기 작업을 효율적으로 처리하기 위해 Event Loop와 콜백 큐를 사용합니다.

전체 모범답안 펼치기

Node.js는 단일 스레드 기반으로 동작하지만, 비동기 작업을 효율적으로 처리하기 위해 Event Loop와 콜백 큐를 사용합니다.

Event Loop는 콜 스택과 콜백 큐를 계속해서 감시하며, 콜 스택이 비어있을 때 콜백 큐에 있는 콜백 함수를 콜 스택으로 이동시켜 실행합니다.

콜백 큐는 setTimeout, HTTP 요청 등 비동기 작업이 완료된 후 실행되어야 할 콜백 함수들이 대기하는 공간입니다. 예를 들어, setTimeout(callback, 0)을 호출하면 callback 함수는 바로 실행되는 것이 아니라 콜백 큐에 들어가고, Event Loop에 의해 콜 스택이 비워진 후에 실행됩니다.

이러한 메커니즘 덕분에 Node.js는 I/O 작업이 많은 환경에서도 효율적인 성능을 유지할 수 있습니다.

#단일 스레드#비동기#콜 스택#태스크 큐#이벤트 루프

이 질문 단독 페이지 →

Q10 중급

Promise와 async/await의 차이점과 각각의 사용 시나리오를 비교해주세요.

힌트 · async/await는 Promise 기반의 syntactic sugar로, 동기적인 코드처럼 작성할 수 있게 해줍니다.

Promise와 async/await는 둘 다 비동기 처리를 위한 JavaScript 기능입니다. Promise는 비동기 작업의 성공 또는 실패를 나타내는 객체이고, async/await는 Promise를 더 쉽게…

전체 모범답안 펼치기

Promise와 async/await는 둘 다 비동기 처리를 위한 JavaScript 기능입니다. Promise는 비동기 작업의 성공 또는 실패를 나타내는 객체이고, async/await는 Promise를 더 쉽게 사용할 수 있도록 해주는 문법입니다.

가장 큰 차이점은 가독성입니다. async/await를 사용하면 비동기 코드를 동기 코드처럼 순차적으로 작성할 수 있어서 훨씬 읽기 쉽고 이해하기 쉽습니다. Promise는 .then().catch()를 계속 연결해야 해서 코드가 복잡해질 수 있습니다.

에러 핸들링 측면에서도 async/await가 더 직관적입니다. try...catch 구문을 사용해서 비동기 코드에서 발생하는 에러를 쉽게 잡을 수 있습니다. Promise는 .catch()를 통해 에러를 처리해야 합니다.

사용 시나리오는 다음과 같습니다. 간단한 비동기 작업에는 Promise가 적합할 수 있지만, 복잡한 비동기 로직이나 여러 개의 Promise를 연결해야 하는 경우에는 async/await를 사용하는 것이 코드 가독성을 높이는 데 도움이 됩니다. 결국 async/await는 Promise 기반으로 동작하기 때문에, Promise를 이해하는 것이 중요합니다.

#Promise#async/await#가독성#에러 핸들링#동기적 코드

이 질문 단독 페이지 →

Q11 중급

Express.js에서 에러 핸들링 미들웨어의 특징과 구현 방법을 설명해주세요.

힌트 · 에러 핸들링 미들웨어는 4개의 매개변수(err, req, res, next)를 가지며 마지막에 등록해야 합니다.

Express.js에서 에러 핸들링 미들웨어는 애플리케이션 내에서 발생하는 오류를 중앙 집중적으로 처리하는 데 사용됩니다. 일반 미들웨어와 달리 (err, req, res, next) 네 개의 매개변수를 받습니다.…

전체 모범답안 펼치기

Express.js에서 에러 핸들링 미들웨어는 애플리케이션 내에서 발생하는 오류를 중앙 집중적으로 처리하는 데 사용됩니다. 일반 미들웨어와 달리 (err, req, res, next) 네 개의 매개변수를 받습니다. err 매개변수가 있다는 것이 특징이죠.

에러 핸들링 미들웨어는 미들웨어 체인의 가장 마지막에 등록하는 것이 중요합니다. Express는 위에서부터 아래로 미들웨어를 실행하기 때문에, 에러 핸들링 미들웨어가 먼저 등록되면 다른 미들웨어에서 발생한 에러를 제대로 잡을 수 없습니다.

구현 방법은 간단합니다. 다음과 같이 함수를 정의하고 app.use()를 사용하여 등록하면 됩니다.

app.use((err, req, res, next) => {
  console.error(err.stack); // 에러 로깅
  res.status(500).send('Something broke!'); // 에러 응답
});

next(err)를 호출하면 Express는 에러 핸들링 미들웨어를 찾아서 실행합니다. 이를 통해 애플리케이션 전체에서 발생하는 오류를 일관되게 처리하고, 사용자에게 적절한 응답을 제공할 수 있습니다.

#오류 우선 콜백#next(err)#중앙 집중식 오류 처리#미들웨어 체인#로깅

이 질문 단독 페이지 →

Q12 중급

Node.js에서 Stream의 종류와 각각의 사용 사례를 설명해주세요.

힌트 · Readable, Writable, Transform, Duplex 네 종류가 있으며, 대용량 데이터 처리에 효율적입니다.

Node.js에서 Stream은 데이터를 조각조각 처리할 수 있게 해주는 강력한 도구입니다. 크게 네 가지 종류가 있습니다.

전체 모범답안 펼치기

Node.js에서 Stream은 데이터를 조각조각 처리할 수 있게 해주는 강력한 도구입니다. 크게 네 가지 종류가 있습니다.

첫째, Readable Stream은 데이터를 읽어오는 스트림입니다. 파일 읽기나 HTTP 응답 처리 등에 사용됩니다.

둘째, Writable Stream은 데이터를 쓰는 스트림입니다. 파일 쓰기나 HTTP 요청 전송 등에 활용됩니다.

셋째, Transform Stream은 데이터를 읽고 쓰는 동시에 변환하는 스트림입니다. 압축이나 암호화 등에 사용됩니다.

마지막으로 Duplex Stream은 Readable과 Writable의 기능을 모두 가진 스트림입니다. 소켓 통신 등에 사용됩니다.

Stream을 사용하면 대용량 데이터를 메모리에 한 번에 올리지 않고 효율적으로 처리할 수 있으며, 백프레셔 메커니즘을 통해 데이터 처리 속도를 조절하여 안정적인 시스템을 구축할 수 있습니다.

#Readable#Writable#Duplex#Transform#백프레셔

이 질문 단독 페이지 →

Q13 중급

npm과 yarn의 차이점과 package-lock.json의 역할에 대해 설명해주세요.

힌트 · package-lock.json은 정확한 의존성 버전을 고정하여 일관된 설치를 보장합니다.

npm과 yarn은 모두 Node.js 프로젝트의 의존성 관리를 위한 패키지 매니저입니다. 가장 큰 차이점은 내부적인 동작 방식과 속도에 있습니다. Yarn은 병렬 설치를 통해 npm보다 일반적으로 더 빠른 설치 속…

전체 모범답안 펼치기

npm과 yarn은 모두 Node.js 프로젝트의 의존성 관리를 위한 패키지 매니저입니다. 가장 큰 차이점은 내부적인 동작 방식과 속도에 있습니다. Yarn은 병렬 설치를 통해 npm보다 일반적으로 더 빠른 설치 속도를 제공합니다. 또한, Yarn은 보안에 더 중점을 두어 설계되었습니다.

package-lock.json (npm) 또는 yarn.lock (yarn) 파일은 프로젝트의 의존성 트리를 정확하게 기록하는 역할을 합니다. 이 파일은 특정 시점에 설치된 모든 패키지의 정확한 버전과 의존성 관계를 명시합니다. 이를 통해 개발 환경, 테스트 환경, 배포 환경 등 모든 환경에서 동일한 의존성 버전을 설치하여 일관성을 유지하고, 예기치 않은 오류를 방지할 수 있습니다. 즉, package-lock.json은 프로젝트의 의존성을 "고정"시키는 역할을 한다고 볼 수 있습니다.

#의존성 관리#병렬 설치#결정적 의존성#package-lock.json#yarn.lock

이 질문 단독 페이지 →

Q14 중급

Node.js에서 Buffer 객체의 용도와 문자열과의 차이점을 설명해주세요.

힌트 · Buffer는 바이너리 데이터를 다루기 위한 객체로, 고정 크기 메모리를 할당받습니다.

Node.js에서 Buffer 객체는 이진 데이터를 다루기 위한 핵심적인 객체입니다. JavaScript 문자열은 유니코드 기반인데 반해, Buffer는 원시 바이트 데이터를 직접 저장하고 조작할 수 있습니다.

전체 모범답안 펼치기

Node.js에서 Buffer 객체는 이진 데이터를 다루기 위한 핵심적인 객체입니다. JavaScript 문자열은 유니코드 기반인데 반해, Buffer는 원시 바이트 데이터를 직접 저장하고 조작할 수 있습니다.

Buffer는 고정된 크기의 메모리 공간을 미리 할당받아 사용합니다. 이를 통해 파일 I/O, 네트워크 통신 등에서 효율적인 데이터 처리가 가능합니다. 예를 들어, 이미지 파일이나 암호화된 데이터를 다룰 때 Buffer를 사용하면 문자열 인코딩/디코딩 과정 없이 직접 바이트 단위로 작업할 수 있습니다.

문자열을 Buffer로 변환하거나, Buffer를 문자열로 변환할 때는 인코딩 방식을 지정해야 합니다. 주로 UTF-8, ASCII 등이 사용됩니다. 스트림을 통해 데이터를 읽고 쓸 때도 Buffer가 자주 활용됩니다.

#이진 데이터#메모리 할당#인코딩#문자열 변환#스트림 처리

이 질문 단독 페이지 →

Node.js 면접 질문 — 심화

Q15 심화

Node.js의 Event Loop가 멀티코어 시스템에서 CPU 집약적 작업을 처리할 때의 한계점과 이를 해결하기 위한 Worker Threads의 내부 동작 원리를 설명해주세요.

힌트 · Event Loop는 단일 스레드로 CPU 집약적 작업 시 블로킹되며, Worker Threads는 별도 V8 인스턴스에서 병렬 처리를 통해 해결합니다.

Node.js의 Event Loop는 단일 스레드로 동작하기 때문에 CPU 집약적인 작업을 처리할 때 블로킹이 발생하여 전체 애플리케이션의 응답성을 떨어뜨릴 수 있습니다. 멀티코어 시스템의 장점을 제대로 활용하지 못…

전체 모범답안 펼치기

Node.js의 Event Loop는 단일 스레드로 동작하기 때문에 CPU 집약적인 작업을 처리할 때 블로킹이 발생하여 전체 애플리케이션의 응답성을 떨어뜨릴 수 있습니다. 멀티코어 시스템의 장점을 제대로 활용하지 못하는 거죠.

Worker Threads는 이러한 한계를 극복하기 위해 도입되었습니다. Worker Threads는 메인 스레드와는 별도의 V8 엔진 인스턴스를 생성하여 독립적인 스레드에서 코드를 실행합니다. 메인 스레드는 작업을 Worker Threads에 위임하고, Worker Threads는 병렬적으로 작업을 처리합니다.

Worker Threads 간의 통신은 메시지 큐를 통해 이루어집니다. 메인 스레드와 Worker Threads는 메시지를 주고받으며 데이터를 공유하고 작업을 동기화합니다. 이를 통해 CPU 집약적인 작업을 병렬로 처리하여 Node.js 애플리케이션의 성능을 향상시킬 수 있습니다.

#단일 스레드#CPU 바운드#블로킹#Worker Threads#메시지 큐

이 질문 단독 페이지 →

Q16 심화

Express.js에서 미들웨어 체인이 비동기 에러를 처리할 때 발생할 수 있는 문제점과 async/await 환경에서의 에러 핸들링 전략을 설명해주세요.

힌트 · 비동기 에러는 자동으로 next()로 전달되지 않으므로 express-async-handler나 try-catch로 명시적 처리가 필요합니다.

Express.js 미들웨어 체인에서 비동기 에러는 next()로 자동 전달되지 않는 문제가 있습니다. 일반적인 동기 에러는 Express가 알아서 처리하지만, async/await를 사용하는 경우 try...cat…

전체 모범답안 펼치기

Express.js 미들웨어 체인에서 비동기 에러는 next()로 자동 전달되지 않는 문제가 있습니다. 일반적인 동기 에러는 Express가 알아서 처리하지만, async/await를 사용하는 경우 try...catch 블록으로 감싸거나, express-async-handler 같은 래퍼 함수를 사용해야 합니다.

try...catch를 사용하면 각 미들웨어에서 에러를 잡아 next(err)로 전달할 수 있습니다. express-async-handler는 이 과정을 간편하게 해줍니다.

중앙 집중식 에러 처리를 위해서는 마지막 미들웨어에서 err 인자를 받는 에러 처리 미들웨어를 정의하여 모든 에러를 한 곳에서 처리하는 것이 좋습니다. 이렇게 하면 코드 중복을 줄이고 에러 로깅, 사용자 정의 에러 페이지 표시 등을 일관되게 처리할 수 있습니다.

#미들웨어 체인#에러 핸들링#async/await#next(err)#중앙 집중식 에러 처리

이 질문 단독 페이지 →

Q17 심화

Node.js 애플리케이션에서 메모리 누수가 발생하는 주요 원인들과 Heap Dump 분석을 통한 디버깅 방법을 설명해주세요.

힌트 · 클로저, 이벤트 리스너, 캐시 등이 주요 원인이며, --inspect 플래그와 Chrome DevTools로 분석 가능합니다.

Node.js 애플리케이션에서 메모리 누수는 가비지 컬렉션이 더 이상 사용하지 않는 메모리를 회수하지 못할 때 발생합니다. 주요 원인으로는 첫째, 클로저를 잘못 사용하여 외부 스코프의 변수를 계속 참조하는 경우입니다…

전체 모범답안 펼치기

Node.js 애플리케이션에서 메모리 누수는 가비지 컬렉션이 더 이상 사용하지 않는 메모리를 회수하지 못할 때 발생합니다. 주요 원인으로는 첫째, 클로저를 잘못 사용하여 외부 스코프의 변수를 계속 참조하는 경우입니다. 둘째, 이벤트 리스너를 등록만 하고 해제하지 않아 메모리에 계속 남아있는 경우, 특히 서버나 데이터베이스 연결과 관련된 리스너가 그렇습니다. 셋째, 캐시를 사용할 때 만료 설정을 제대로 하지 않아 메모리가 계속 증가하는 경우도 있습니다.

Heap Dump 분석은 이러한 메모리 누수를 디버깅하는 효과적인 방법입니다. Node.js를 --inspect 플래그로 실행하고 Chrome DevTools를 사용하여 Heap Dump를 생성하고 분석할 수 있습니다. DevTools를 통해 객체의 크기, 참조 관계 등을 파악하여 메모리 누수의 원인을 찾아낼 수 있습니다. 예를 들어, 특정 객체가 예상보다 많이 생성되었거나, 해제되지 않고 계속 유지되는 것을 확인할 수 있습니다.

#가비지 컬렉션#클로저#이벤트 리스너#Heap Dump#메모리 프로파일링

이 질문 단독 페이지 →

Q18 심화

Node.js의 Cluster 모듈과 PM2의 차이점, 그리고 로드 밸런싱 알고리즘별 특성을 비교하여 설명해주세요.

힌트 · Cluster는 내장 모듈로 기본 기능 제공, PM2는 고급 프로세스 관리와 모니터링 기능을 추가로 제공합니다.

Node.js의 Cluster 모듈과 PM2는 모두 Node.js 애플리케이션의 확장성과 안정성을 높이는 데 사용됩니다.

전체 모범답안 펼치기

Node.js의 Cluster 모듈과 PM2는 모두 Node.js 애플리케이션의 확장성과 안정성을 높이는 데 사용됩니다.

Cluster 모듈은 Node.js 내장 모듈로, 싱글 스레드인 Node.js 프로세스를 여러 개 복제하여 멀티 코어 CPU를 활용할 수 있게 해줍니다. 기본적인 로드 밸런싱 기능(라운드 로빈)을 제공하지만, 프로세스 관리나 모니터링 기능은 제한적입니다.

반면 PM2는 Node.js 애플리케이션을 위한 프로세스 관리자입니다. Cluster 모듈의 기능을 포함하면서, 자동 재시작, 로깅, 모니터링, 배포 자동화 등 더 많은 기능을 제공합니다. PM2를 사용하면 애플리케이션의 무중단 배포와 안정적인 운영이 가능합니다.

로드 밸런싱 알고리즘은 여러 종류가 있는데, 대표적으로 라운드 로빈, 가중 라운드 로빈, IP 해시 등이 있습니다. 라운드 로빈은 요청을 순서대로 분배하고, 가중 라운드 로빈은 서버의 성능에 따라 가중치를 부여하여 분배합니다. IP 해시는 클라이언트 IP 주소를 기반으로 특정 서버에 요청을 할당하여 세션 유지가 필요한 경우에 유용합니다. 각 알고리즘은 애플리케이션의 특성과 요구사항에 따라 선택해야 합니다.

#Cluster 모듈#PM2#프로세스 관리#로드 밸런싱#세션 유지

이 질문 단독 페이지 →

Q19 심화

Node.js에서 Stream의 backpressure 현상이 발생하는 원인과 Transform Stream에서 이를 해결하는 방법을 설명해주세요.

힌트 · 데이터 생산 속도가 소비 속도보다 빠를 때 발생하며, drain 이벤트와 highWaterMark 조절로 해결합니다.

Node.js에서 Stream의 backpressure는 데이터 생산 속도가 소비 속도보다 빠를 때 발생합니다. 예를 들어, 읽기 가능한 스트림(Readable)에서 데이터를 빠르게 생성하지만, 쓰기 가능한 스트림(…

전체 모범답안 펼치기

Node.js에서 Stream의 backpressure는 데이터 생산 속도가 소비 속도보다 빠를 때 발생합니다. 예를 들어, 읽기 가능한 스트림(Readable)에서 데이터를 빠르게 생성하지만, 쓰기 가능한 스트림(Writable)이 데이터를 처리하는 속도가 느리면 버퍼가 넘치게 되죠.

Transform Stream에서 backpressure를 해결하는 핵심은 _transform 메서드에서 push를 신중하게 사용하는 것입니다. 데이터를 변환하여 push하기 전에, 쓰기 가능한 스트림의 writableNeedDrain 속성을 확인하여 backpressure가 있는지 확인합니다. 만약 true라면, drain 이벤트를 리스닝하고 이벤트가 발생한 후에 데이터를 push하여 데이터 손실을 방지할 수 있습니다. 또한, highWaterMark 옵션을 조절하여 버퍼 크기를 관리하는 것도 중요합니다.

#backpressure#readable#writable#pipe#drain

이 질문 단독 페이지 →

Q20 심화

Express.js에서 대용량 파일 업로드 시 발생할 수 있는 성능 이슈와 Multer의 메모리/디스크 저장 전략을 설명해주세요.

힌트 · 메모리 저장은 속도는 빠르지만 메모리 부족 위험이 있고, 디스크 저장은 안전하지만 I/O 비용이 발생합니다.

Express.js에서 대용량 파일을 업로드할 때 메모리 부족이나 서버 응답 지연 같은 성능 문제가 발생할 수 있습니다. 파일을 전부 메모리에 올려 처리하면 서버에 부담이 커지기 때문입니다.

전체 모범답안 펼치기

Express.js에서 대용량 파일을 업로드할 때 메모리 부족이나 서버 응답 지연 같은 성능 문제가 발생할 수 있습니다. 파일을 전부 메모리에 올려 처리하면 서버에 부담이 커지기 때문입니다.

Multer는 이런 문제를 해결하기 위해 메모리 또는 디스크 기반 저장 전략을 제공합니다. 메모리 저장은 빠르지만, 파일 크기가 크면 메모리 부족으로 서버가 다운될 수 있습니다. 반면, 디스크 저장은 파일을 디스크에 저장하므로 메모리 부족 위험은 줄지만, 디스크 I/O 때문에 속도가 느려질 수 있습니다.

따라서 파일 크기에 따라 적절한 저장 전략을 선택해야 합니다. 대용량 파일이라면 디스크 기반 저장을 사용하고, 스트리밍 방식으로 파일을 처리하여 메모리 사용량을 최소화하는 것이 좋습니다. 또한, 백프레셔를 활용하여 클라이언트의 업로드 속도를 조절하면 서버의 부담을 줄일 수 있습니다.

#스트리밍#메모리 부족(OOM)#Multer#디스크 기반 저장#백프레셔(Backpressure)

이 질문 단독 페이지 →

Q21 심화

Node.js의 require() 캐싱 메커니즘과 ES6 모듈 시스템의 차이점, 그리고 순환 참조 해결 방법을 설명해주세요.

힌트 · require는 런타임 동적 로딩과 캐싱을, ES6 모듈은 정적 분석과 호이스팅을 지원하며 순환 참조 처리 방식이 다릅니다.

Node.js의 require()와 ES6 모듈은 모듈 시스템이라는 공통점이 있지만, 작동 방식에 차이가 있습니다. require()는 런타임에 동적으로 모듈을 로딩하고, 한 번 로딩된 모듈은 캐싱됩니다. 즉, 같은…

전체 모범답안 펼치기

Node.js의 require()와 ES6 모듈은 모듈 시스템이라는 공통점이 있지만, 작동 방식에 차이가 있습니다. require()는 런타임에 동적으로 모듈을 로딩하고, 한 번 로딩된 모듈은 캐싱됩니다. 즉, 같은 모듈을 여러 번 require()해도 처음 로딩된 모듈의 exports 객체를 재사용합니다.

반면 ES6 모듈은 import/export 구문을 사용하며, 정적 분석을 통해 의존성을 파악합니다. 따라서 런타임 이전에 모듈 관계를 알 수 있고, 호이스팅도 지원합니다.

순환 참조 문제 해결 방식도 다릅니다. require()는 순환 참조가 발생하면 exports 객체가 완전히 초기화되지 않은 상태로 전달될 수 있습니다. 이 경우, exports 객체를 사용하는 시점에 주의해야 합니다. ES6 모듈은 순환 참조를 더 엄격하게 처리하며, 런타임 에러를 발생시킬 수 있습니다. 순환 참조를 해결하려면, 모듈 간의 의존성 구조를 재설계하거나, 필요한 경우에만 모듈을 로딩하는 방식으로 코드를 수정해야 합니다.

#require 캐싱#ES6 모듈#순환 참조#exports 객체#import/export

이 질문 단독 페이지 →

함께 보면 좋은 백엔드 개발 면접 질문

← 전체 면접 질문 카테고리 보기

보유한 Node.js 질문은 이게 전부가 아닙니다

패스잇 앱에는 직무별 면접 질문 수천 개와 모범답안이 담겨 있습니다. AI 모의면접으로 직접 답하고, 약점을 분석받아 보세요.