• Home
  • About
    • JINH-ZERO-PARK photo

      JINH-ZERO-PARK

      Welcome.

    • Learn More
    • Email
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

삽질의 추억

28 Dec 2024

Reading time ~1 minute

방학을 맞아 React Native를 배우고 이것 저것 만들어보고 있다.

채찍피티의 도움으로 쉽고 재미있게 코딩을 하고 있었는데… 어제부터 오늘까지 24시간 동안 날 괴롭힌 오류가 발생했다.

 (NOBRIDGE) ERROR  Warning: Each child in a list should have a unique "key" prop.

사실 ReactJS를 조금만 다뤄봤다면 금방 해결할 수 있는 문제이다. map function을 이용해서 컴포넌트를 렌더링하면 key 를 지정해주어야 하면 에러 메시지는 사라진다.

그런데! RN을 배우면서 처음 FlatList 를 써보게 되었고, 이 컴포넌트는 내가 리스트의 아이템이 되는 컴포넌트 에게 직접 key 를 지정하지 않고 keyExtractor 를 정의하면 알아서 이를 지정하는 방식으로 작동함을 알게 되었다.

그리하여 챗지피티와 RN 공식 문서, 스택오버플로를 참고하면서 코드를 잘 짰는데, 도무지 위의 에러 메시지가 없어지지 않았다. 그래서 어찌저찌 key prop을 직접 지정하기까지 했는데도 해결될 기미가 보이지 않았다.

분명 에러메시지는 리스트의 아이템이 되는 컴포넌트 의 최상위 태그에서 문제가 발생했다고 말하고 있었다. 그런데 직접 key를 해당 태그에 넣어도 변화가 없어서 미칠 노릇이었다.

내가 FlatList 의 작동 방식을 잘 이해하지 못하고있나? 해서 한참을 뒤져보아도 관련된 정보를 찾지 못했다. 그러다 마지막으로 해본게, 리스트의 아이템이 되는 컴포넌트 의 하위 컴포넌트들을 차례로 주석처리하면서 어디 부분에서 에러가 발생하는지 찾는 것이었다.

그랬더니, 컴포넌트 안쪽에서 아래와 비슷한 구조가 발견되었다.

{list.map((item, index)=>(
  <>
    <Text item={item} key={index}><Text>
    {item.anotherList.map((item, index)=>(
      <Text></Text>
      ))}
  </>
  ))}

이 코드를 대충 봤을 때는 key 를 잘 지정해준 것으로 보이지만, 잘 보면 map 의 반환값의 최상위 태그가 아닌 그 하위 태그에 key 가 설정되어 있었다. 이를 아래와 같이 고치니 오류가 해결되었다.

{list.map((item, index)=>(
  <View key={index}>
    <Text item={item}><Text>
    {item.anotherList.map((item, index)=>(
      <Text></Text>
      ))}
  </View>
  ))}

사후적으로 보면 정말 간단한 문제였는데, 에러 메세지가 가리키는 라인이 정확한 곳을 가리키지 않아 오류의 원인을 찾을 수 없었다. 타입스크립트를 쓰면 이런걸 해결할 수 있나? 넘어가기 귀찮은데…

여하튼 챗지피티를 쓴 이후로 에러로 골머리를 앓는 일이 훨씬 줄어들었는데, 간만에 고통스러운 문제 해결 과정을 겪었다. 후련하다!