This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
# [[Class Components]]
|
||||
|
||||
## 📌 Brief Summary
|
||||
클래스 컴포넌트(Class Components)는 JavaScript 클래스 문법을 사용하여 작성된 과거 React의 주요 컴포넌트 형태입니다. 오늘날의 React 개발 생태계는 대부분 함수형 컴포넌트로 전환되었으나, 특정 기능을 구현하기 위해 여전히 일부 사용됩니다. 가장 대표적으로 자식 컴포넌트 트리의 렌더링 에러를 포착하고 처리하는 '에러 바운더리(Error Boundaries)'는 오직 클래스 컴포넌트로만 구현할 수 있습니다 [1-4].
|
||||
|
||||
## 📖 Core Content
|
||||
* **함수형 컴포넌트로의 전환 및 리팩토링:**
|
||||
현대의 프론트엔드 업계 표준은 클래스 기반 React에서 함수형 React로 전환되었습니다 [1]. 최신 React에서는 클래스 상속과 같은 객체 지향 프로그래밍(OOP) 방식이 거의 사용되지 않으며, 함수형 접근법이 선호됩니다 [5]. 이에 따라 레거시 React 코드베이스를 리팩토링할 때 가장 우선적으로 고려되는 작업 중 하나가 기존의 클래스 기반 컴포넌트를 함수형 컴포넌트 및 훅(Hooks)으로 마이그레이션하는 것입니다 [4].
|
||||
|
||||
* **에러 바운더리(Error Boundaries)로서의 필수적 역할:**
|
||||
대부분의 기능이 함수형 컴포넌트로 대체되었음에도 불구하고, 클래스 컴포넌트가 반드시 필요한 고유 영역이 존재합니다. 컴포넌트 트리 하위에서 발생하는 JavaScript 에러를 포착하여 애플리케이션 전체가 중단되는 것을 막아주는 '에러 바운더리'는 오직 클래스 컴포넌트로만 생성할 수 있습니다 [3, 6].
|
||||
|
||||
* **라이프사이클 메서드를 통한 에러 처리:**
|
||||
클래스 컴포넌트가 에러 바운더리로 동작하기 위해서는 특정 라이프사이클 메서드 중 하나 이상을 정의해야 합니다. 에러가 발생했을 때 깨진 컴포넌트 트리 대신 폴백(fallback) UI를 렌더링하려면 `static getDerivedStateFromError()` 메서드를 사용하며, 에러에 대한 상세 정보를 기록(log)하려면 `componentDidCatch()` 메서드를 사용합니다 [2, 6].
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** [[Functional Components]], [[Error Boundaries]], [[React Hooks]], [[Refactoring]]
|
||||
- **Projects/Contexts:** [[레거시 React 코드베이스 마이그레이션]], [[React 애플리케이션 예외 및 에러 처리]]
|
||||
- **Contradictions/Notes:** 전반적인 코드베이스 리팩토링 시에는 클래스 컴포넌트를 함수형 컴포넌트로 변경할 것을 강력히 권장하지만 [4], 에러 바운더리를 구현할 때만큼은 기술적 한계로 인해 오직 클래스 컴포넌트만 사용해야 한다는 예외가 존재합니다 [3].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-26*
|
||||
@@ -0,0 +1,18 @@
|
||||
# [[Fallback UI]]
|
||||
|
||||
## 📌 Brief Summary
|
||||
Fallback UI는 React 애플리케이션의 특정 부분에서 에러가 발생하거나 데이터를 로딩 중일 때 표시되는 대체 사용자 인터페이스입니다 [1-3]. 이는 결함이 있는 단일 컴포넌트 때문에 전체 애플리케이션이 중단되거나 빈 화면(하얀 화면)이 나타나는 것을 방지합니다 [1, 4]. 사용자에게 친숙한 에러 메시지나 로딩 상태를 제공하여 애플리케이션의 안정성과 전반적인 사용자 경험을 크게 향상시킵니다 [5, 6].
|
||||
|
||||
## 📖 Core Content
|
||||
* **에러 경계(Error Boundaries)와의 통합:** Fallback UI는 UI를 위한 'try-catch' 블록 역할을 하는 React 에러 경계와 함께 가장 중요하게 사용됩니다 [1]. 하위 컴포넌트 트리의 렌더링, 수명 주기 메서드 또는 생성자에서 JavaScript 에러가 발생할 경우, 에러 경계 컴포넌트는 에러를 포착하고 `static getDerivedStateFromError()`와 같은 메서드를 호출해 상태를 업데이트한 뒤, 깨진 컴포넌트 트리 대신 Fallback UI를 렌더링합니다 [2, 5, 7].
|
||||
* **전략적 배치 및 애플리케이션 안정성:** 애플리케이션 전체를 하나의 에러 경계로 감싸기보다는 타사 위젯, 차트, 복잡한 폼 등 독립적이거나 불안정한 섹션을 개별적으로 감싸는 것이 모범 사례입니다 [1, 8]. 이렇게 구성하면 특정 위젯이 실패하여 Fallback UI를 표시하더라도 애플리케이션의 나머지 부분은 계속 안정적으로 작동하고 상호 작용할 수 있습니다 [1, 9].
|
||||
* **사용자 중심 디자인:** Fallback UI는 단순하고 명확하며 유익하게 디자인해야 합니다. 기술적인 세부 사항으로 사용자를 압도하지 않으면서도, 무언가 잘못되었음을 이해할 수 있도록 친절한 오류 메시지를 제공하는 것이 권장됩니다 [5, 8].
|
||||
* **지연 로딩(Lazy Loading) 및 Suspense에서의 활용:** 에러 처리뿐만 아니라 성능 최적화를 위한 코드 분할 및 지연 로딩에도 Fallback UI가 핵심적인 역할을 합니다 [3]. `React.lazy()`를 사용하여 컴포넌트를 온디맨드 방식으로 로드할 때, `Suspense`를 결합하여 모듈이나 데이터가 로드되는 동안 보여줄 Fallback UI(예: 로딩 스피너, 스켈레톤 상태 등)를 정의할 수 있습니다 [3, 10].
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** [[Error Boundaries]], [[React Suspense]], [[Lazy Loading]]
|
||||
- **Projects/Contexts:** [[Frontend Application Stability]], [[Performance Optimization]]
|
||||
- **Contradictions/Notes:** 소스에 관련 정보가 부족합니다.
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-26*
|
||||
@@ -0,0 +1,33 @@
|
||||
# [[Frontend Debugging]]
|
||||
|
||||
## 📌 Brief Summary
|
||||
프론트엔드 디버깅은 프로덕션 환경이나 개발 과정에서 발생하는 자바스크립트 오류, 메모리 누수, 그리고 불필요한 리렌더링 같은 성능 저하의 근본 원인을 식별하고 해결하는 과정입니다 [1-4]. 현대의 복잡한 프론트엔드 시스템에서는 단순한 콘솔 로그를 넘어 브라우저 개발자 도구, React 전용 프로파일러, 그리고 Sentry나 LogRocket과 같은 클라우드 기반 로깅 및 세션 리플레이 도구를 적극적으로 활용합니다 [2, 5-7]. 또한, React 환경에서는 Error Boundary를 통해 런타임 에러를 격리하여 앱 전체가 멈추는 것을 방지하는 방어적 프로그래밍 전략이 필수적으로 동반됩니다 [8, 9].
|
||||
|
||||
## 📖 Core Content
|
||||
- **메모리 누수(Memory Leaks) 및 힙 메모리 디버깅**
|
||||
- 자바스크립트에서 할당된 메모리가 제대로 해제되지 않고 계속 축적될 때 메모리 누수가 발생하며, 이는 앱의 성능 저하 및 크래시로 이어집니다 [10, 11].
|
||||
- **Chrome DevTools의 Heap Snapshots:** 이를 통해 메모리 덤프를 비교하고 "Detached DOM nodes(분리된 DOM 노드)"나 클로저로 인해 불필요하게 유지되고 있는 객체 참조를 식별할 수 있습니다 [12-15].
|
||||
- **Allocation Timeline:** 애플리케이션과 상호작용하는 동안 실시간으로 메모리가 할당되는 패턴을 추적하여 누수가 발생하는 정확한 시점을 시각적으로 파악할 수 있습니다 [16-18].
|
||||
- 객체 캐싱으로 인한 메모리 누수를 방지하기 위해 일반 객체 대신 가비지 컬렉션이 가능한 `WeakMap`을 활용하는 것이 권장됩니다 [19].
|
||||
|
||||
- **React 렌더링 성능 및 상태 관리 디버깅**
|
||||
- **React DevTools Profiler:** 렌더링이 발생한 컴포넌트, 렌더링 소요 시간, 그리고 렌더링을 유발한 원인(props 또는 state의 변경)을 정확히 분석하여 병목 지점을 찾습니다 [7, 20].
|
||||
- **why-did-you-render:** 개발 환경에서 props나 state의 변경 없이 발생하는 불필요한 리렌더링을 콘솔 경고로 표시해주어, 낭비되는 렌더링을 방지하는 데 유용합니다 [21, 22].
|
||||
- 복잡한 비동기 작업 및 상태를 관리할 때, Context API는 상태 추적이 어렵지만 Redux는 Redux DevTools를 통해 상태 변경 내역을 확인하고 액션을 재현할 수 있는 '시간 여행(Time-travel) 디버깅' 기능을 제공하여 디버깅 속도를 크게 높여줍니다 [23-25].
|
||||
|
||||
- **프로덕션 클라우드 로깅 및 모니터링 도구**
|
||||
- **Sentry:** 오류를 지능적으로 그룹화하고, 콘솔 로그와 네트워크 요청, 사용자 액션을 포함한 Breadcrumb 트레일을 제공하여 오류 발생 전후의 컨텍스트를 파악합니다 [5, 26].
|
||||
- **LogRocket:** 사용자의 화면과 함께 DOM 변경, Redux/Vuex 상태 변화, 네트워크 응답을 비디오처럼 기록하는 세션 리플레이(Session replay)를 제공하여 디버깅 맥락을 완벽히 제공합니다 [6, 26, 27].
|
||||
- **Datadog RUM 및 SigNoz:** 프론트엔드 에러 클릭 시 분산 시스템의 백엔드 트레이스(Traces)와 인프라 메트릭까지 연결하는 End-to-end 추적 기능을 제공합니다 [28-30].
|
||||
|
||||
- **에러 바운더리(Error Boundaries)를 통한 UI 에러 격리**
|
||||
- React 클래스 컴포넌트로 구현되는 Error Boundary는 자식 컴포넌트 트리의 렌더링, 수명 주기 메서드 등에서 발생하는 JavaScript 오류를 잡아냅니다 [9, 31].
|
||||
- 서드파티 위젯이나 복잡한 폼 같은 불안정한 UI 섹션을 Error Boundary로 개별 래핑하면, 오류 발생 시 전체 앱이 충돌하여 "백지 화면"이 표시되는 것을 막고, 친숙한 Fallback UI(대체 화면)를 대신 보여줄 수 있습니다 [8, 32, 33].
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** [[React Error Boundaries]], [[Performance Optimization]], [[State Management]]
|
||||
- **Projects/Contexts:** [[확장 가능한 React 아키텍처 및 폴더 구조 설계]], [[프론트엔드 클라우드 로깅 도구 도입 및 프로덕션 모니터링]]
|
||||
- **Contradictions/Notes:** Error Boundaries는 선언형 컴포넌트 트리 내의 렌더링 에러는 훌륭하게 잡아내지만, 이벤트 핸들러(Event handlers)나 `setTimeout` 등의 비동기 코드에서 발생하는 에러는 감지하지 못하므로, 해당 영역에서는 일반적인 `try/catch` 블록을 별도로 사용해야 합니다 [34, 35]. 또한 Datadog과 같은 통합 가시성 도구는 매우 강력하지만, 인제스트(수집)와 인덱싱(검색 활성화)을 각각 과금하는 이중 가격 모델 때문에 대규모 트래픽에서 비용이 기하급수적으로 증가할 수 있다는 한계가 있습니다 [36, 37].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-26*
|
||||
@@ -0,0 +1,25 @@
|
||||
# [[Frontend Team Collaboration]]
|
||||
|
||||
## 📌 Brief Summary
|
||||
프론트엔드 팀 협업은 일관된 폴더 구조, 명확한 네이밍 규칙, 그리고 체계적인 Git 워크플로우를 통해 다수의 개발자가 충돌 없이 코드를 작성하고 확장 가능한 애플리케이션을 유지보수할 수 있게 하는 프로세스입니다 [1-3]. 소규모부터 엔터프라이즈 규모의 팀까지 효율적으로 협업하기 위해서는 코드 컨벤션의 자동화(거버넌스)와 티켓 기반의 이슈 추적이 필수적입니다 [4, 5]. 기능 중심(Feature-based)의 아키텍처와 시각적 회귀 테스트(Visual Regression Testing)를 도입하면, 코드 충돌을 방지하고 온보딩 시간을 단축하며 프로덕션 환경의 안정성을 높일 수 있습니다 [6-8].
|
||||
|
||||
## 📖 Core Content
|
||||
|
||||
* **협업을 위한 Git 워크플로우 및 PR 리뷰:**
|
||||
프론트엔드 팀은 메인 브랜치를 항상 안정적이고 배포 가능한 상태로 유지해야 하며(메인 브랜치 직접 푸시 금지), 각 작업마다 짧은 주기의 기능 브랜치(Feature Branch)를 생성하여 작업해야 합니다 [9-12]. PR(Pull Request)은 리뷰어가 쉽게 이해할 수 있도록 작게 유지해야 하며, 최소 1명 이상의 동료 리뷰를 거친 후 병합(Squash merge 등)해야 합니다 [13, 14]. Storybook이나 Chromatic과 같은 도구를 통한 시각적 리뷰(Visual review)를 추가하면, 레이아웃이나 색상 등의 UI 회귀(Regression)가 프로덕션에 도달하는 것을 방지할 수 있습니다 [6, 15].
|
||||
* **커밋 메시지와 티켓 추적성 (Traceability):**
|
||||
커밋 메시지는 코드의 변경 내용(what)과 변경 이유(why)를 명확히 설명해야 하며, `feat`, `fix`, `chore` 등을 사용하는 'Conventional Commits' 형식을 따라야 릴리스 노트를 자동화하고 히스토리를 쉽게 파악할 수 있습니다 [14, 16, 17]. 브랜치 이름과 커밋 메시지에 티켓 ID(예: `PROJ-123`)를 포함하면 요구사항과 코드 변경 사항 간의 추적성을 높이고, 코드 리뷰어에게 비즈니스 컨텍스트를 효과적으로 제공할 수 있습니다 [5, 18, 19].
|
||||
* **폴더 구조와 아키텍처를 통한 병렬 작업:**
|
||||
표준화된 폴더 구조는 개발자 간의 불필요한 의사소통 비용을 줄이고, 새 팀원의 온보딩을 가속화합니다 [8]. Feature-Sliced Design(FSD)과 같이 기능(Feature)을 중심으로 폴더를 구성하면, 개발자들이 서로의 코드를 건드리지 않고도 각자의 슬라이스(기능 도메인)에서 병렬로 작업할 수 있어 애자일(Agile) 개발 방식의 확장에 유리합니다 [7, 20-22].
|
||||
* **코드 컨벤션과 자동화된 거버넌스 (Automated Governance):**
|
||||
파일 명명 규칙(예: 파일 이름은 호환성을 위해 `kebab-case`, React 컴포넌트는 `PascalCase`, 변수나 훅은 `camelCase` 사용)을 팀 전체가 일관되게 유지하면 코드를 한눈에 파악하고 충돌을 방지하기 쉽습니다 [23-26]. ESLint, Prettier, Husky 등의 도구를 활용하여 Git 훅 단계에서 린팅과 포맷팅, 타입 검사를 강제하면, 규칙 위반을 자동으로 방지하고 고품질의 코드만 저장소에 병합되도록 만들 수 있습니다 [4].
|
||||
* **팀 규모에 따른 상태 관리 도구 선택:**
|
||||
팀의 규모는 협업 도구 선택에 큰 영향을 미칩니다. 규모가 큰 팀(10명 이상)에서는 Zustand처럼 유연하고 자유도가 높은 도구보다, Redux처럼 엄격한 패턴과 구조(Boilerplate)를 강제하는 도구가 팀원 간의 코드 일관성(예: 일관된 비동기 코드 작성 방식)을 유지하고 디버깅을 쉽게 하는 데 더 적합합니다 [27-30].
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** [[Git Branching Strategies]], [[Conventional Commits]], [[Feature-Sliced Design]], [[Automated Governance]], [[Visual Regression Testing]]
|
||||
- **Projects/Contexts:** [[Small vs Large Frontend Teams]], [[Scalable React Apps]]
|
||||
- **Contradictions/Notes:** 소규모 팀이나 스타트업에서는 자유도가 높은 상태 관리 도구(예: Zustand)가 빠른 개발 속도를 이끌어내지만, 팀이 커짐에 따라 구조적인 강제가 없다면 서로 다른 비동기 처리 패턴이 생겨나 통합의 혼란(Integration chaos)을 초래할 수 있으므로 팀 성장에 맞춰 Redux와 같은 더 견고한 구조로 마이그레이션하거나 엄격한 패턴을 적용해야 합니다 [30-32].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-26*
|
||||
@@ -0,0 +1,25 @@
|
||||
# [[Small Team Development]]
|
||||
|
||||
## 📌 Brief Summary
|
||||
소규모 팀(보통 2~5명) 환경에서 복잡한 프로세스 오버헤드를 최소화하고 빠른 피드백과 안정적인 코드 기반을 유지하기 위한 소프트웨어 개발 및 협업 방식을 의미합니다 [1]. 프론트엔드 및 React 개발 환경에서는 주로 가벼운 기능 분기(Feature-branch) 워크플로우나 단기 트렁크 기반(Trunk-based) 개발을 채택하며, 불필요한 보일러플레이트를 줄일 수 있는 상태 관리 도구를 선호합니다 [2-4]. 이를 통해 코드 충돌을 예방하고 팀원 간의 동기화 및 코드 리뷰를 원활하게 진행할 수 있습니다 [5, 6].
|
||||
|
||||
## 📖 Core Content
|
||||
* **소규모 팀을 위한 Git 브랜칭 전략:**
|
||||
* 복잡한 Git-Flow 방식은 소규모 팀에게 너무 무거울 수 있으므로, **단순한 기능 분기(Feature-Branch) 워크플로우**나 **수명이 짧은 기능 브랜치를 활용하는 트렁크 기반(Trunk-based) 워크플로우**가 가장 적합합니다 [1-3, 7, 8].
|
||||
* `main` 브랜치는 항상 배포 가능하고 안정적인 상태로 보호되어야 하며(직접 푸시 금지), 새로운 기능 추가나 버그 수정 등 모든 작업은 `main`에서 분기한 단독 브랜치(`feature/*`, `fix/*` 등)에서 수행해야 합니다 [1-3, 9, 10].
|
||||
* **커밋 및 PR(Pull Request) 규칙:**
|
||||
* 변경 사항은 커밋당 하나의 논리적 변경만 포함하는 원자적 커밋(Atomic Commits) 형태로 작게 유지해야 코드 리뷰와 문제 추적이 쉽습니다 [9, 11-13].
|
||||
* 모든 변경 사항은 병합 전 PR을 열어 적어도 **1명 이상의 팀원에게 코드 리뷰 및 승인**을 받아야 하며, CI/CD 테스트를 통과해야 합니다 [9-13].
|
||||
* 깔끔한 커밋 히스토리를 유지하기 위해 **스쿼시 병합(Squash & Merge)**을 주로 사용하고, 병합이 완료된 기능 브랜치는 즉시 자동 삭제하도록 설정하는 것이 좋습니다 [9-11, 13].
|
||||
* **소규모 팀의 React 상태 관리 도구 선택:**
|
||||
* 스타트업이나 5명 내외의 소규모 팀이 React 프로젝트를 진행할 때, Redux는 초기 보일러플레이트가 과도하게 느껴질 수 있습니다 [14-16].
|
||||
* 빠른 MVP 개발 및 기능 구현을 위해 가벼우면서도 Redux와 유사한 강력함을 제공하는 **Zustand**가 소규모 팀에게 가장 이상적인 "골디락스(Goldilocks) 솔루션"으로 권장됩니다 [4, 16, 17].
|
||||
* 반면 3~4명 이상의 팀에서 Context API를 전역 상태 관리로 남용하면 리렌더링 폭풍(re-render storm) 등 심각한 성능 문제가 발생하기 쉬우므로 주의해야 합니다 [14, 17, 18].
|
||||
|
||||
## 🔗 Knowledge Connections
|
||||
- **Related Topics:** [[Git Branching Strategies]], [[Feature-Branch Workflow]], [[Trunk-Based Development]], [[React State Management]], [[Zustand]]
|
||||
- **Projects/Contexts:** [[GitHub Flow in Small Teams]], [[React App Prototypes and Startups]]
|
||||
- **Contradictions/Notes:** 단순한 기능 브랜치 구조와 Zustand 같은 유연한 도구는 소규모 팀이 빠르게 움직이기에 최적이지만, 팀 규모가 10명 이상으로 커지고 애플리케이션의 복잡도가 증가하면 구조적 규율이 부족해질 수 있습니다. 이 경우, 대규모 릴리스 관리를 위해 Git-Flow로 마이그레이션하거나, 더 엄격한 상태 관리 패턴을 강제하는 Redux로의 전환을 고려해야 합니다 [8, 15, 16, 19, 20].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-26*
|
||||
Reference in New Issue
Block a user