시니어 풀스택 개발자 면접 질문과 답변

Milad Bonakdar
작성자
React, Node.js, 아키텍처, 데이터베이스, 보안, DevOps, 프로덕션 의사결정을 다루는 시니어 풀스택 면접 질문으로 준비하세요.
소개
시니어 풀스택 면접은 문법 지식만 보지 않습니다. 프론트엔드 성능, API 설계, 데이터 모델링, 안정성, 보안, 배포 선택, 그리고 실제로 운영한 시스템에서의 기술적 트레이드오프를 설명할 수 있어야 합니다.
이 질문들은 간결한 답변을 연습하고 실제 프로젝트와 연결하는 데 사용하세요. 무엇을 선택했는지, 왜 그 제약에 맞았는지, 무엇이 문제였는지, 지금이라면 무엇을 개선할지까지 말할 수 있어야 합니다.
이 가이드를 활용하는 방법
- React, Node.js, 인증, 시스템 설계부터 시작하세요. 시니어 면접에서 자주 나오는 주제입니다.
- 각 답변을 본인의 경험으로 짧게 구성하세요: 상황, 결정, 트레이드오프, 결과.
- 도구 목록을 외우는 데 그치지 마세요. 시니어 후보자는 판단력, 디버깅 방식, 프로덕션 ownership으로 평가받습니다.
프론트엔드 개발 (6개 질문)
1. React의 Virtual DOM과 Reconciliation 알고리즘에 대해 설명하십시오.
답변: Virtual DOM은 실제 DOM의 경량 JavaScript 표현입니다. React는 이를 사용하여 업데이트를 최적화합니다.
- 프로세스: 상태가 변경되면 React는 새로운 Virtual DOM 트리를 만들고 이전 트리와 비교합니다(diffing).
- Reconciliation: React의 알고리즘은 필요한 최소한의 변경 사항을 식별하고 실제 DOM의 해당 부분만 업데이트합니다.
- 핵심 최적화:
keyprops를 사용하면 React가 목록에서 변경, 추가 또는 제거된 항목을 식별하는 데 도움이 되어 Reconciliation이 더욱 효율적으로 이루어집니다. - Fiber 아키텍처: 최신 React는 렌더링 작업을 청크로 나누고 업데이트의 우선 순위를 지정할 수 있는 Fiber를 사용합니다.
희귀도: 매우 흔함 난이도: 중간
2. React Hooks는 무엇이며 왜 도입되었습니까?
답변: Hooks는 함수형 컴포넌트에서 상태 및 기타 React 기능을 사용할 수 있도록 하는 함수입니다.
- 동기: Hooks 이전에는 상태 저장 로직에 클래스 컴포넌트가 필요했습니다. Hooks를 사용하면 컴포넌트 계층 구조를 변경하지 않고도 상태 저장 로직을 재사용할 수 있습니다.
- 일반적인 Hooks:
useState: 로컬 상태 관리useEffect: 부작용 처리 (데이터 가져오기, 구독)useContext: 컨텍스트 값 액세스useMemo/useCallback: 성능 최적화
- 커스텀 Hooks: 커스텀 Hooks를 만들어 컴포넌트 로직을 추출하고 재사용할 수 있습니다.
희귀도: 매우 흔함 난이도: 쉬움
3. React 애플리케이션 성능을 어떻게 최적화합니까?
답변: 여러 전략을 통해 React 성능을 향상시킬 수 있습니다.
- 코드 분할:
React.lazy()및Suspense를 사용하여 요청 시 컴포넌트를 로드합니다. - Memoization: 컴포넌트에는
React.memo(), 비용이 많이 드는 계산에는useMemo(), 함수 참조에는useCallback()을 사용합니다. - Virtual Lists: 긴 목록의 경우
react-window또는react-virtualized와 같은 라이브러리를 사용합니다. - 인라인 함수 피하기: 렌더링 메서드에서 각 렌더링 시 새로운 참조를 생성하기 때문입니다.
- Profiler: React DevTools Profiler를 사용하여 병목 현상을 식별합니다.
- 상태 관리: 상태를 가능한 한 로컬로 유지하고 컨텍스트를 현명하게 사용합니다.
희귀도: 흔함 난이도: 중간
4. 서버 측 렌더링 (SSR)과 클라이언트 측 렌더링 (CSR)의 차이점을 설명하십시오.
답변:
- CSR: JavaScript는 브라우저에서 실행되어 페이지를 렌더링합니다. 초기 HTML은 최소화됩니다. 후속 탐색은 빠르지만 초기 로드가 느리고 SEO가 좋지 않습니다.
- SSR: 서버는 각 요청에 대한 전체 HTML을 생성합니다. SEO가 더 좋고 초기 페인트가 더 빠르지만 후속 탐색이 느리고 서버 부하가 더 높습니다.
- 하이브리드 접근 방식:
- 정적 사이트 생성 (SSG): 빌드 시 페이지를 미리 렌더링합니다 (Next.js, Gatsby).
- 점진적 정적 재생성 (ISR): 전체 재구축 없이 배포 후 정적 페이지를 업데이트합니다.
희귀도: 흔함 난이도: 중간
5. localStorage, sessionStorage 및 Cookies의 차이점은 무엇입니까?
답변:
- localStorage: 만료 없이 데이터를 유지합니다. ~5-10MB 제한. 서버로 자동 전송되지 않습니다.
- sessionStorage: localStorage와 동일하지만 탭/브라우저가 닫히면 지워집니다.
- Cookies: 모든 HTTP 요청과 함께 전송되는 작은 데이터 (~4KB). 만료를 설정할 수 있습니다. 인증 토큰에 사용됩니다.
- 보안: 쿠키는
HttpOnly(JS를 통해 액세스할 수 없음) 및Secure(HTTPS만 해당)일 수 있습니다. 민감한 데이터에 사용합니다.
희귀도: 흔함 난이도: 쉬움
6. CSS-in-JS는 어떻게 작동하며 장단점은 무엇입니까?
답변: CSS-in-JS 라이브러리 (styled-components, Emotion)를 사용하면 JavaScript에서 직접 CSS를 작성할 수 있습니다.
- 장점:
- 범위가 지정된 스타일 (전역 네임스페이스 오염 없음)
- props를 기반으로 한 동적 스타일 지정
- 자동 벤더 프리픽싱
- 데드 코드 제거
- 단점:
- 런타임 오버헤드 (런타임에 스타일 생성)
- 더 큰 번들 크기
- 학습 곡선
- 대안: CSS Modules, Tailwind CSS, BEM 방법론을 사용한 기존 CSS.
희귀도: 중간 난이도: 중간
백엔드 개발 (6개 질문)
7. Node.js에서 Event Loop를 설명하십시오.
답변: Node.js는 단일 스레드이지만 이벤트 루프를 통해 동시성을 처리합니다.
- 단계:
- 타이머:
setTimeout및setInterval콜백 실행 - 보류 중인 콜백: 다음 반복으로 연기된 I/O 콜백
- 폴: 새 I/O 이벤트 검색, I/O 콜백 실행
- 확인:
setImmediate콜백 - 닫기 콜백: 소켓 닫기 이벤트
- 타이머:
- Non-blocking I/O: I/O 작업이 시작되면 Node.js는 이를 시스템 커널에 위임하고 다른 코드 실행을 계속합니다.
희귀도: 매우 흔함 난이도: 어려움
8. Express.js에서 Middleware는 무엇입니까?
답변: 미들웨어 함수는 애플리케이션의 요청-응답 주기에서 요청, 응답 및 다음 미들웨어 함수에 액세스할 수 있습니다.
- 유형:
- 애플리케이션 수준:
app.use() - 라우터 수준:
router.use() - 오류 처리: 4개의 매개변수
(err, req, res, next)가 있습니다. - 내장:
express.json(),express.static() - 타사:
cors,helmet,morgan
- 애플리케이션 수준:
- 순서가 중요합니다: 미들웨어는 정의된 순서대로 실행됩니다.
희귀도: 매우 흔함 난이도: 쉬움
9. REST API에서 인증을 어떻게 처리합니까?
답변: 여러 접근 방식이 있습니다.
- JWT (Stateless):
- 서버는 사용자 정보가 포함된 서명된 토큰을 생성합니다.
- 클라이언트는 토큰을 저장하고 (localStorage/cookie) 각 요청과 함께 보냅니다.
- 서버는 서명을 확인합니다.
- 장점: 확장 가능, 서버 측 세션 저장소 없음
- 단점: 해지하기 어려움, 더 큰 페이로드
- 세션 기반 (Stateful):
- 서버는 세션을 만들고 DB/Redis에 저장합니다.
- 클라이언트는 쿠키에서 세션 ID를 받습니다.
- 장점: 해지하기 쉬움
- 단점: 서버 측 저장소가 필요함
- OAuth 2.0: 타사 인증용
- 모범 사례: 장기 액세스에는 리프레시 토큰을 사용하고 단기 액세스에는 액세스 토큰을 사용합니다.
희귀도: 매우 흔함 난이도: 중간
10. 데이터베이스 트랜잭션 및 ACID 속성에 대해 설명하십시오.
답변: 트랜잭션은 단일 논리 작업 단위로 수행되는 일련의 작업입니다.
- ACID:
- 원자성: 모든 작업이 성공하거나 모두 실패합니다 (전부 아니면 전무).
- 일관성: 데이터베이스가 유효한 상태에서 다른 유효한 상태로 이동합니다.
- 격리: 동시 트랜잭션이 서로 간섭하지 않습니다.
- 지속성: 커밋된 트랜잭션은 시스템 오류 후에도 유지됩니다.
- 격리 수준: Read Uncommitted, Read Committed, Repeatable Read, Serializable (일관성과 성능 간의 절충).
희귀도: 흔함 난이도: 중간
11. SQL과 NoSQL 데이터베이스의 차이점은 무엇입니까?
답변:
- SQL (관계형):
- 구조화된 스키마, 행/열이 있는 테이블
- ACID 준수
- 수직적 확장 (더 큰 서버)
- 예: PostgreSQL, MySQL
- 사용 사례: 복잡한 쿼리, 트랜잭션, 구조화된 데이터
- NoSQL:
- 유연한 스키마, 문서/키-값/그래프/열-패밀리
- BASE (결과적 일관성)
- 수평적 확장 (더 많은 서버)
- 예: MongoDB, Redis, Cassandra
- 사용 사례: 빠른 개발, 대규모 확장, 비정형 데이터
희귀도: 흔함 난이도: 쉬움
12. SQL Injection 공격을 어떻게 방지합니까?
답변: SQL Injection은 사용자 입력이 SQL 쿼리에 직접 연결될 때 발생합니다.
- 예방:
- 매개변수화된 쿼리/준비된 명령문: 사용자 입력에 대한 자리 표시자 사용
- ORM: Sequelize, TypeORM과 같은 라이브러리는 자동으로 이스케이프를 처리합니다.
- 입력 유효성 검사: 허용된 문자 화이트리스트
- 최소 권한: 데이터베이스 사용자는 최소 권한을 가져야 합니다.
- 저장 프로시저: 추가 레이어를 제공할 수 있습니다.
희귀도: 매우 흔함 난이도: 쉬움
시스템 설계 및 아키텍처 (6개 질문)
13. 확장 가능한 알림 시스템을 어떻게 설계하시겠습니까?
답변: 알림 시스템은 여러 채널 (이메일, SMS, 푸시)을 대규모로 처리해야 합니다.
- 구성 요소:
- API 서비스: 알림 요청 수신
- 메시지 큐: 비동기 처리를 위한 RabbitMQ/Kafka
- 작업자: 각 채널에 대한 별도의 서비스
- 데이터베이스: 알림 기록, 사용자 기본 설정 저장
- 속도 제한: 스팸 방지
- 고려 사항:
- 실패에 대한 재시도 로직
- 긴급 알림에 대한 우선 순위 큐
- 템플릿 관리
- 사용자 기본 설정 (옵트 아웃)
희귀도: 흔함 난이도: 어려움
14. 마이크로 서비스 아키텍처와 그 과제에 대해 설명하십시오.
답변: 마이크로 서비스는 애플리케이션을 작고 독립적인 서비스로 분해합니다.
- 장점:
- 독립적인 배포 및 확장
- 기술 다양성
- 결함 격리
- 팀 자율성
- 과제:
- 분산 트랜잭션: 서비스 간 일관성을 유지하기 어려움
- 네트워크 대기 시간: 서비스 간 통신 오버헤드
- 모니터링: 분산 추적 필요 (Jaeger, Zipkin)
- 데이터 관리: 각 서비스는 자체 데이터베이스를 소유합니다.
- 테스트: 통합 테스트가 복잡합니다.
- 패턴: API 게이트웨이, 서비스 메시, 회로 차단기, 트랜잭션용 Saga 패턴.
희귀도: 매우 흔함 난이도: 어려움
15. 캐싱이란 무엇이며 일반적인 캐싱 전략은 무엇입니까?
답변: 캐싱은 자주 액세스하는 데이터를 빠른 저장소에 저장하여 대기 시간을 줄입니다.
- 계층:
- 브라우저 캐시
- CDN (CloudFlare, Akamai)
- 애플리케이션 캐시 (Redis, Memcached)
- 데이터베이스 쿼리 캐시
- 전략:
- Cache-Aside: 앱이 먼저 캐시를 확인하고 누락 시 DB에서 로드합니다.
- Write-Through: 캐시와 DB에 동시에 쓰기
- Write-Behind: 캐시에 쓰기, DB에 비동기 쓰기
- Read-Through: 캐시가 DB에서 자동으로 데이터를 로드합니다.
- 제거 정책: LRU (Least Recently Used), LFU (Least Frequently Used), TTL (Time To Live).
희귀도: 매우 흔함 난이도: 중간
16. API 버전을 어떻게 보장합니까?
답변: API 버전을 사용하면 변경 시 이전 버전과의 호환성을 유지할 수 있습니다.
- 전략:
- URI 버전:
/api/v1/users,/api/v2/users - 헤더 버전:
Accept: application/vnd.api.v1+json - 쿼리 매개변수:
/api/users?version=1
- URI 버전:
- 모범 사례:
- 더 이상 사용되지 않는다는 경고
- 최소 2개의 버전 유지
- 명확한 마이그레이션 가이드
- 시맨틱 버전 관리
- GraphQL 대안: 버전 관리 없이 스키마 진화 (더 이상 사용되지 않는 필드).
희귀도: 흔함 난이도: 중간
17. CAP 정리를 설명하십시오.
답변: 분산 시스템에서는 3가지 중 2가지만 보장할 수 있습니다.
- 일관성: 모든 노드가 동시에 동일한 데이터를 봅니다.
- 가용성: 모든 요청이 응답을 받습니다 (성공/실패).
- 파티션 내성: 네트워크 오류에도 불구하고 시스템이 계속 작동합니다.
- 현실: 네트워크 파티션이 발생하므로 CP (일관성) 또는 AP (가용성) 중에서 선택해야 합니다.
- 예:
- CP: MongoDB, HBase (파티션 중 가용성 희생)
- AP: Cassandra, DynamoDB (결과적 일관성)
희귀도: 흔함 난이도: 어려움
18. 로드 밸런싱이란 무엇이며 어떤 알고리즘이 사용됩니까?
답변: 로드 밸런싱은 여러 서버에 트래픽을 분산시킵니다.
- 알고리즘:
- 라운드 로빈: 순차적 분배
- 최소 연결: 활성 연결이 가장 적은 서버로 전송
- IP 해시: 클라이언트 IP를 해시하여 서버 결정 (세션 지속성)
- 가중 라운드 로빈: 용량이 더 큰 서버가 더 많은 요청을 받습니다.
- 유형:
- 레이어 4 (전송): IP/포트 기반, 더 빠름
- 레이어 7 (애플리케이션): 콘텐츠 (URL, 헤더) 기반, 더 스마트함
- 도구: Nginx, HAProxy, AWS ELB, Google Cloud Load Balancer.
희귀도: 흔함 난이도: 중간
DevOps 및 클라우드 (4개 질문)
19. Docker 및 컨테이너화 이점에 대해 설명하십시오.
답변: Docker는 애플리케이션을 해당 종속성과 함께 컨테이너에 패키징합니다.
- 이점:
- 일관성: 개발/스테이징/프로덕션에서 동일한 환경
- 격리: 각 컨테이너가 격리됨
- 경량: 호스트 OS 커널 공유 (VM과 비교)
- 빠른 시작: VM의 경우 몇 분 대 몇 초
- 이식성: Docker가 설치된 모든 곳에서 실행
- 구성 요소:
- 이미지: 읽기 전용 템플릿
- 컨테이너: 이미지의 실행 중인 인스턴스
- Dockerfile: 이미지를 빌드하기 위한 지침
- 레지스트리: Docker Hub, 개인 레지스트리
희귀도: 매우 흔함 난이도: 쉬움
20. CI/CD란 무엇이며 왜 중요합니까?
답변:
- 지속적 통합: 개발자는 코드를 자주 병합하고 각 커밋 시 자동화된 테스트가 실행됩니다.
- 지속적 배포: 테스트 통과 후 자동으로 프로덕션에 배포
- 이점:
- 더 빠른 피드백
- 통합 문제 감소
- 더 높은 품질의 코드
- 더 빠른 출시 시간
- 도구: Jenkins, GitLab CI, GitHub Actions, CircleCI
- 파이프라인 단계: 빌드 → 테스트 → 배포
- 모범 사례: 자동화된 테스트, 기능 플래그, 롤백 메커니즘.
희귀도: 매우 흔함 난이도: 쉬움
21. 프로덕션 애플리케이션을 어떻게 모니터링하고 디버깅합니까?
답변: 종합적인 모니터링은 프로덕션 시스템에 매우 중요합니다.
- 로깅:
- 구조화된 로깅 (JSON 형식)
- 중앙 집중식 로깅 (ELK 스택, Splunk)
- 로그 수준 (ERROR, WARN, INFO, DEBUG)
- 메트릭:
- 애플리케이션 메트릭 (응답 시간, 처리량)
- 인프라 메트릭 (CPU, 메모리, 디스크)
- 도구: Prometheus, Grafana, DataDog
- 추적:
- 마이크로 서비스에 대한 분산 추적
- 도구: Jaeger, Zipkin, AWS X-Ray
- 경고: 중요한 문제에 대한 PagerDuty, Opsgenie
- 오류 추적: 예외 모니터링을 위한 Sentry, Rollbar.
희귀도: 흔함 난이도: 중간
22. Infrastructure as Code (IaC)란 무엇입니까?
답변: IaC는 수동 프로세스 대신 코드를 통해 인프라를 관리합니다.
- 이점:
- 인프라에 대한 버전 관리
- 재현 가능한 환경
- 더 빠른 프로비저닝
- 인적 오류 감소
- 도구:
- Terraform: 클라우드에 구애받지 않음, 선언적
- CloudFormation: AWS 전용
- Ansible: 구성 관리
- Pulumi: 프로그래밍 언어 사용
- 모범 사례:
- 버전 제어에 저장
- 모듈식, 재사용 가능한 구성 요소
- 별도의 환경 (개발/스테이징/프로덕션)
- 인프라의 자동화된 테스트.
희귀도: 중간 난이도: 중간
테스트 및 모범 사례 (3개 질문)
23. 테스트 피라미드를 설명하십시오.
답변: 테스트 피라미드는 다양한 테스트 유형의 이상적인 분포를 나타냅니다.
- 단위 테스트: 개별 함수/컴포넌트를 격리하여 테스트합니다. 빠르고 많습니다.
- 통합 테스트: 컴포넌트가 함께 작동하는 방식을 테스트합니다. 중간 속도, 적당한 수.
- E2E 테스트: 전체 사용자 흐름을 테스트합니다. 느리고 비용이 많이 들며 적습니다.
- 근거: 단위 테스트는 빠르고 버그를 조기에 잡기 때문에 더 많습니다. E2E 테스트는 느리고 깨지기 쉽기 때문에 더 적습니다.
희귀도: 흔함 난이도: 쉬움
24. SOLID 원칙은 무엇입니까?
답변: SOLID는 5가지 설계 원칙의 약어입니다.
- S - 단일 책임: 클래스는 변경해야 할 이유가 하나만 있어야 합니다.
- O - 개방/폐쇄: 확장에 개방, 수정에 폐쇄
- L - 리스코프 치환: 하위 유형은 기본 유형으로 대체 가능해야 합니다.
- I - 인터페이스 분리: 하나의 일반적인 인터페이스보다 많은 특정 인터페이스가 더 좋습니다.
- D - 의존성 역전: 구체적인 것이 아닌 추상화에 의존합니다.
- 이점: 더 유지 관리 가능하고 테스트 가능하며 유연한 코드.
희귀도: 흔함 난이도: 중간
25. 비동기 JavaScript에서 오류를 어떻게 처리합니까?
답변: 비동기 오류 처리에 대한 여러 패턴이 있습니다.
- 프로미스:
- Async/Await:
- 전역 오류 처리기:
- 처리되지 않은 프로미스 거부에 대한
window.addEventListener('unhandledrejection', ...) - 백엔드에 대한 Express 오류 미들웨어
- 처리되지 않은 프로미스 거부에 대한
- 모범 사례: 항상 오류를 처리하고, 중앙 집중식 오류 처리를 사용하고, 오류를 적절하게 기록합니다.
희귀도: 매우 흔함 난이도: 쉬움


