initCart가 저장 값을 읽습니다
localStorage의 JSON을 초기 상태로 사용합니다. 파싱 실패 시 빈 장바구니로 돌아가 앱이 멈추지 않게 합니다.
`CartProvider`는 초기 장바구니를 복원하고, reducer로 상태를 바꾸며, 변경된 결과를 다시 저장합니다. 화면 컴포넌트는 상태를 직접 고치지 않고 dispatch만 호출합니다.
localStorage의 JSON을 초기 상태로 사용합니다. 파싱 실패 시 빈 장바구니로 돌아가 앱이 멈추지 않게 합니다.
추가, 삭제, 수량 변경은 액션으로 표현됩니다. reducer는 이전 배열을 직접 수정하지 않고 새 배열을 반환합니다.
제품 목록은 dispatch를 쓰고, 장바구니 요약은 cartState를 읽습니다. props drilling 없이 같은 상태를 기준으로 렌더링합니다.
cartState가 바뀔 때만 저장소에 기록합니다. 새로고침 후에도 같은 장바구니로 시작하는지 확인합니다.