리액트에서 index를 key값으로 사용하면 안되는 이유에 대해서 설명해주세요.
리액트에서 index를 key로 사용하는 것이 권장되지 않는 이유는 배열의 요소들이 추가되거나 삭제될 때, 배열의 순서가 바뀌는 경우 문제가 발생할 수 있기 때문입니다.
리액트는 key를 통해 리스트에서 어떤 요소가 변경, 추가, 삭제되었는지를 추적합니다. 그러나 index를 key로 사용하면 배열의 순서가 변경될 때 리액트가 요소들을 잘못 인식할 수 있습니다. 예를 들어, 배열에 새로운 요소가 추가되면 그 뒤에 있는 요소들의 인덱스가 모두 바뀌게 됩니다. 리액트는 이를 새로운 요소로 인식해 불필요하게 재렌더링을 하거나, 요소의 상태를 잘못 처리할 수 있습니다.
이로 인해 성능 문제가 발생하거나, 사용자 입력 상태 같은 요소가 의도치 않게 초기화되는 등 예기치 않은 버그가 생길 수 있습니다. 그래서 배열의 순서나 요소 변경에 영향을 받지 않는 고유한 값을 key로 사용하는 것이 좋습니다.
다만, 수정/삭제 등의 변경이 절대 발생하지 않는 정적인 리스트라면 index를 사용해도 무방합니다.
key로 사용할 고유 값을 생성하는 방법에는 어떤 것들이 있나요? 🤔
key로 사용할 고유한 값을 생성하는 방법에는 여러 가지가 있습니다. 주로 데이터의 유일성을 보장하고 변하지 않는 값을 사용하는 것이 중요합니다.
서버의 데이터베이스에서 제공하는 고유 ID를 사용하는 것이 가장 권장됩니다. 만약 이 방법이 불가능할 경우, ${item.title}_${item.username}
와 같은 형태로 여러 필드를 결합하여 고유 값을 생성할 수 있습니다. 혹은, 렌더링 이전 시점에 UUID 혹은 랜덤 값을 생성하여 고유 값을 부여할 수 있습니다.