
제목: React 경고 해결하기: 각 자식 요소는 고유한 “key” 속성을 가져야 함
소개
React를 사용해 작업한 적이 있다면, 다음과 같은 경고 메시지를 본 적이 있을 것입니다: 경고: 배열이나 반복자에서 각 자식 요소는 고유한 "key" 속성을 가져야 함. `App`의 렌더링 메서드를 확인하세요. 이러한 경고는 일반적으로 map 함수를 사용하여 컴포넌트 목록을 렌더링할 때 발생합니다. 하지만 키를 정의해도 경고가 계속 나타납니다. 이 글에서는 이러한 경고가 발생하는 원인을 살펴보고 해결하는 방법을 제시하겠습니다.
문제
경고가 발생하는 코드를 살펴보겠습니다:
import React from 'react';
import Relay from 'react-relay';
import AccountTable from './AccountTable';
class App extends React.Component {
render() {
return (
<div>
<h1>계정 목록</h1>
{this.props.viewer.accounts.edges.map(edge =>
<AccountTable key={edge.node.id} account={edge.node} />
)}
</div>
);
}
}
export default Relay.createContainer(App, {
fragments: {
viewer: () => Relay.QL`
fragment on User {
accounts(first: 10) {
edges {
node {
${AccountTable.getFragment('account')}
}
}
}
}
`,
},
});
해결 방법 1: 인덱스를 키로 사용하기
가장 쉬운 해결 방법은 맵의 인덱스를 키로 사용하는 것입니다:
{this.props.viewer.accounts.edges.map((edge, i) =>
<AccountTable key={i} account={edge.node} />
)}
인덱스를 키로 사용함으로써 렌더링된 목록 내에서 고유성을 보장할 수 있습니다. 키는 형제 컴포넌트 간에만 고유해야 한다는 점을 알아두세요.
해결 방법 2: relay 프래그먼트의 하위 id 추출하기
객체를 기반으로 하는 안정적인 id가 있다면 해당 id를 키로 사용하는 것이 좋습니다:
{this.props.viewer.accounts.edges.map((edge) =>
edge && edge.node && <AccountTable key={edge.node.__id} account={edge.node} />
)}
이 방법은 relay 프래그먼트의 하위 id를 추출하여 목록의 각 요소가 고유한 키를 갖도록 합니다.
결론
React 경고 “각 자식 요소는 고유한 ‘key’ 속성을 가져야 함”은 컴포넌트 목록을 렌더링할 때 자주 발생하는 문제입니다. 이 글에서는 이러한 경고를 해결하기 위해 두 가지 해결 방법을 소개했습니다. 인덱스를 사용하거나 relay 프래그먼트의 하위 id를 추출하여 키의 고유성을 보장할 수 있습니다. 즐거운 코딩하세요!