오늘은 React의 Virtual DOM과 관련된 Reconciliation(재조정) 과정에 대해 알아보고, 이를 토대로 key에 index를 사용하면 안되는 이유까지 알아보겠습니다.

 

React가 DOM 트리를 재구성하는 방법

리액트에서는 Reconcilitation (재조정) 과정을 통해, Actual DOMVirtual DOM의 Diff(차이점)만을 알아내서 새로운 DOM을 리렌더링 과정을 수행합니다.

 

이는, 모든 노드를 렌더링하지 않고 바뀐 State 노드만 변경하여 렌더링 최적화를 이룬 것이라고 볼 수 있습니다.

 

재조정 과정

 

Reconciliation 과정은 총 2단계로 이루어집니다.

  1. Reconciler→ React 내부의 Diffing Algorithm을 사용하여 바뀐 점을 알아낸다.
    • Diffing Algorithm React에서는 O(N3)의 비효율적인 diffing-algorithm을 개선하였다. AI에서 자주 사용하는 Heuristic O(n) 알고리즘을 사용하였다.
    • Current 트리와 작업 중(Work in Progress) 트리의 차이점을 발견하는 역할을 한다.
  2. Renderer
    • Reconciler로부터 전달받은 Diff를 토대로, Current 트리를 바꾸는 역할을 수행한다.

위에서, React의 Reconciler diffing-algorithm은 Heruistic 알고리즘을 사용하여 DOM간의 차이점을 발견하다고 언급하였습니다.

 

바로 이때, key 값이 변경된 사항을 판단하는 용도로 사용됩니다.

 

key값을 index로 사용하면 안되는 이유

React는 특정 노드의 자식들을 재귀적 처리할 때, 두 리스트의 차이점을 순회하여 차이점이 발견되면 이를 반영합니다.

이때, 아닌 key값을 토대로 노드를 비교 · 식별하는 것입니다.

리액트가 바뀐 점을 식별하는 가정 2가지

  1. 타입 (HTML Element)이 다른 두 엘리멘트는 서로 다른 트리를 만들어 낸다.
  2. key를 통해 어떤 자식 엘리먼트가 변경되지 말아야 할지 표시해 준다.

아래와 같은 코드가 있다고 가정해보겠습니다.

// Index를 Key로 사용
<ul>
  <li key="0">first</li>
  <li key="1">second</li>
  <li key="2">third</li>
</ul>

 

만약, 개발자가 가운데 second 를 가진 List Element를 삭제하는 버튼을 눌렀다고 가정해보겠습니다.

아래와 같이 되기를 기대할 것입니다

 

// Index를 Key로 사용
<ul>
  <li key="0">first</li>
  <li key="1">third</li>
</ul>

 

하지만, 실제로는 아래와 같이 됩니다.

// Index를 Key로 사용
<ul>
  <li key="0">first</li>
  <li key="1">Second</li>
</ul>

 

이를 자세히 살펴보겠습니다.

 

아래와 같이 기존 DOM에서 key = “1” 에 해당하는 list를 삭제하면 State-Changed Virtual DOM이 탄생합니다.

이때, 바뀐 배열로 인해 key 값은 third가 key = “1”을 차지하게 됨을 명심하세요.

 

이후, Reconciler는 key값을 토대로 바뀐 Element는 무엇인지 판단한다.

 

key = “2” 가 사라졌으므로, Reconciler는 “key = “2”를 빼고 렌더링하면 되겠다” 고 Renderer로 전달하여 Renderer는 이를 렌더링합니다.

// 기존 DOM
<ul>
  <li key="0">first</li>
  <li key="1">second</li>
  <li key="2">third</li>
</ul>

// State-Changed Virtual DOM
<ul>
  <li key="0">first</li>
  <li key="1">third</li>
</ul>

key에 올바른 값을 사용하기

많은 개발자들이 염두하고 있듯이 key 값에는 값을 구분할 수 있는 고유의 값을 사용해야 합니다.

서버에서 제공받는 데이터라면, 대부분 id 값을 토대로 구분할 수 있다.

혹여나 index를 사용해야 한다면, 변하지 않는 정적 데이터에만 사용하여 의도치않은 오류를 방지해야 합니다.

시작하기에 앞서, 사고로 안타깝게 하늘의 별이 되신 분들의 명복을 빕니다.

 

어느덧 갑진년 2024년을 지나, 2025년 을사년이 되었습니다.

 

한 해를 마무리하고 새로 맞이한 2025년을 슬기롭게 보내기 위해서, 작년을 이 글로 마무리하고 새로운 마음가짐으로 2025년을 시작하고자 합니다.

 

1️⃣ 대학교 졸업.

