React 미드레벨 기술면접

React 미드레벨 (3~7년) 종합 5문항 조회수 46 · 2026-07-11 (토) 03:11:00
1 React 렌더링 최적화
Medium

Q. React에서 부모 컴포넌트가 리렌더링될 때 자식 컴포넌트도 함께 리렌더링되는 기본 동작을 설명하고, key prop이 리스트 렌더링에서 성능에 미치는 영향을 설명해주세요. 특히 index를 key로 사용했을 때 발생할 수 있는 문제점과, 적절한 key 선택 기준을 실무 사례와 함께 말씀해주세요.

A. 모범답안

React는 기본적으로 부모가 리렌더링되면 모든 자식도 리렌더링됩니다. key prop은 React가 리스트의 어떤 항목이 변경, 추가, 삭제되었는지 식별하는 데 사용됩니다. index를 key로 사용하면 항목의 순서가 변경되거나 중간에 삽입/삭제될 때 React가 컴포넌트를 잘못 재사용하여 상태가 꼬이거나 불필요한 DOM 조작이 발생합니다. key는 항목의 고유 식별자(ID)를 사용해야 하며, 없다면 항목의 내용을 기반으로 한 안정적인 해시값을 생성해야 합니다. 정렬, 필터링이 자주 발생하는 리스트에서는 절대 index를 key로 사용하지 않아야 합니다.

핵심 포인트
  • • React의 기본 리렌더링 동작과 reconciliation 과정
  • • key prop이 없거나 index를 사용할 때의 성능 및 버그 문제
  • • 고유 ID를 key로 사용해야 하는 이유와 실무 적용 기준
  • • 리스트 항목의 순서 변경, 삽입, 삭제 시나리오별 영향
Follow-up 질문

만약 서버에서 받은 데이터에 고유 ID가 없고, 클라이언트에서 생성해야 한다면 어떤 방식으로 ID를 생성하시겠습니까? uuid 라이브러리를 사용하는 것과 단순 카운터를 사용하는 것의 차이점은 무엇인가요?

2 React 상태 관리
Hard

Q. React에서 여러 컴포넌트가 구독하는 전역 상태가 변경될 때, 해당 상태를 사용하지 않는 컴포넌트까지 리렌더링되는 문제를 겪은 적이 있나요? Context API의 이런 한계를 극복하기 위해 Zustand나 Jotai 같은 라이브러리들이 사용하는 selector 패턴과 구독 메커니즘을 설명하고, 직접 구현한다면 어떤 방식으로 설계하시겠습니까?

A. 모범답안

Context API는 value가 변경되면 모든 Consumer가 리렌더링되는 구조적 한계가 있습니다. Zustand 같은 라이브러리는 외부 store를 사용하고, 각 컴포넌트가 필요한 상태 조각만 selector로 구독하는 방식으로 동작합니다. 내부적으로는 useSyncExternalStore를 사용하거나 subscription 패턴으로 상태 변경을 감지하고, 이전 값과 새 값을 비교(shallow equal)하여 실제로 변경된 경우에만 리렌더링을 트리거합니다. 직접 구현한다면 외부 store 객체, subscribe/unsubscribe 메서드, 그리고 selector 함수를 받아 해당 부분만 비교하는 custom hook을 만들 것입니다.

핵심 포인트
  • • Context API의 리렌더링 문제와 구조적 한계
  • • 외부 store와 subscription 패턴의 동작 원리
  • • selector를 통한 부분 구독과 shallow comparison
  • • useSyncExternalStore API의 역할과 사용법
Follow-up 질문

React 18의 useSyncExternalStore가 도입된 배경과, Concurrent Rendering 환경에서 외부 store를 안전하게 사용하기 위해 이 API가 해결하는 tearing 문제에 대해 설명해주세요.

3 네트워크 및 API 설계
Medium

Q. React 애플리케이션에서 API 응답을 캐싱할 때, HTTP 캐시 헤더(Cache-Control, ETag, Last-Modified)와 클라이언트 측 캐싱 전략(메모리 캐시, 스토리지 캐시)을 어떻게 조합하여 사용하시겠습니까? 특히 stale-while-revalidate 패턴의 동작 원리와 실무 적용 사례를 설명해주세요.

A. 모범답안

HTTP 캐시 헤더는 브라우저와 CDN 레벨에서 동작하며, Cache-Control로 캐시 수명을 제어하고 ETag로 조건부 요청을 구현합니다. 클라이언트 측에서는 React Query나 SWR을 사용하여 메모리에 데이터를 캐싱하고, stale-while-revalidate 패턴으로 stale 데이터를 즉시 보여주면서 백그라운드에서 재검증합니다. 이 패턴은 사용자에게 빠른 응답을 제공하면서도 데이터 신선도를 유지합니다. 실무에서는 자주 변경되지 않는 마스터 데이터는 긴 캐시 수명을, 실시간성이 중요한 데이터는 짧은 staleTime을 설정합니다.

