⚠️ 리액트에서 key={index} 쓰면 안 되는 이유는?
안녕하세요, 프론트엔드 입문자분들! 👋
리액트에서 리스트를 렌더링할 때 key를 꼭 넣으라고 하잖아요?
그런데 key={index}는 왜 안 좋은 걸까요? 오늘은 이걸 아주 쉽게 알려드릴게요! 😊
🔑 Key는 왜 필요할까?
리액트는 리스트를 렌더링할 때 key를 기준으로 어떤 요소가 변경/추가/삭제되었는지 판단해요.
즉, key는 리액트의 비교와 최적화의 기준점입니다!
🚫 key={index} 쓰면 생기는 문제
예를 들어 볼게요:
{items.map((item, index) => (
<li key={index}>{item.name}</li>
))}
이런 코드는 간단하긴 한데...
리스트에 항목을 추가/삭제하면 인덱스가 바뀌죠?
그럼 리액트는 아래처럼 엉뚱한 요소를 다시 그리는 실수를 할 수 있어요:
- 🔄 불필요한 재렌더링 발생
- 🧼 입력값이나 체크박스 상태가 초기화됨
- 🐞 버그 유발 가능성 증가
✅ 대신 이렇게 하자! (고유한 ID 사용)
{items.map((item) => (
<li key={item.id}>{item.name}</li>
))}
✔️ item.id는 변하지 않는 고유 값이기 때문에 안전해요!
🔧 고유한 key 만드는 방법
방법 설명
✅ 서버에서 받은 ID 사용 | 가장 이상적 (ex: user.id) |
🔗 여러 필드 조합 | 예: ${item.name}_${item.email} |
🎲 uuid 또는 nanoid 라이브러리 | 클라이언트에서 유일값 생성 |
⚠️ index 사용 (특수한 경우만) | 리스트가 절대 변경되지 않는 경우만 허용 |
🤔 언제는 index 써도 될까?
✅ 아래처럼 절대 바뀌지 않는 정적 리스트는 괜찮아요!
const days = ['Mon', 'Tue', 'Wed'];
{days.map((day, index) => (
<li key={index}>{day}</li>
))}
하지만 사용자가 데이터를 추가/삭제/입력하는 UI라면 ❌ index는 피해주세요!
🎉 마무리 요약
- key는 리스트의 항목을 고유하게 식별하는 ID!
- index는 변할 수 있어서 버그, 성능 문제, UI 오류를 일으킴
- 꼭 고유하고 변하지 않는 값을 key로 사용하세요!
리액트에서 index를 key값으로 사용하면 안되는 이유에 대해서 설명해주세요.
리액트에서 index를 key로 사용하는 것이 권장되지 않는 이유는 배열의 요소들이 추가되거나 삭제될 때, 배열의 순서가 바뀌는 경우 문제가 발생할 수 있기 때문입니다.
리액트는 key를 통해 리스트에서 어떤 요소가 변경, 추가, 삭제되었는지를 추적합니다. 그러나 index를 key로 사용하면 배열의 순서가 변경될 때 리액트가 요소들을 잘못 인식할 수 있습니다. 예를 들어, 배열에 새로운 요소가 추가되면 그 뒤에 있는 요소들의 인덱스가 모두 바뀌게 됩니다. 리액트는 이를 새로운 요소로 인식해 불필요하게 재렌더링을 하거나, 요소의 상태를 잘못 처리할 수 있습니다.
이로 인해 성능 문제가 발생하거나, 사용자 입력 상태 같은 요소가 의도치 않게 초기화되는 등 예기치 않은 버그가 생길 수 있습니다. 그래서 배열의 순서나 요소 변경에 영향을 받지 않는 고유한 값을 key로 사용하는 것이 좋습니다.
다만, 수정/삭제 등의 변경이 절대 발생하지 않는 정적인 리스트라면 index를 사용해도 무방합니다.
key로 사용할 고유 값을 생성하는 방법에는 어떤 것들이 있나요? 🤔
key로 사용할 고유한 값을 생성하는 방법에는 여러 가지가 있습니다. 주로 데이터의 유일성을 보장하고 변하지 않는 값을 사용하는 것이 중요합니다.
서버의 데이터베이스에서 제공하는 고유 ID를 사용하는 것이 가장 권장됩니다. 만약 이 방법이 불가능할 경우, ${item.title}_${item.username}와 같은 형태로 여러 필드를 결합하여 고유 값을 생성할 수 있습니다. 혹은, 렌더링 이전 시점에 UUID 혹은 랜덤 값을 생성하여 고유 값을 부여할 수 있습니다.
'1일 1CS(Computer Science)' 카테고리의 다른 글
사용자가 웹사이트에 처음 접근했을 때 발생하는 일련의 과정에 대해 설명해 주세요. (0) | 2025.04.24 |
---|---|
자바스크립트에서 어떻게 호이스팅이 가능한지에 대해서 설명해주세요. (0) | 2025.04.24 |
데이터베이스 커넥션 풀(Connection Pool)을 사용하지 않으면 어떤 문제가 발생할 수 있나요? (0) | 2025.04.22 |
스레드, 프로세스, 코어의 수는 많을 수록 좋을까요? (0) | 2025.04.22 |
웹 애플리케이션의 성능을 최적화할 수 있는 방법들에 대해서 아는대로 설명해주세요. (0) | 2025.04.21 |