길고 길었던 6년간의 대학 생활을 마무리하고, 졸업생(수료)이 되어 학생의 신분에서 벗어났습니다. 4학년 2학기 전에는 항상 “졸업하고 싶다”를 많이 생각했었는데 막상 마지막 학기가 되어보니, 친했던 친구들과 만나지 못함에 대한 아쉬움, 정들었던 학교를 이제는 가지 않는다는 아쉬움이 너무 많이 느껴졌습니다. 저는 초등학교, 중학교를 같은 친구들과 보내왔어서 중학교 졸업식 때 왕창 울었었습니다. 그때 기억이 나면서, 대학교도 졸업하고 싶지 않더라고요..

그래도!! 안녕은 영원한 이별은 아니라잖아요? 동종업계 친구들도 많고, 미래를 함께할 평생 친구도 몇몇 있는 만큼(나만 그렇게 생각하는 거 아니겠지..?) 슬퍼하지 않고 나아가야겠습니다 😁

 

 

2️⃣ 2024년은 실패의 해

2024년을 생각하면 가장 많이 떠오르는 키워드는 안타깝게도 “실패”입니다.

저는 지금까지 생각보다 순조로운 인생을 살아왔습니다. 예상했던 고등학교로 입학, 운 좋게 대학교 예비 번호로 재수 생활 없이 대학교 입학, 서울의 좋은 부대에서 군 생활을 보냈던 만큼 저에게 큰 실패는 어깨너머 들은 이야기였습니다. 그래서, 이번 연도 실패는 저에게 지금까지도 큰 아픔으로 느껴집니다. 참고로 저의 실패는 “취업 실패” 입니다. 비록 수료생이 된 지는 1개월도 되지 않았지만, 그 전에 인턴 생활을 경험하기 위한 도전들, 졸업과 동시에 취업하고자 했던 도전들이 모두 실패하였습니다.

 

한번 한번 실패할 때마다 “언젠가는 붙겠지” “잘될 거야”라며 스스로를 위로했습니다. 하지만, 그 실패들이 한번 두번 쌓이다 보니 어느 순간 노션 두 페이지를 가득 채울 만큼의 실패를 했다는 것을 알아차렸습니다. 취업하는 친구들은 점점 생겨나고, 제 취업에 관심을 가지는 주변인들이 많아지다 보니, 낙관적이었던 제 생각들이 점점 무책임하게 느껴졌습니다.

누구나 실패는 하고, 실패를 해봐야 성공해야 한다고들 합니다. 실패를 통해서 깨달음을 얻고, 이를 통해서 더 나아간다고 말이죠. 저도 그 과정에 있다고 생각했습니다. “나는 지금 실패 중이야. 언젠가는 성공하겠지?”라고 생각했습니다. 정작 제일 중요한 “실패를 통한 성장”을 잊고 있었습니다.

 

그래서, 이제부터는 모든 경험에 긍정적이든 부정적이든 의미를 부여하기로 마음먹었습니다. 그러기 위한 많은 방법을 생각해 보았습니다. 누군가는 실패의 교훈들을 포스트잇으로 모두 벽에 붙여두거나, 누군가는 데이터화하여 저장해두는 방식을 선택할 것입니다. 저는 오답 노트를 적고 이를 매번 보는 사람과는 거리가 멉니다. 오히려 제 실패, 성장 과정을 남들에게 보여주며 자극받는 사람입니다. “내가 지금 이거 하고 있어”, “내가 이 실패를 했는데 이걸로 뭐 이런 생각도 들더라”라며 말이죠. 그래서, 이 글을 적고 있습니다. 앞으로는 실패를 낙관적으로 받아들이지 않고 한 단계라도 더 나아가기를 바라면서 말입니다.

 

 

3️⃣ 2025년은 어떻게 살까?

우울한 이야기는 그만하고, 2025년은 어떻게 살지 생각을 많이 해봤습니다. 끝이 보이지 않는 긴 터널을 지날 텐데, 이 터널을 현명하게 보내려면 어떻게 해야 할까.. 많은 블로그를 읽고 사람들의 취업 후기를 찾아보기도 하면서 정답을 찾아보려고 애썼습니다. 하지만, 생각보다 해답은 의외의 곳에서 발견되었습니다. 새해 종을 치고, 신년 운세를 친구가 보았다고 해서 저도 돌려보았는데 아래처럼 나왔습니다.

 

신년 운세

 

요약하면, “체계적인 관리와 운용 속에서 계획적인 삶의 흐름이 예상된다”, “올 한 해는

미래를 위한 다지는 한 해로 이끄시길 바랍니다.” 였습니다.

 

 

“체계적인 관리와 운용 속에서 계획적인 삶의 흐름이 예상된다”

저는 체계적인 사람과는 거리가 있다고 생각합니다. 물론, 체계적으로 되기 위해 노션에 공부 내용 정리, 블로그 작성 등 여러 가지 노력을 하지만, 파워 J들이 봤을 때는 난장판 그 자체입니다. 이러한 성격이 평상시 공부를 하거나 개발할 때 머릿속에서도 일어난다고 항상 생각해 왔습니다.

 

