React에서 리스트를 렌더링할 때 key는 각 요소를 고유하게 식별하는 필수 속성입니다. key는 React가 DOM 업데이트를 효율적으로 수행하도록 돕지만, 잘못된 key 사용은 성능 저하와 버그를 초래합니다. 특히, 배열의 인덱스를 key로 사용하는 것은 피해야 합니다. 이 글에서는 인덱스를 key로 사용하면 안 되는 이유와 올바른 key 선택 방법을 설명합니다.
순서 변경 시 재렌더링 문제
순서 변경 시 재렌더링 문제리스트에 요소가 추가, 삭제, 또는 순서가 바뀌면 인덱스가 변경됩니다. React는 key가 바뀐 요소를 새로운 요소로 인식해 불필요한 재렌더링을 수행합니다.
상태 관리 문제
상태 관리 문제상태를 가진 컴포넌트(예: 입력 폼)가 있는 리스트에서 인덱스를 key로 사용하면, 순서 변경 시 상태가 엉뚱한 요소에 연결됩니다.
성능 저하
성능 저하React는 key를 통해 DOM 변경을 최소화하지만, 인덱스를 사용하면 최적화가 제대로 이루어지지 않아 성능이 떨어집니다.
인덱스를 key로 사용하는 것은 다음 경우에만 적합합니다:
const staticItems = ['Apple', 'Banana', 'Orange'];
const list = staticItems.map((item, index) => <li key={index}>{item}</li>);
하지만 이런 경우에도 고유한 값을 사용하는 것이 더 안전하고 유지보수에 유리합니다.
key는 리스트 내에서 고유하고 안정적인 값을 사용해야 합니다.
안정성
key는 리스트 업데이트 시 동일해야 합니다. Math.random() 같은 임시 값은 절대 사용하지 마세요.
고유성
리스트 내에서 중복되지 않아야 합니다.
간단함
복잡한 연산으로 key를 생성하면 성능에 영향을 줄 수 있습니다.
React에서 인덱스를 key로 사용하면 안 되는 이유는 다음과 같습니다:
재렌더링 문제: 리스트 순서가 바뀌면 인덱스가 변경되어 React가 모든 요소를 불필요하게 재렌더링합니다.
상태 관리 문제: 상태를 가진 컴포넌트에서 순서 변경 시 상태가 잘못된 요소에 연결됩니다. 예를 들어, 입력 폼에서 사용자가 입력한 값이 엉뚱한 항목에 표시될 수 있습니다.
성능 저하: 인덱스는 React의 DOM 최적화를 방해하여 성능을 떨어뜨립니다.
대신, 데이터베이스 ID, UUID, 또는 복합 키 같은 고유하고 안정적인 값을 key로 사용해야 합니다. 이를 통해 렌더링 효율성을 높이고, 상태 관리 문제를 방지하며, 유지보수성을 개선할 수 있습니다. 인덱스는 리스트가 정적이고 상태가 없는 경우에만 제한적으로 사용할 수 있지만, 고유한 값을 사용하는 것이 항상 더 안전한 선택입니다.