렌더링의 멱등성에 대한 고찰
주: 해당 글은 프론트엔드 개발에서 사용하는 컴포넌트 개념을 기준으로 작성됩니다.
지난 화 줄거리
컴포넌트를 정확하게 두 요소로 분리해주세요.
A + B = "컴포넌트"
많은 키워드가 나오기 시작했다...
(궁금하면 이전 글을 참고하시오)
항상 꼬리가 꼬리를 무는 기술 얘기는 모두의(?) 기분을 좋게 만든다. 컴포넌트를 논할 때 UI(화면)와 State(상태) 라는 키워드가 계속 등장했는데, 필자는 상태관리와 컴포넌트 간의 어떤 연관관계가 있을지 문득 궁금해졌다.
도원:
결국 컴포넌트는 "상태" 라는 키워드를 벗어날 수 없는 것 같아요.
화면을 그려주는 코드 + 화면 데이터를 처리하는 코드 (aka 비즈니스 로직)
보편적으로 이 두가지 요소로 컴포넌트를 바라볼 수 있는 것 같네요.
그렇다면 상태관리를 잘 한다는 건 어떤 의미일까요?
ex: "화면을 잘 그려주고, 화면에 보여줄 데이터를 잘 처리한다".
수많은 JD에서 "능숙한 상태관리 경험이 있으신 분"이라는 본적이 있다. 잘하는 프론트엔드 개발자에게 상태관리를 잘하는 건 너무 당연한 일이기 때문이다. 그렇다면 상태관리라는 개념을 분석해볼 가치가 있다고 생각했다.
1차토론 - 보성 & 도원
보성: 상태 관리를 잘한다라... 상태의 흐름이 예측 가능하면 좋은 상태 관리 아닐까요? 전역 상태 대신에 프롭스 드릴링 같은 단방향 구조가 추적하기 쉽고 예측하기 쉽듯이, 어떤 상태의 이전과 다음의 상태들이 예측 가능한 구조들이라면 괜찮은 상태가 아닐까.
도원: "좋은 상태관리 흐름/구조를 만들 수 있다"로 이해하면 될까요?
보성: 네 이해하신바가 정확합니다.
도원: 그렇다면 컴포넌트 입장에서 "상태관리를 잘한다"는 어떤 개념으로 다가가면 될까요, 바꿔서 질문하자면 컴포넌트를 사용하는데, 왜 상태관리를 잘해야할까요? (발제1)
왜 상태관리를 잘해야하는가?
보성: 컴포넌트가 상태에 강하게 의존하고 있으니까 아닐까요, 바꿔 말하자면 컴포넌트를 관리하는 상태가 예측 불가능하면 예측 불가능한 컴포넌트가 되어버리는거죠.
도원: 예측 불가능한 컴포넌트는 버려질까요?
보성: 예측 불가능한 컴포넌트를 사용하는 서비스는 버려질 것 같아요.
도원: 예측 불가능하게 구현된 컴포넌트는 애초에 "컴포넌트" 로서의 가치가 떨어진다는 얘기군요. 프로젝트 리소스 로서 가치가 떨어지니깐, 그럼 상태관리를 해준다는건, "컴포넌트들을 관리하는 것"과 동일 시 할 수 있겠어요. 물이 고이지 않고, 공기를 순환시키듯이.
보성: 어렵네요 두 가지를 분리하는게
도원: 뭔가 애매한 어딘가에 걸쳐있는 느낌이에요.
보성: "하나의 컴퍼넌트의 지역적인 상태인가, 컴퍼넌트끼리 전달되는 shared한 상태인가" 가 중요할 것 같기도하네요.
깜짝 등장한 준호: 상태에 벗어날수 있죠! 헤드리스! 일부러 벗어나게 의도한거지만, 프롭스로 받는것도 상태라고 취급하면…종속된다고 볼수있지만.
도원: 상태라는 개념에서 파생된 내용이기에 벗어나기 어렵다라고 표현해봤어요. "상태 안떠오르기" 는 불가능 하니깐요.
다시 사라지는 준호: 상태 vs 안상태...
도원: (보성의 local/shared 글을 멘션하며) local / global / lexical 은 뭔가 결국 "상태" 라는 속성이 컴포넌트에 존재하고 있다는거잖아요?
Component {
state: local / global / lexical ?
}
도원: 속성 값 관리를 누구에게 위임할거냐, 재무를 개인 회계사에게 맡길거냐, 직접 할거냐, 요런 느낌. (만지작 대며 코드를 수정한다)
Component {
UI : UI(state) + stateless UI
상태: local / lexical / global
}
도원: 결국 그건가. UI(state) = Component
보성: 그렇죠, 함수로도 표현할 수 있지만, 그림으로 표현하면 말씀하신것처럼 다양한 범위로 관리되는 상태를 가지고 UI를 그려내는 그런 모습이 보이네요.
혼잣말을 하는 도원: 프론트엔드의 역할이 단순히 데이터를 보여주는게 아니라 유저의 context(맥락 또는 행동)을 추적하고, 지속적으로 서비스를 제공하는 행위를... 말하다 보니까 뭔가 복잡하네요.