무엇인가를 집중하고 파고들려고 하면, 또 재밌는 주제가 보이고 그 주제로 어느샌가 생각을 트는 경우가 많더라고요. 학교 공부할 때는 이런 경우가 적었습니다. 교수님이 하라는 공부, 하라는 과제를 성실하게 따라가기만 하면 학점을 자연스럽게 따라왔습니다. 하지만, 자기개발인 웹 개발 공부를 할 때는 모르는 게 많다 보니 “저것도 배워볼까?” “저건 뭐지” 자연스럽게 샛길로 빠지는 경우가 많았습니다. 다시 돌아와 보려고 하면 뭐 하고 있었는지 까먹어서 깊이 있는 공부가 되지 못했던 것 같습니다.

 

따라서, 공부할 때 저만의 노트를 하나 둘까 생각합니다. 노트에 제가 지금 하는 작업 혹은 공부를 마인드맵 형식으로 그려놓고, 그 마인드맵에서 생각나는 것들을 아래 노드로 그려놓는 것입니다. (DFS처럼) 그렇게 되면, 샛길로 빠지더라도 돌아와서 올바르게 나아가면 더 촘촘한 사람, 개발자가 되지 않을까요?

 

 

“올 한 해는 미래를 위한 다지는 한 해로 이끄시길 바랍니다.”

제 상황을 알고 있는 걸까요? 소름 돋는 문장이네요.

마무리

글을 써보니, 취업 관련 이야기가 많고 우울한 분위기였네요.

개발 취업시장이 얼어붙고, 불경기가 일어지고 있는 만큼 저와 같은 개발 취준생분들이 아주 많을 것 같습니다. 위로를 해드리고 싶지만, 글로 쓰는 위로는 힘이 없는 것을 알기에 여러분들처럼 힘들어하는 저 자신으로부터 위로받았으면 좋겠습니다.

긴 글 읽어주셔서 감사합니다. 새해 복 많이 받으세요 😁

 

 

🔖 참고

위에서 제가 무엇을 할지 적어둔다고 했었죠?

(TMI) 저는 앞으로 이런 일들을 할겁니다. 모든 것들을 3개월 내로 마무리하는 것으로 계획하고 있어요 앞으로 저의 공부를 지켜봐주세요!

npm 패키지 개발 

이전 프로젝트 하면서, Custom Hook을 사용하면 할 수록 로직 분리도 간편하고 코드도 간단해지는 것을 느꼈습니다.

그래서 한번 Custom Hook을 관리하는 npm 패키지를 제작해보면 어떨까 싶습니다. 재밌겠네요 😁

 

웹 개발(프론트엔드) 공부

공부를 하면서 재미를 찾는다는건 좋은 방향이라고 생각합니다.

그래서, 저만의 시리즈인 “너 이거 알아?” + “나 이건 몰랐어” 시리즈를 만들어서 블로그 글로 만들어볼까 합니다.

“너 이거 알아?”

  • 개발을 하면서 많이들 놓칠 수 있는 기본 지식들
    • ex) `.map` 함수를 쓰면서 `key = index` 를 왜 쓰면 안되는지 알아?
    • ex) `package.lock` 의 용도를 알아?
  • CS 기본 지식 중에 알고는 있지만 자세한 내막은 모르는 경우
    • `CSRF` 공격을 실제로 해봤어?

“나 이건 몰랐어”

  • 개념적으로 처음 들어보는 것
  • 개발하면서 생긴 새로운 인사이트

 

자격증 취득

  • 정보처리기사 자격증 따기!

오늘은 개발 포스팅 대신 우연히 접한 깃허브 잔디 기부 캠페인에 대해 소개해보겠습니다.

 

항해99에서 진행한 이벤트에서 깃허브의 잔디들을 기부하면 잔디 1개에 100원으로 환산돼서 저소득층 아이들의 코딩 교육을 지원하는 단체에 기부되어, 아이들이 기회의 차등 없이 개발자의 꿈을 키우도록 돕는 다는 이야기에 망설임 없이 기부했네요.

 

사실 처음에는 제가 기부한 잔디들이 깃허브에서 사라질줄 알고 신중하게 고민하고 기부하였습니다. 취준생인데 없어지 곤란할 것 같기도 했습니다.  다만, 제가 취직을 한시즌 못하는 것보다 저속득층 아이들이 한 학기 늦게 배우는게 더 치명적일 것 같다는 생각에 결국 잔디를 기부하기로 마음먹었습니다.

 

그런데 알고보니, 쌓은 잔디 개수만 기부되는 거였더라구요,,ㅎㅎ

총 1094개를 기부했으니, 제가 109,400원을 저속득층 아이들에게 기부했네요.

실제로 저속득층 아이들에게 전달되었으면 좋겠네요.

 

연말 크리스마스에 참 따뜻해지는 이벤트 같습니다. 내년에도 열심히 잔디 쌓아서 기부해야겠네요.

기부내역

 

+ Recent posts