Skip to content

Conversation

@Seoin02
Copy link

@Seoin02 Seoin02 commented Dec 16, 2024

공부한 것

  • Observer 패턴
    • 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록해 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴 입니다. 특히, 상태 변화가 있는 객체만 감지한다는 게 중요합니다.
    • 무한 스크롤 구현 시 Observer 패턴을 사용해봤지만, 이번에 더 잘 이해할 수 있었습니다.
  • 중앙 집중식 상태관리를 구현해보며 원리를 알게 됐습니다. 그러면서 이를 사용해야 할 떄에 대한 고민이 들었습니다.
  • Flux 패턴
    • 단방향 데이터 흐름(Dispatcher(전달) -> Store(Action 전달받아 상태 업데이트) -> View -> Action(객체) -> Dispatcher(전달))
  • 상태 관리에서 상태의 '불변성' 유지
    • frozenState는 상태를 외부에서 직접 변경할 수 없게 해 상태 변경 흐름을 명확히 하고, 사이드 이펙트 감소 / 캡슐화
    • 상태가 변경될 때마다 새로운 상태 객체를 생성하면 이전 상태와 새로운 상태를 쉽게 비교하고 업데이트 할 수 있습니다.
    • 불변성을 유지하는 게 React�의 동작원리와 비슷하다고 생각했습니다. 불변성을 유지하면 상태 변화를 추적하기 쉬워지고, 이전 상태를 쉽게 재사용할 수 있습니다.

고민점

  • 중앙 집중식 상태관리를 해본 경험이 있나요? 저는 학습용으로 Redux를 써본 적은 있지만, 규모가 크지 않고, 복잡하지 않아서 오히려 보일러 플레이트가 늘었다고 생각합니다. 그래서 동현님의 중앙 집중식 상태관리 사용 경험이 궁금합니다.

@Seoin02 Seoin02 added the ✨ Feature ✨ Feature label Dec 16, 2024
@Seoin02 Seoin02 self-assigned this Dec 16, 2024
@D5ng
Copy link
Contributor

D5ng commented Dec 16, 2024

  • 중앙 집중식 상태관리를 해본 경험이 있나요? 저는 학습용으로 Redux를 써본 적은 있지만, 규모가 크지 않고, 복잡하지 않아서 오히려 보일러 플레이트가 늘었다고 생각합니다. 그래서 동현님의 중앙 집중식 상태관리 사용 경험이 궁금합니다.

사용 경험은 있었어요. 저도 Redux를 써본 적이 있었고 (Redux, RTK 둘다 사용해봄), Zustand도 중앙 집중식 상태관리라고 생각해요. 결국 상태를 한 곳에서 관리한다는 맥락은 같다고 생각해요.

리덕스는 강제하는 패턴이 있다보니 보일러 플레이트가 느는게 단점이라고 생각하긴 하지만, 결국 예측 가능성인 부분에서는 저는 좋다라고 생각합니다!

하지만 요즘은 더 간결한 것을 선호하는 시대인것 같아요. Zustand 처럼요! 배우기도 쉽고, 코드도 짧은게 개발자들한테 사랑 받는 이유지 않을까 싶네요

Copy link
Contributor

@D5ng D5ng left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 개인적으로 이번 PR이 조금 아쉬웠어요. 왜냐하면 서인님은 Redux를 최근에 직접 써보셔서 더 Redux 스럽게 만들 줄 알았어요.

제 주관적으로는 해당 아티클이 정답은 아니라고 생각해요. Redux의 큰 틀을 설명해주지만 여전히 많은 문제가 있다고 생각해요.

  1. 객체만 상태를 등록할 수 있다. (제가 찾아본 상태관리에선 이런건 없었어요.)
  2. store가 observer를 제공하지 않는게 좋지 않다고 생각해요. (store랑 observer랑 따로 분리된 느낌이 강해요, 특히 import할 때 따로 불러오는게 이상합니다. DX적으로 좋지않은것 같아요.)

또 하나 아쉬운건, 스토어는 결국 어떤 상태도 관리할 수 있도록 해줘야하는데 지금은 객체의 키 값이 a, b 만 가능한게 아쉽습니다.

현재 아티클에서 많은 의심을 가지면 더 좋을것 같아요

[key: string]: number;
}

export default class Component<
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IStateTComponentData가 어색해보입니다. 하나로 통일 해야하지 않을까? 라는 생각이 들어요.

요즘은 인터페이스 앞에 I를 붙이지 않는다는 네이밍 컨벤션을 본적 있어서 관련한 아티클을 봐보면 좋을것 같아요

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 찾아보니 헝가리안 표기법을 지양하는 개발자들이 많군요 참고할게요

(state?: IReducerState, action?: TAction): IReducerState;
}

export const createStore = (reducer: IReducer) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 코드를 보면 createStore에는 상태의 키가 고정이 되어있어요. 이렇게되면 커스터마이징한 객체를 사용하지 못할것 같아요

image

즉 스토어는 어떤 타입이던, 어떤 키값이던 사용할 수 있어야하는데, 현재 코드는 객체의 키값인 { a, b } 만 사용할 수 있어요. 타입을 제네릭으로받아 해당 타입들을 추론할 수 있도록 바꿔야할 것 같아요.

추가적으로 현재 코드는 객체만 상태를 지정할 수 있도록 하였는데, Redux나 Zustand는 문자나 넘버타입도 가능하도록 되어있어요.

@@ -0,0 +1,28 @@
import { createStore } from './core/ReduxStore';

export type TAction = {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

type은 옵셔널이 되면 안돼요. 왜냐하면 Action을 사용할 때 type은 필수여야만 합니다! 리덕스랑 타입스크립트를 사용해보시면 type이 옵셔널이 아니라는것을 알 수 있어요.

fn();
currentObserver = null;
};
export const observable = <T extends Record<string, any>>(obj: T): T => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

옵저버 패턴에는 subscribe, unsubscribe, notify가 보통은 필수적으로 들어가는데, 현재 코드에서는 unsubscribe가 없네요. 이런 부분도 고민해보면 좋을것 같아요.

export const SET_A = 'SET_A';
export const SET_B = 'SET_B';

export const store = createStore((state = initState, action: TAction = {}) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TAction = {} 부분에 기본 값으로 빈 객체가 들어가면 안될것 같아요. 결국 액션은 dispatch로 스토어의 값을 변경하는 목적이지만, 작성 규칙에서 엄격하다고 볼 수 없을것 같아요.

<!doctype html>
<html lang="en">
<!DOCTYPE html>
<html lang="ko">
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋아요 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature ✨ Feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants