[React] React에서 `key={index}`를 피해야 하는 이유 (feat. 더 나은 대안)
·
개발 분야 (Development Area)/프론트엔드 (Frontend)
이번 글에서는 React의 렌더링 생명주기(Lifecycle)와 CSS 애니메이션 예시를 추가하여 key={index}가 실제 애플리케이션에서 어떻게 예기치 않은 문제를 일으키는지 구체적으로 보여드리겠습니다.React key 심층 분석: 당신이 index를 key로 써서는 안 되는 진짜 이유"React 리스트 렌더링 시 key prop에 index를 사용하지 마세요." 이 조언은 React 개발자라면 누구나 한 번쯤 들어봤을 법한, 일종의 '관습'과도 같습니다. 하지만 왜 안되는 걸까요? '그냥 쓰면 안 좋다더라' 수준을 넘어, 그 내부 동작 원리와 실제 애플리케이션에 미치는 영향을 깊이 있게 파헤쳐 보겠습니다.이 글에서는 컴포넌트의 생명주기(Lifecycle)와 실제 DOM 조작, 그리고 애니메이션 깨..
[React] React Query와 Storybook: "No QueryClient set" 오류 해결 방법
·
개발 분야 (Development Area)/프론트엔드 (Frontend)
안녕하세요, 여러분.로그인 페이지를 구현하는 과정에서 스토리북을 실행했을 때 다음과 같은 에러 메시지를 마주하게 되었습니다  이 에러는 QueryClientProvider가 설정되지 않았기 때문에 발생하는 문제입니다. 실제 애플리케이션에서는 src/main.tsx 파일에서 QueryClientProvider로 App 컴포넌트를 감싸기 때문에 문제가 되지 않지만, 스토리북에서는 컴포넌트가 QueryClientProvider로 감싸지지 않으면 React Query를 사용할 수 없습니다. 이제 React Query의 핵심 요소인 QueryClient와 QueryClientProvider에 대해 알아보고, 스토리북 환경에서 발생하는 이 문제를 어떻게 해결할 수 있는지 함께 살펴보겠습니다. 1. React Que..
React useEffect 완벽 가이드: 햄버거 메뉴 구현에서 시작된 여정 (SSR 환경에서의 활용과 최적화)🚀
·
개발 분야 (Development Area)/프론트엔드 (Frontend)
들어가며: useEffect와 SSR의 만남 🌱  최근 Next.js를 활용한 프로젝트에서 햄버거 메뉴를 구현하던 중 흥미로운 문제에 직면했습니다. 단순해 보이는 햄버거 메뉴 기능이었지만, Next.js의 서버 사이드 렌더링(SSR) 환경에서 예상치 못한 도전 과제를 마주하게 되었죠.처음에는 단순히 다음과 같이 구현했습니다:const [isMenuOpen, setIsMenuOpen] = useState(false);const toggleMenu = () => { setIsMenuOpen(!isMenuOpen);};하지만 이 코드는 SSR 환경에서 문제를 일으켰고, 결국 다음과 같이 수정해야 했습니다:"use client";import { useState, useEffect } from "react";..
[번역] TikTok이 Sparo를 사용하여 20만 개 파일이 있는 모노레포를 관리하는 방법
·
개발 분야 (Development Area)
소개이 글은 TikTok 개발 블로그(원문)의 내용을 바탕으로 작성된 자료를 한국어로 번역한 것입니다. 기술적인 세부 사항은 TikTok 엔지니어링 팀에 의해 제공되었으며, 원문은 참조 자료에서 확인하실 수 있습니다. 이 글에서는 TikTok의 프론트엔드 팀이 대규모 모노레포에서 성능 문제를 해결하기 위해 Sparo라는 도구를 어떻게 개발하고 활용했는지를 다룹니다. 또한, 모노레포의 복잡성과 성장이 개발자 생산성에 미치는 영향을 줄이기 위한 방안을 설명합니다. TikTok의 모노레포 성장 배경TikTok은 빠르게 성장하는 짧은 형식의 비디오 공유 플랫폼으로, 웹 프론트 엔드의 코드베이스도 이에 발맞추어 커져왔습니다. 이 코드베이스는 TypeScript로 작성되었으며, 하나의 Git 저장소에 다수의 프로젝..
[Git] Git 히스토리 탐색: git log 가이드
·
개발 분야 (Development Area)
Git을 사용할 때, 프로젝트의 히스토리를 이해하는 것은 변경 사항을 추적하고, 문제를 디버깅하며, 다른 개발자와 협업하는 데 필수적입니다. Git은 git log라는 강력한 명령어를 제공하여 다양한 방식으로 커밋 히스토리를 확인할 수 있게 해줍니다. 이번 글에서는 다양한 git log 옵션을 살펴보고, Git 히스토리를 최대한 활용할 수 있는 방법을 알아보겠습니다. 각 명령어와 함께 실제 Bash 결과 예시를 포함하여 설명하겠습니다.1. 기본 커밋 히스토리:  git log가장 기본적인 방법으로 커밋 히스토리를 확인하려면 git log 명령어를 사용합니다. 이 명령어는 현재 브랜치의 모든 커밋을 시간순으로 나열하며, 각 커밋의 해시, 작성자, 날짜, 커밋 메시지 등의 중요한 정보를 제공합니다.git l..
[React] React의 `createRoot`와 `hydrateRoot`이해하기
·
개발 분야 (Development Area)/프론트엔드 (Frontend)
React 18은 애플리케이션을 초기화하고 관리하는 방식에 중요한 변화를 가져왔습니다. 특히 createRoot와 hydrateRoot API의 도입은 기존의 ReactDOM.render와 ReactDOM.hydrate를 대체하며, 클라이언트 사이드 렌더링과 서버 사이드 렌더링(SSR)에 대해 더 세밀한 제어와 성능 향상을 제공합니다. 이 글에서는 이러한 API를 깊이 있게 탐구하고, 언제 어떻게 사용하는지, 그리고 효율적이고 확장 가능한 React 애플리케이션을 구축하기 위한 모범 사례에 대해 알아보겠습니다.1. createRoot란?createRoot API는 클라이언트 사이드에서 React 애플리케이션을 초기화하는 새로운 방법입니다. 이는 더 성능이 뛰어나고 유연한 방식으로 React 앱의 렌더링과..
[React] 🛑 React에서 key={index} 사용의 위험성: 쉽게 이해하는 key 값과 React Reconciliation
·
개발 분야 (Development Area)/프론트엔드 (Frontend)
React로 웹 애플리케이션을 만들다 보면, 여러 개의 데이터를 화면에 표시해야 하는 경우가 많습니다. 예를 들어, 할 일 목록을 보여주거나 상품 목록을 나열하는 경우가 그렇죠. 이때 React 개발자들은 map 함수를 사용하여 데이터를 하나씩 꺼내 화면에 보여주는 방식을 자주 사용합니다.이때 중요한 것이 바로 key prop입니다. React는 화면을 효율적으로 업데이트하기 위해 key prop을 사용하는데, key={index}처럼 배열의 인덱스를 key 값으로 사용하면 예상치 못한 문제가 발생할 수 있습니다.이 글에서는 React의 reconciliation 알고리즘과 key 값의 역할을 바탕으로, 왜 key={index}가 문제인지, 그리고 안전하게 리스트를 렌더링하는 방법은 무엇인지 자세히 알아..
JavaScript reduce 메서드 활용하기
·
개발 분야 (Development Area)/프론트엔드 (Frontend)
JavaScript 개발을 하다 보면 배열 데이터를 다루는 경우가 빈번하게 발생합니다. 이때, 배열의 요소들을 순회하며 특정 작업을 수행하고, 최종적으로 하나의 결과값을 도출해야 하는 경우가 많습니다. JavaScript는 이러한 작업을 효율적으로 처리하기 위해 reduce() 메서드를 제공합니다. reduce() 메서드는 배열을 순회하며 누적 값을 계산하고, 최종적으로 하나의 결과값을 반환하는 강력한(?) 도구입니다. 단순한 합계 계산부터 복잡한 데이터 변환까지 다양한 상황에서 유용하게 활용될 수 있습니다.1. 🧰 reduce 메서드 기본 syntax 및 기본 동작 원리reduce() 메서드는 배열의 각 요소에 대해 지정된 콜백 함수를 실행하고, 이전 결과와 현재 요소를 기반으로 누적 값을 계산합니다..
vanillinav
'개발 분야 (Development Area)' 카테고리의 글 목록