키값을 부여하지 않는다면 아래와 같은 코드가 콘솔에 출력된다.
의미를 조금 해석해 보자면 PokemonList의 key값이 정해지지 않아서 오류가 발생할 수 있다고 한다. 하지만 화면 렌더링은 정상적으로 이루어지고 있다. 그러면 무슨 문제가 있기에 리액트는 이것을 경고하는 것일까?
리액트 공식 문서에 따르면
"배열을 렌더링할 때 key값이 고유하지 않으면 렌더링이 잘못될 수 있다"로 결론을 내릴 수 있다.
key값을 만들때 주의점
- 리스트를 만들 때 포함되어야 하는 특수한 문자열 속성이다.
- key값은 어떤 고유한 항목을 변경, 삭제, 추가 혹은 식별할지에 도움을 주는 프롭입니다.
- key값은 배열 내부의 엘리먼트로 고유성을 부여해야 합니다.
- key값은 배열의 index 값으로 사용하면 안 됩니다.
일단 이 정도로 정리할 수 있다. 즉 key값은 어떤 element의 변동이 일어났는지를 식별할 수 있게 도와주는 프롭인 것이다.
보통 배열을 화면에 렌더링 할 때 추가 삭제 등의 행동은 빈번하게 일어날 수 있다.
이때 key값이 없다면 다음 문제가 발생할 것이다.
- 요소의 값이 변경되었는지 삭제되었는지 불분명함
- React가 state가 변경되지 않았다고 판정하고 렌더링을 안 해줌
첫 번째부터 살펴보자면, 예를 들어 우리가 [index0 사과, index1 바나나, index2 자몽]이라는 배열을 렌더링 한다고 생각해 보자. 고유한 key값이 없어 index값을 key값으로 설정했다.
이제 바나나를 삭제하려고 한다.
그럼 결괏값은 [0 사과, 1 자몽]이 된다.
이번엔 자몽을 제거하고 바나나를 자몽으로 교체하려고 한다.
그럼 결괏값은 [0 사과, 1 자몽]이 된다.
그럼 두 가지 경우의 결괏값은 같아지는데 key값(index)을 비교해도 결과만 봐서는 어떻게 바뀌었는지 알 수 없다.
만약 [1: 사과, 2: 바나나, 3: 자몽]의 id값을 key로 지정한다고 가정하고 바나나를 삭제해 보면 [1: 사과, 3: 자몽]으로 결과만으로 어떤 과정이 있었는지 한눈에 보이는 것을 알 수 있다.
두 번째 경우는 VirtualDOM(가상돔 VDOM이라고도 한다) 이란걸 알아야 한다.
리액트나 다른 라이브러리에서 VirtualDOM을 보통은 사용한다고 들었다.
필자는 리액트에 대한 공부 밖에 아직 하지 않아서 잘 모른다
일단 내가 공부한 선에서 얘기를 해보자면, 브라우저는 렌더링을 할 때 DOM을 사용하게 되는데,
리액트의 VirtualDOM은 리액트의 컴포넌트가 변화할 때 이를 감지하고 저장해서 변화가 일어난 VirtualDOM과 RealDOM을 비교해서 새로운 DOM을 새로 생성하고 VirtualDOM을 업데이트한다.
근데 이때 사용되는 리스트의 비교값이 key값이다.
그럼 생각해 보자. 만약 index를 키값으로 설정하고 [0: 사과, 1: 바나나, 2: 자몽]이런 배열에서 바나나를 멜론으로 교체했다. [0:사과, 1:멜론, 2: 자몽] 여기서 key값이 바뀌었는가? index값은 그대 로고 안의 내용만 바뀌었기 때문에 리액트는 이를 변경되지 않았다고 판정하고 리렌더링을 해주지 않는다.
마무리
key값은 고유한 값을 지정해 주어야 한다.
key값이 없으면 리렌더링 할 때 오류가 발생할 수 있다.
Reference
React에서 키의 역할 - 네이버 블로그 (리액트 내부의 컴포넌트 생성에 대해서도 추가로 다루고 있다.)
https://junior-datalist.tistory.com/184 - 리액트에서 키값이 필요한 이유
'React' 카테고리의 다른 글
[React] JSON 배열 렌더링하기 (2) | 2023.04.18 |
---|---|
[React] Props 정리 (0) | 2023.04.17 |
[React] CSS 사용하기 (0) | 2023.04.12 |
[React] JSX 문법 (0) | 2023.04.08 |
[React] 개발자 도구 설치 (0) | 2023.04.08 |