핵심 포인트
  • • HTTP 캐시 헤더의 종류와 동작 방식
  • • stale-while-revalidate 패턴의 원리와 장점
  • • 브라우저 캐시와 애플리케이션 레벨 캐시의 차이
  • • 데이터 특성에 따른 캐싱 전략 선택 기준
Follow-up 질문

304 Not Modified 응답이 반환되는 과정과, 이를 활용한 대역폭 절약 효과를 설명해주세요. 또한 POST 요청 후 GET 캐시를 무효화하는 전략은 어떻게 구현하시겠습니까?

4 자료구조 및 알고리즘
Hard

Q. React 애플리케이션에서 실시간으로 업데이트되는 대량의 알림 데이터를 관리해야 합니다. 새 알림 추가, 읽음 처리, 오래된 알림 자동 삭제, 우선순위별 정렬이 필요한 상황에서 어떤 자료구조를 조합하여 사용하시겠습니까? 각 연산의 시간 복잡도를 분석하고, 메모리 효율성까지 고려한 설계를 제시해주세요.

A. 모범답안

알림 ID를 키로 하는 Map으로 O(1) 조회와 읽음 처리를 구현하고, 우선순위별 정렬을 위해 최소 힙(Min Heap) 또는 배열과 이진 탐색을 조합합니다. 새 알림 추가는 Map에 O(1), 힙에 O(log n)으로 처리됩니다. 오래된 알림 삭제는 타임스탬프 기반 힙을 사용하여 가장 오래된 항목을 O(log n)에 제거하거나, 주기적 배치 처리로 필터링합니다. 메모리 효율성을 위해 일정 개수 이상의 알림은 로컬 스토리지나 서버로 오프로드하고, 화면에 보이는 최근 N개만 메모리에 유지합니다. 읽음 처리된 알림은 별도 Set으로 관리하여 빠른 확인이 가능하도록 합니다.

핵심 포인트
  • • Map을 사용한 O(1) 조회 및 업데이트 구현
  • • 힙 자료구조를 활용한 우선순위 관리와 시간 복잡도
  • • 메모리 제한을 고려한 데이터 오프로딩 전략
  • • 읽음 상태 관리를 위한 Set 활용과 복합 자료구조 설계
Follow-up 질문

만약 알림이 초당 100개씩 들어오는 고빈도 업데이트 상황이라면, React 컴포넌트의 리렌더링 성능을 어떻게 최적화하시겠습니까? 상태 업데이트 배칭과 가상화 기법을 함께 설명해주세요.

5 코드 리뷰 및 리팩토링
Medium

Q. 코드 리뷰에서 컴포넌트 내부에 많은 비즈니스 로직이 포함되어 있고, API 호출, 데이터 변환, 유효성 검증이 모두 섞여 있는 코드를 발견했습니다. 이를 관심사의 분리(Separation of Concerns) 원칙에 따라 리팩토링한다면 어떤 레이어로 분리하시겠습니까? 각 레이어의 역할과 테스트 용이성 개선 효과를 설명해주세요.

A. 모범답안

컴포넌트는 UI 렌더링과 사용자 인터랙션만 담당하도록 하고, 비즈니스 로직은 Custom Hook으로 분리합니다. API 호출은 별도의 service 레이어나 api 모듈로 추상화하고, 데이터 변환 로직은 순수 함수로 분리하여 utils나 transformers 폴더에 배치합니다. 유효성 검증은 별도의 validator 함수나 schema(Zod, Yup)로 분리합니다. 이렇게 분리하면 각 레이어를 독립적으로 단위 테스트할 수 있고, 컴포넌트는 React Testing Library로, 비즈니스 로직은 순수 함수 테스트로, API는 MSW로 모킹하여 테스트 가능합니다. 코드 재사용성과 유지보수성이 크게 향상됩니다.

핵심 포인트
  • • 컴포넌트, 비즈니스 로직, 데이터 레이어의 명확한 분리
  • • Custom Hook을 통한 로직 재사용과 추상화
  • • 순수 함수로 분리한 데이터 변환 및 검증 로직
  • • 레이어별 독립적인 테스트 전략과 테스트 용이성 향상
Follow-up 질문

만약 여러 컴포넌트에서 유사한 비즈니스 로직을 공유해야 한다면, Custom Hook의 조합(Composition)을 어떻게 설계하시겠습니까? Hook이 너무 많아져서 관리가 어려워지는 상황을 방지하는 방법도 함께 설명해주세요.

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!