Node.js 신입 프레임워크 기술면접
새 면접Q. Node.js의 이벤트 루프(Event Loop)가 무엇인지 설명하고, 왜 Node.js가 싱글 스레드임에도 비동기 처리가 가능한지 설명해주세요.
Node.js가 I/O 작업을 처리하는 방식과 콜백 큐의 역할을 생각해보세요.
이벤트 루프는 Node.js의 핵심 메커니즘으로, 비동기 작업을 관리하고 콜백 함수를 실행하는 순환 구조입니다. Node.js는 싱글 스레드로 동작하지만, 파일 읽기나 네트워크 요청 같은 I/O 작업은 libuv 라이브러리를 통해 OS의 커널이나 스레드 풀에 위임합니다. 메인 스레드는 블로킹되지 않고 다른 코드를 계속 실행하며, I/O 작업이 완료되면 콜백이 이벤트 큐에 추가됩니다. 이벤트 루프는 콜 스택이 비어있을 때 큐에서 콜백을 꺼내 실행하여 비동기 처리를 완성합니다.
- • 이벤트 루프는 비동기 작업의 콜백을 관리하는 순환 구조
- • I/O 작업은 libuv를 통해 백그라운드에서 처리
- • 메인 스레드는 블로킹되지 않고 계속 실행
웹 서버에서 수천 개의 동시 요청을 처리할 때 이벤트 루프 덕분에 적은 리소스로 높은 처리량을 달성할 수 있습니다.
이벤트 루프의 각 단계(phase)에 대해 설명할 수 있나요? timers, pending callbacks, poll, check, close callbacks 단계의 역할은 무엇인가요?
Q. Node.js에서 CommonJS 모듈 시스템과 ES Modules의 차이점을 설명하고, 각각의 import/export 방식을 말씀해주세요.
require와 import의 로딩 시점, 그리고 module.exports와 export default의 차이를 생각해보세요.
CommonJS는 Node.js의 전통적인 모듈 시스템으로 require 함수로 모듈을 가져오고 module.exports로 내보냅니다. CommonJS는 동기적으로 모듈을 로드하며 런타임에 동적으로 불러올 수 있습니다. ES Modules는 JavaScript 표준 모듈 시스템으로 import와 export 키워드를 사용하며, 정적으로 분석되어 컴파일 타임에 의존성이 결정됩니다. Node.js에서 ES Modules를 사용하려면 package.json에 type을 module로 설정하거나 파일 확장자를 .mjs로 사용해야 합니다. ES Modules는 트리 쉐이킹이 가능하고 비동기 로딩을 지원하여 최신 프로젝트에서 권장됩니다.
- • CommonJS는 require/module.exports, 동기적 로딩
- • ES Modules는 import/export, 정적 분석
- • ES Modules 사용 시 package.json 설정 필요
최신 프론트엔드 빌드 도구와의 호환성을 위해 라이브러리 개발 시 두 모듈 시스템을 모두 지원하는 경우가 많습니다.
만약 CommonJS와 ES Modules를 같은 프로젝트에서 혼용해야 한다면 어떻게 해야 하나요?
Q. Node.js에서 콜백(Callback), Promise, async/await의 차이점을 설명하고, 각각의 장단점을 비교해주세요.
에러 처리 방식과 코드 가독성, 그리고 콜백 헬 문제를 중심으로 생각해보세요.
콜백은 가장 기본적인 비동기 처리 방식으로 함수의 인자로 전달되어 작업 완료 시 호출되지만, 중첩되면 콜백 헬이 발생하고 에러 처리가 복잡합니다. Promise는 비동기 작업의 성공과 실패를 나타내는 객체로 then과 catch 체이닝을 통해 가독성을 개선하고 에러 처리를 단순화합니다. async/await는 Promise 기반의 문법 설탕으로, 비동기 코드를 동기 코드처럼 작성할 수 있어 가장 직관적이며 try-catch로 에러를 처리합니다. 실무에서는 async/await가 가독성과 유지보수성 면에서 가장 선호되며, 여러 비동기 작업을 병렬 처리할 때는 Promise.all과 함께 사용합니다.
- • 콜백은 기본 방식이지만 콜백 헬 문제 발생
- • Promise는 체이닝으로 가독성 개선
- • async/await는 동기 코드처럼 작성 가능하여 가장 선호됨
API 서버에서 여러 데이터베이스 쿼리를 동시에 실행하고 모든 결과를 기다려야 할 때 async/await와 Promise.all을 함께 사용합니다.
Promise.all, Promise.race, Promise.allSettled의 차이점과 각각 어떤 상황에서 사용하는지 설명해주세요.
Q. Express.js의 미들웨어(Middleware)가 무엇인지 설명하고, 미들웨어의 실행 순서와 next 함수의 역할에 대해 설명해주세요.
요청-응답 사이클에서 미들웨어가 어떻게 체인처럼 연결되는지 생각해보세요.
미들웨어는 Express.js에서 요청과 응답 사이에서 실행되는 함수로, req, res, next 세 개의 매개변수를 받습니다. 미들웨어는 코드에서 app.use나 라우터에 등록된 순서대로 실행되며, 로깅, 인증, 파싱, 에러 처리 등 다양한 작업을 수행합니다. next 함수는 다음 미들웨어로 제어를 넘기는 역할을 하며, next를 호출하지 않으면 요청이 멈춰서 응답을 보내야 합니다. 에러가 발생하면 next에 에러 객체를 전달하여 에러 처리 미들웨어로 건너뛸 수 있습니다. 미들웨어 순서가 중요하며, 예를 들어 body-parser는 라우터보다 먼저 등록되어야 req.body를 사용할 수 있습니다.
- • 미들웨어는 req, res, next를 받는 함수
- • 등록 순서대로 실행되며 next로 제어 전달
- • 미들웨어 순서가 중요하고 에러 처리 미들웨어는 마지막에 위치
API 서버에서 모든 요청에 대해 JWT 토큰 검증을 수행하는 인증 미들웨어를 라우터 앞에 배치하여 보안을 강화합니다.
에러 처리 미들웨어는 일반 미들웨어와 어떻게 다르며, 어떻게 정의하나요?
Q. package.json 파일의 역할과 dependencies와 devDependencies의 차이점을 설명해주세요.
프로덕션 환경과 개발 환경에서 필요한 패키지의 차이를 생각해보세요.
package.json은 Node.js 프로젝트의 메타데이터를 담은 파일로, 프로젝트 이름, 버전, 스크립트, 의존성 패키지 목록 등을 정의합니다. dependencies는 프로덕션 환경에서 실행할 때 필요한 패키지들로, 실제 애플리케이션 동작에 필수적인 라이브러리들이 포함됩니다. devDependencies는 개발 과정에서만 필요한 패키지들로, 테스트 프레임워크, 린터, 빌드 도구 등이 포함됩니다. npm install을 실행하면 두 종류 모두 설치되지만, npm install --production을 사용하면 dependencies만 설치되어 배포 환경의 용량을 줄일 수 있습니다.
- • package.json은 프로젝트 메타데이터와 의존성 관리 파일
- • dependencies는 프로덕션 필수 패키지
- • devDependencies는 개발 전용 패키지
Docker 이미지를 빌드할 때 프로덕션 의존성만 설치하여 이미지 크기를 최소화하고 보안 취약점을 줄입니다.
package-lock.json 파일의 역할은 무엇이며, 왜 버전 관리 시스템에 포함시켜야 하나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!