Learning Points
- Design Pattern
- Redux
- React-Redux
📌 Design Pattern
디자인 패턴: 설계 간 자주 발생하는 문제에 대한 모범 답안
✏️ Design Pattern을 사용하는 이유
1. 검증된 해결책
- 바퀴를 재발명 하지 마라 (Don't reinvent the wheel)
- 필요한 것을 매번 만들지 말고, 이미 만들어져 있는 것을 활용해라
2. 효율적인 소통 방식
- 개발을 하면서 원활한 소통을 위해서는 체계적인 규칙과 용어가 필요
- 디자인 패턴을 사용하면, 매번 모든 디텥일한 사항들을 장황하게 설명할 필요 없이 약속해둔 용어로 표현할 수 있기에 좀 더 명확하고 확실하게 소통할 수 있음
![](https://velog.velcdn.com/images/vanessa/post/ba6ece7b-bf6f-423d-8c3e-610eb94c3755/image.png)
![](https://velog.velcdn.com/images/vanessa/post/6605f9f1-b539-407c-a537-1dbc5b7c0b14/image.png)
3. 유지보수 용이
- Design === 설계
- 검증된 디자인 패턴들은 코드 안에서 각자 코드들이 영역이 분리해서 관리하도록 설계되어 있음
- 변경사항이 발생하면 수정이 필요한 부분만 수정하면 되기에 유지 보수에 용이
📌 Design Pattern의 종류
✏️ MVC
- 프로젝트의 구성 요소를 역할에 따라 Model, view, controller 세 가지로 나눠서 관리하는 패턴
- Model -> 데이터
- View -> 사용자에게 보여지는 UI를 담당
- Controller는 사용자의 Action에 의해 이벤트를 감지하고 처리하는 역할 즉, Model or View를 업데이트 하는 로직을 담당
- 각 구성요소들의 관심사의 분리(SoC, Separation of Concern)
![](https://velog.velcdn.com/images/vanessa/post/f6f8df8a-2eea-4fb7-a9f9-c1e66e13f286/image.png)
✏️ MVC 한계
![](https://velog.velcdn.com/images/vanessa/post/cde44623-a503-4e90-97f6-fdf948bf5acd/image.png)
Facebook
- 메시지에서 안 읽은 메시지가 있다는 표시가 있는데, 들어가 보면 안 읽은 메시지가 없는 버그가 발생
- 고치려고 했지만 MVC의 양방향성으로 인해 발생하는 연쇄적인 변화로 인해 프로그램의 동작을 정확히 예측하기 어렵기에 지속적 버그 발생
- 이런 버그가 계속 발생해 새로운 종류의 디자인 패턴을 만듦
✏️ MVC
![](https://velog.velcdn.com/images/vanessa/post/5083e093-c322-412a-9bd9-d3c5bca8ea7e/image.png)
Action
- 어떤 변화를 일으키고 싶은지 설명하는 단순한 자바스크립트 객체
Dispatcher
Store
- 데이터의 저장소 역할, dispatch로 전달 받은 Action에 따라서만 데이터를 변경, 그외의 변경은 허용하지 않음
View
- 데이터를 UI로 표현하는 역할, Store를 구독하고 있다가 데이터가 변경되면 UI에 반영
✏️ Design Pattern Summary
![](https://velog.velcdn.com/images/vanessa/post/e0403124-3898-4abf-b47e-575dc9ab9a9f/image.png)
📌 Redux
- 자바스크립트 앱을 위한 예측 가능한 상태 컨테이너
- 단방향 데이터 흐름을 이용해 예측 가능하고 일관적인 상태 컨테이너의 역할을 제공하는 라이브러리
- Flux 패턴에 영감을 받아서 Dan. Abramov가 개발
- Flux는 하나의 패턴(개념) 이 Flux 패턴을 쉽게 적용할 수 있다
✏️ Redux 원칙
- Single source of truth
- State is read only
- Changes are made wtih pure functions
✏️ Single source of truth
- 애플리케이션의 모든 상태(State)는 하나의 객체 트리 구조로 저장됨
- 여러개의 저장소를 관리 하는 것이 아니다
![](https://velog.velcdn.com/images/vanessa/post/d91ed5ed-287a-4147-bd96-e80eea5a313f/image.png)
✏️ State is read only
- State는 읽기 전용, Store에 직접 접근해서 State를 수정할 수 없다
- State를 수정할 수 있는 유일한 방법은 Action 객체를 Dispatch를 통해서 전달
![](https://velog.velcdn.com/images/vanessa/post/617c0730-dc46-40c7-9072-9d8bc3214ade/image.png)
✏️ Changes are made wtih pure functions
- Redux State의 유일한 변경 방법: Action 객체를 Dispatch를 통해서 Store에 전달하는 것
- 전달된 Action을 통해서 State를 변경해야 함. 이 때 모든 변화는 순수 함수로 작성 되어야 한다
- 순수 함수: 사이드 이팩트가 없는 함수. 같은 input에 대해 같은 output을 보장할 수 있음
![](https://velog.velcdn.com/images/vanessa/post/a728e0b4-6293-44f9-a8a8-50c575b8ba09/image.png)
- 순수 함수를 이용해서 상태의 변화를 예측 가능하게 할 수 있음
- 순수 함수를 Reducer라고 부름. 이 전의 State와 action 객체를 input으로 받아서 새로운 State를 return하는 함수
![](https://velog.velcdn.com/images/vanessa/post/12f9aaa7-d2f7-49ed-9b69-18ebf89e1d93/image.png)
✏️ Redux 데이터 흐름
![](https://velog.velcdn.com/images/vanessa/post/8ad9d3a9-bd3c-4ad8-969e-ed5ff61e7732/image.png)
![](https://velog.velcdn.com/images/vanessa/post/8fa27e13-468c-4e44-a264-31a47fa4e8c0/image.png)
✏️ Redux의 주요 개념
![](https://velog.velcdn.com/images/vanessa/post/7e202310-196c-4023-af54-afad61244ba3/image.png)
![](https://velog.velcdn.com/images/vanessa/post/f4139bc7-c32e-4338-bccc-b94ebdf66c76/image.png)
![](https://velog.velcdn.com/images/vanessa/post/edcfcdb6-54ca-46ab-a2c2-da949c3a45a0/image.png)
![](https://velog.velcdn.com/images/vanessa/post/8c45fb8c-17d0-4da1-8614-301990b86437/image.png)
![](https://velog.velcdn.com/images/vanessa/post/7f04ebcc-3bc9-4545-b519-914e2c499d55/image.png)
![](https://velog.velcdn.com/images/vanessa/post/73a31b4e-9c29-4a8c-83c0-69372ab0d429/image.png)
✏️ Redux Summary
![](https://velog.velcdn.com/images/vanessa/post/7f610f7b-4589-46ac-abe0-9102434fc544/image.png)
📌 React-Redux
![](https://velog.velcdn.com/images/vanessa/post/efd27acc-3a87-49ea-a19e-be5126dc2608/image.png)
✏️ React-Redux를 사용하는 이유
![](https://velog.velcdn.com/images/vanessa/post/3f5b2301-d13c-44fa-bf9d-4f19a3ae1dd8/image.png)
✏️ React-Redux Summary
![](https://velog.velcdn.com/images/vanessa/post/db2fb7c4-a089-432c-b6af-c2a4542208eb/image.png)