Node.js 주니어 기술면접
새 면접Q. Node.js의 package-lock.json 파일의 역할과 생성 시점을 설명하고, 이 파일을 버전 관리 시스템(Git)에 포함시켜야 하는 이유를 설명해주세요.
package-lock.json은 npm install 시 설치된 모든 패키지의 정확한 버전과 의존성 트리를 기록하는 파일로, npm install 명령 실행 시 자동으로 생성됩니다. 이 파일을 Git에 포함시켜야 하는 이유는 팀원들이나 배포 환경에서 동일한 버전의 패키지를 설치하여 일관된 개발 환경을 보장하기 위함입니다. package.json의 버전 범위(^, ~)로 인해 시점에 따라 다른 버전이 설치될 수 있지만, package-lock.json이 있으면 정확히 동일한 버전이 설치됩니다.
- • 의존성 패키지의 정확한 버전 고정
- • npm install 시 자동 생성
- • 팀원 간 동일한 개발 환경 보장
- • 반드시 Git에 커밋해야 함
package-lock.json과 yarn.lock의 차이점은 무엇이며, 프로젝트에서 npm과 yarn을 혼용하면 안 되는 이유는 무엇인가요?
Q. Node.js에서 콜백 지옥(Callback Hell)이 무엇인지 설명하고, 이를 해결하기 위한 방법 3가지를 구체적으로 설명해주세요.
콜백 지옥은 비동기 작업을 처리하기 위해 콜백 함수를 중첩하여 사용할 때 코드의 가독성이 떨어지고 유지보수가 어려워지는 현상을 말합니다. 해결 방법으로는 첫째, Promise를 사용하여 then 체이닝으로 순차 처리를 평탄화할 수 있습니다. 둘째, async/await 문법을 사용하여 동기 코드처럼 작성할 수 있습니다. 셋째, 함수를 분리하여 명명된 함수로 만들어 중첩을 줄이고 재사용성을 높일 수 있습니다.
- • 콜백 중첩으로 인한 가독성 저하
- • Promise 체이닝 사용
- • async/await 문법 활용
- • 함수 분리 및 모듈화
Promise 체이닝에서 에러가 발생했을 때 catch 블록이 어떻게 동작하는지, 그리고 중간에 에러가 발생하면 이후의 then은 실행되는지 설명해주세요.
Q. Express.js에서 app.use()와 app.get(), app.post() 같은 라우팅 메서드의 차이점을 설명하고, app.use()를 사용하는 대표적인 경우를 설명해주세요.
app.use()는 HTTP 메서드에 관계없이 모든 요청에 대해 실행되는 미들웨어를 등록하는 메서드이며, 경로를 지정하지 않으면 모든 경로에 적용됩니다. 반면 app.get(), app.post() 등은 특정 HTTP 메서드와 경로에 대한 라우트 핸들러를 등록합니다. app.use()는 주로 전역 미들웨어(body-parser, cors, 로깅 등)를 등록하거나, 특정 경로의 라우터를 마운트할 때 사용됩니다. 예를 들어 app.use('/api', apiRouter)처럼 라우터를 그룹화할 때 활용됩니다.
- • app.use()는 모든 HTTP 메서드에 적용
- • 라우팅 메서드는 특정 메서드와 경로에만 적용
- • 전역 미들웨어 등록에 사용
- • 라우터 마운트 및 그룹화
미들웨어의 실행 순서는 어떻게 결정되며, next() 함수를 호출하지 않으면 어떤 일이 발생하나요?
Q. SQL Injection 공격이 무엇인지 설명하고, Node.js에서 데이터베이스 쿼리를 실행할 때 이를 방지하기 위한 방법을 구체적으로 설명해주세요.
SQL Injection은 사용자 입력값을 검증 없이 SQL 쿼리에 직접 삽입할 때, 악의적인 SQL 코드를 주입하여 데이터베이스를 조작하거나 정보를 탈취하는 공격 기법입니다. 방지 방법으로는 첫째, Prepared Statement나 Parameterized Query를 사용하여 쿼리와 데이터를 분리합니다. 둘째, ORM(Sequelize, TypeORM 등)을 사용하면 자동으로 이스케이핑 처리됩니다. 셋째, 사용자 입력값에 대한 유효성 검증과 화이트리스트 방식의 필터링을 적용합니다. 절대 문자열 연결로 쿼리를 만들어서는 안 됩니다.
- • 악의적인 SQL 코드 주입 공격
- • Prepared Statement 사용
- • ORM 프레임워크 활용
- • 입력값 검증 및 이스케이핑
NoSQL 데이터베이스인 MongoDB를 사용할 때도 Injection 공격이 가능한가요? 가능하다면 어떻게 방지해야 하나요?
Q. Node.js에서 require()로 모듈을 불러올 때 캐싱이 어떻게 동작하는지 설명하고, 이것이 애플리케이션 성능과 메모리에 어떤 영향을 주는지 설명해주세요.
Node.js는 require()로 모듈을 처음 로드할 때 해당 모듈을 실행하고 그 결과를 require.cache 객체에 저장합니다. 이후 동일한 모듈을 require()하면 캐시된 객체를 반환하므로 모듈 코드가 재실행되지 않습니다. 이는 성능 면에서 파일 I/O와 코드 파싱을 반복하지 않아 효율적이며, 메모리 면에서는 모듈 인스턴스를 싱글톤처럼 공유하여 중복 생성을 방지합니다. 단, 모듈이 상태를 가지면 여러 곳에서 공유되므로 주의가 필요합니다.
- • require.cache에 모듈 캐싱
- • 동일 모듈은 한 번만 실행
- • 파일 I/O 및 파싱 비용 절감
- • 싱글톤 패턴처럼 인스턴스 공유
require.cache를 직접 조작하여 모듈 캐시를 삭제하는 것이 실무에서 권장되지 않는 이유는 무엇인가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!