프로그래머스 프로젝트 팀원들끼리 면접질문에 대해 각자 조사해오는 팀활동을 진행하게 되었는데 이 참에 꾸준히 여기에 면접질문 관련된 내용을 쓰면 좋을거 같아 만들게 되었다.
바로 시작
렌더링 횟수를 최소화
상태 업데이트 순서의 일관성을 유지
많은 setState의 변경사항을 한번에 처리해 렌더링 횟수를 최소화 할 수 있습니다.
예를 들어, 하나의 함수 내에서 10개의 상태 변경이 발생하면 React는 이러한 상태 변경을 비동기적으로 처리하여 마지막 상태 변경이 완료된 후에 한 번의 렌더링으로 병합합니다. 이로 인해 각 상태 변경마다 컴포넌트가 재렌더링되는 것이 아니라, 마지막 상태 변경이 완료된 후 한 번만 재렌더링되어 성능 최적화에 이점이 있습니다.
비동기적으로 setState를 처리함으로써 리액트는 최신 상태를 보장합니다. 여러 setState 호출이 서로에게 영향을 미칠 수 있는 상황(side Effect)에서, 리액트는 상태 업데이트 순서를 조정하여 일관성을 유지합니다.
예를 들어, count가 1 증가하는 상태 변경이 하나의 함수에서 두 번 실행된다고 가정해본다면 동기 처리의 경우, 각 상태 변경이 서로의 결과를 반영하지 않기 때문에 상태 변경이 두 번 발생하더라도 결과는 1만 증가하게 됩니다. 반면, 비동기 처리의 경우, React는 상태 변경 요청을 업데이트 큐(React 내부에서 상태나 props 변경을 임시로 저장하는 공간)에 추가하고, 배치 처리를 통해 이를 한 번에 처리합니다. 이 과정에서 이전 상태를 기반으로 순차적으로 업데이트가 이루어지기 때문에 최종 결과는 2가 증가하게 됩니다. 이러한 방식으로 React는 성능 최적화를 이루며, 불필요한 재렌더링을 줄입니다.
얕은 비교(shallow equal)를 사용
객체의 불변성 유지하는 법
우선 의존성 배열은 리액트의 useEffect 같은 훅의 2번째 인자로 들어가는 배열 []을 뜻하며 이 의존성 배열의 값이 변경될때 마다 useEffect 콜백함수가 작동하게 됩니다.

리액트에서 훅의 의존성 배열은 얕은 비교(shallow equal)를 사용합니다. 얕은 비교는 배열이나 객체의 내용이 동일하더라도 참조가 다르면 다른 것으로 간주합니다. 예를 들어, 의존성 배열에 객체를 포함시킨 경우, 객체의 속성 값이 동일하더라도 참조가 변경되면 훅이 다시 실행됩니다. 이를 방지하기 위해 상태를 업데이트할 때는 불변성을 유지해야 합니다.
불변성을 유지하는 방법으로는 spread 연산자를 사용해 객체의 참조값을 유지하는 방법, immutable.js 같은 라이브러리를 사용하는 방법이 있습니다.
리액트의 memo 기능
상태관리 라이브러리
const MyComponent = React.memo(({ someProp }) => {
const handleClick = () => {
console.log(someProp);
};
return <button onClick={handleClick}>Click me</button>;
});
import React, { useCallback } from 'react';
const MyComponent = ({ someProp }) => {
const memoizedCallback = useCallback(() => {
// 함수 내용
}, [someProp]);
return <ChildComponent callback={memoizedCallback} />;
};
import React, { useMemo } from 'react';
const MyComponent = ({ someProp }) => {
const memoizedValue = useMemo(() => {
// 값 계산
return someProp * 2;
}, [someProp]);
return <ChildComponent value={memoizedValue} />;
};
키워드
- 자바스크립트의 코드 실행 환경
- 전역 / 함수 실행 컨텍스트
실행 컨텍스트는 자바스크립트에서 코드가 실행되는 환경을 의미합니다.
자바스크립트 엔진이 코드를 실행할 때, 그 코드가 실행될 때의 환경을 정의하고 관리하기 위해 존재하는 것이 실행 컨텍스트입니다.
실행 컨텍스트는 전역과 함수 컨텍스트로 나눌 수 있습니다.
전역 실행 컨텍스트는 자바스크립트가 처음 실행될 때 생성되는 컨텍스트입니다.
이 전역 컨텍스트는 프로그램이 종료될 때 까지 유지되며 전역에 선언된 변수나 함수가 모두 포함됩니다.
전역 실행 컨텍스트에 선언된 변수와 함수는 프로그램 내 어디서든 접근 가능합니다.
자바스크립트는 싱글 스레드이기 때문에 전역 실행 컨텍스가 1개만 존재합니다.
함수 실행 컨텍스트는 함수가 호출될 때 마다 생성되는 컨텍스트를 의미합니다.
각 함수는 자신만의 실행 컨텍스트를 가지며, 이 컨텍스트 내에서 선언된 변수와 함수는 해당 함수 내에서만 유효합니다.
함수가 종료되면 그 실행 컨텍스트도 함께 사라집니다.
정리하면 실행 컨텍스트는 구성요소를 바탕으로 자바스크립트 코드가 실행되는 동안의 환경을 관리하고, 코드 실행시 변수의 유효 범위나 함수 호출의 맥락을 결정 짓습니다.
실행 컨텍스트는 변수 객체, 스코프 체인, this 라는 구성요소로 이루어져 있습니다.
변수 객체란 실행 컨텍스트 내에서 사용되는 변수와 함수 선언을 저장하는 공간입니다.
전역 컨텍스트 내에선 전역 객체가 변수 객체의 역할을 합니다.
함수 컨텍스트 내에선 활성화 객체가 변수와 매개변수를 관리합니다.
스코프 체인은 현재 실행 중인 컨텍스트와 외부 렉시컬 환경의 연결을 유지합니다.
변수를 참조할 때 현재 컨텍스트에서 찾지 못하면 외부 환경으로 범위를 넓혀가며 변수를 찾습니다.
this는 실행 컨텍스트에 따라 참조하는 객체가 달라집니다.
전역 컨텍스트에선 this가 전역 객체를 가리키며 함수 컨텍스트에선 함수 호출 방법에 따라 달라집니다.
키워드
- 컴포넌트 재렌더링
- 단방향 데이터 흐름 원칙
- 상태 끌어올리기
<script>
function ChildComponent(props) {
props.name = "New Name"; // 오류 발생 가능
return <div>{props.name}</div>;
}
</script>