
1. A Component에서 Store에 있는 구독 중
2. A Component에서 Action dispatch
3. Reducer에서 새로운 상태 값을 만든다(실제 data 수정이 일어난다)
4. 변경된 새로운 상태 값은 Store 저장된다
5. Store에서 구독 중인 Component에 수정된 데이터를 넘겨준다(알려준다)
6. A Component re-rendering
7. DOM에 변경된 data 확인

1. 클라이언트가 Deposit $10 을 버튼 클릭
2. Click 이벤트가 발생하게 되며, Event Handler에 있는 Dispach가 {Action: Deposit, payload:$10} 이라는 Action(명령지)을 담아 Store 안에 있는 Reducer에게 정보 전송
3. 받은 Action 을 토대로 State에 있는 값을 꺼내어 요청한 Action(명령)을 수행 후 $10라는 값이 다시 State에 작성
(이 때 기존에 가지고 있던 [State]($0)는 사라지며, 동일한 이름으로 다시 새로 쓰여지게 된다.)
4. 변경된 State 값으로 리렌더링
옵셔널 체이닝(optional chaining) ?.을 사용하면 프로퍼티가 없는 중첩 객체를 에러 없이 안전하게 접근할 수 있다.
옵셔널 체이닝은 언제 사용할까? 사례를 보자. 사용자가 여러 명 있는데 그중 몇 명은 주소 정보를 가지고 있지 않다고 가정할 때, user.address.street를 사용해 주소 정보에 접근하면 에러가 발생할 수 있다.
let user = {}; // 주소 정보가 없는 사용자
alert(user.address.street); // TypeError: Cannot read property 'street' of undefined
?.가 등장하기 전에는 이런 문제들을 해결하기 위해 && 연산자를 사용하곤 했으나, 이럴 경우 코드가 매우 길어진다는 치명적인 단점이 있다.
let user = {}; // 주소 정보가 없는 사용자
alert( user && user.address && user.address.street ); // undefined, 에러가 발생하지 않습니다.
?.은 ?.'앞’의 평가 대상이 undefined나 null이면 평가를 멈추고 undefined를 반환한다.
let user = {}; // 주소 정보가 없는 사용자
alert( user?.address?.street ); // undefined, 에러가 발생하지 않습니다.
let user = null;
alert( user?.address ); // undefined
alert( user?.address.street ); // undefined
< form > 태그 내부에 존재하는 모든 < button > 태그는 클릭 시 기본적으로 < form >을 전송하는 submit 이벤트를 발생시킨다. type="submit" 이라는 속성을 별도로 지정하지 않아도 자동으로 submit 이벤트가 발생하는데, 그 이유는 < form >태그 자체가 기본적으로 작성된 폼을 서버로 전송하는 역할을 할 시 해당 페이지는 reload가 진행되기 때문에 새로고침되어 리덕스 데이터가 초기화 되는 것이다.

<form><form>장점:
단점: