JavaScript 주니어 개발자 기술면접
새 면접Q. JavaScript에서 var, let, const의 차이점을 스코프, 재할당, 호이스팅 관점에서 설명해주세요.
var는 함수 스코프를 가지며 재할당과 재선언이 가능하고, 호이스팅 시 undefined로 초기화됩니다. let은 블록 스코프를 가지며 재할당은 가능하지만 재선언은 불가능하고, 호이스팅되지만 TDZ(Temporal Dead Zone)로 인해 선언 전 접근이 불가능합니다. const는 let과 동일하게 블록 스코프를 가지지만 재할당이 불가능하며, 선언 시 반드시 초기화해야 합니다. 실무에서는 기본적으로 const를 사용하고, 재할당이 필요한 경우에만 let을 사용하는 것이 권장됩니다.
- • var는 함수 스코프, let/const는 블록 스코프
- • const는 재할당 불가능
- • let/const는 TDZ로 인해 선언 전 접근 불가
- • 실무에서는 const 우선 사용
TDZ(Temporal Dead Zone)가 정확히 무엇이며, 왜 도입되었는지 설명해주세요.
Q. 브라우저에서 CORS(Cross-Origin Resource Sharing) 에러가 발생하는 이유와 이를 해결하기 위한 방법들을 설명해주세요.
CORS 에러는 브라우저의 동일 출처 정책(Same-Origin Policy)으로 인해 발생합니다. 프로토콜, 도메인, 포트 중 하나라도 다르면 다른 출처로 간주되어 리소스 접근이 차단됩니다. 해결 방법으로는 서버에서 Access-Control-Allow-Origin 헤더를 설정하는 방법, 프록시 서버를 중간에 두는 방법, 개발 환경에서는 webpack-dev-server의 proxy 설정을 활용하는 방법이 있습니다. Preflight 요청이 필요한 경우 서버에서 OPTIONS 메서드도 처리해야 합니다.
- • 동일 출처 정책으로 인한 보안 메커니즘
- • 서버에서 CORS 헤더 설정 필요
- • 프록시 서버 활용 가능
- • Preflight 요청 처리 필요
Simple Request와 Preflight Request의 차이점과 각각 어떤 경우에 발생하는지 설명해주세요.
Q. JavaScript에서 debounce와 throttle의 개념을 설명하고, 각각 어떤 상황에서 사용하는 것이 적절한지 예시를 들어주세요.
debounce는 연속적으로 발생하는 이벤트를 그룹화하여 마지막 이벤트가 발생한 후 일정 시간이 지나면 한 번만 실행하는 기법입니다. throttle은 일정 시간 간격으로 최대 한 번만 실행되도록 제한하는 기법입니다. debounce는 검색창의 자동완성처럼 사용자 입력이 끝난 후 API를 호출할 때 적합하고, throttle은 스크롤 이벤트나 리사이즈 이벤트처럼 일정 간격으로 계속 실행되어야 하는 경우에 적합합니다. 둘 다 성능 최적화를 위해 불필요한 함수 호출을 줄이는 목적으로 사용됩니다.
- • debounce는 마지막 이벤트 후 일정 시간 뒤 실행
- • throttle은 일정 시간 간격으로 실행
- • debounce는 검색 자동완성에 적합
- • throttle은 스크롤/리사이즈 이벤트에 적합
lodash 라이브러리 없이 간단한 debounce 함수를 구현한다면 어떤 방식으로 접근하시겠습니까?
Q. JavaScript의 배열 메서드 중 map, filter, reduce의 차이점과 각각의 사용 목적을 설명해주세요.
map은 배열의 각 요소를 변환하여 새로운 배열을 반환하는 메서드로, 원본 배열과 동일한 길이의 배열을 생성할 때 사용합니다. filter는 조건을 만족하는 요소만 선택하여 새로운 배열을 반환하므로, 특정 조건으로 데이터를 걸러낼 때 사용합니다. reduce는 배열의 모든 요소를 순회하며 하나의 값으로 축적(accumulate)하는 메서드로, 합계 계산, 객체 변환, 중첩 배열 평탄화 등 다양한 용도로 활용됩니다. 세 메서드 모두 원본 배열을 변경하지 않는 불변성을 유지합니다.
- • map은 변환, filter는 선택, reduce는 축적
- • 모두 새로운 배열/값을 반환
- • 원본 배열 불변성 유지
- • 함수형 프로그래밍 패러다임
reduce를 사용하여 map이나 filter의 동작을 구현할 수 있는지, 가능하다면 어떻게 접근할 수 있는지 설명해주세요.
Q. 웹 애플리케이션에서 이미지 로딩 최적화를 위해 사용할 수 있는 Lazy Loading 기법을 설명하고, 구현 방법을 말씀해주세요.
Lazy Loading은 뷰포트에 보이지 않는 이미지를 즉시 로드하지 않고, 사용자가 스크롤하여 해당 영역에 도달할 때 로드하는 기법입니다. 초기 페이지 로딩 속도를 개선하고 불필요한 네트워크 대역폭 사용을 줄일 수 있습니다. 구현 방법으로는 img 태그의 loading 속성에 lazy 값을 설정하는 네이티브 방식, Intersection Observer API를 사용하여 요소의 가시성을 감지하는 방식, 또는 react-lazyload 같은 라이브러리를 활용하는 방법이 있습니다. 최신 브라우저에서는 네이티브 lazy loading이 가장 간단하고 효과적입니다.
- • 뷰포트 진입 시점에 이미지 로드
- • 초기 로딩 속도 개선
- • 네이티브 loading 속성 또는 Intersection Observer 활용
- • 네트워크 대역폭 절약
Intersection Observer API의 동작 원리와 threshold 옵션의 역할에 대해 설명해주세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!