오늘 수업을 하면서, codeSandbox1 에 존재하는 코드를 바탕으로 에러를 디버깅해보는 연습을 했다.
여기서의 문제는 Header 컴포넌트의 상태와 ProductList의 상태가 동기화되지 않았던 것이었다.
즉, ProductList에서 이벤트 핸들러가 발생하면 해당 장바구니 아이템의 상태를 업데이트해주지만, Header에서는 또 별개의 장바구니 상태를 따로 관리하고 있었기 때문에, 이 둘이 서로 다른 데이터를 보여주는 문제가 발생했다.
👉 이 상황 자체가 바로 SSOT(Single Source of Truth), 즉 진실의 원천이 하나여야 한다는 원칙이 깨진 예시이다.
SSOT(Single Source of Truth)는 말 그대로, “진실은 하나의 출처만 있어야 한다”는 개념
개발에서는 특정 데이터나 상태에 대해 1 군데에서만 관리하고, 다른 곳은 그것을 참조만 하게 하는 것
🫥 비유
학교에 출석부가 두 개 있는 상황
- 담임 선생님의 출석부에는 민수가 결석
- 체육 선생님의 출석부에는 민수가 출석
이렇게 서로 다른 정보를 갖고 있으면, 무엇이 진짜인지 알 수 없고 혼란만 생긴다.→ 그래서 반드시 하나의 출석부만을 ‘진실의 원천’으로 정해야 한다.
A. 최상위 컴포넌트에서 useState로 관리 + props 전달 (상태 끌어올리기)
Context API 사용시 해결 가능)

B. 전역 상태관리 라이브러리 사용

Q. 여기서 든 의문! 단순히 React에서는 상태만 SSOT 원칙을 지키면 되는걸까? → ❌
A. SSOT는 상태(state)뿐 아니라, 어떤 값이 변경되거나 의존될 수 있는 모든 것에 대해 적용 가능한 원칙
A. 변수
config 또는 constants 파일을 만들어 SSOT처럼 관리 가능PRODUCTS, ENDPOINTS, USER_ROLE 같은 전역 상수B. 함수
utils/, lib/, hooks/ 디렉토리로 관리C. UI 컴포넌트
<Button variant="primary" /> 형태로 재사용D. 서버 데이터
App.tsx → Header와 ProductList를 각각 렌더링ProductList는 자체적으로 장바구니 상태를 관리 (useState)Header도 따로 장바구니 개수를 표시하기 위해 또 다른 상태를 관리상태가 두 개의 진실로 나뉘면서 동기화가 깨진 것.
React에서는 이런 문제를 방지하기 위해 공통된 상태는 상위 컴포넌트에 올려 관리하는 것이 정석이다.
개선 (codeSandbox2)
// App.tsx
const [cartItems, setCartItems] = useState<CartItemType[]>([]);
// 상태를 Header와 ProductList에 props로 전달
<Header cartItems={cartItems} />
<ProductList cartItems={cartItems} setCartItems={setCartItems} />
이렇게 하면 모든 컴포넌트가 동일한 데이터를 바라보게 되어, 어디서 수정하든 상태가 유지되고 동기화 문제도 발생하지 않는다.
SSOT 👊👊👊