셀렉터, 최선인가?
제3화
발행일: 2025년 05월 17일
거대 스토어의 관리 문제 외에도, 다이시 카토의 마음 한구석에는 또 다른 미묘한 가시가 박혀 있었다. 그것은 바로 Zustand의 심장과도 같은 기능, 셀렉터(Selector) 함수였다.
셀렉터. Zustand가 불필요한 렌더링의 늪에서 벗어날 수 있었던 핵심 열쇠. 거대한 상태 객체 속에서 오직 자신이 필요한 데이터 조각만을 정확히 골라내어 구독하게 해주는 마법 같은 장치. 카토는 자신이 고안한 이 메커니즘에 여전히 큰 자부심을 가지고 있었다.
“이것 덕분에 Context의 악몽에서 벗어날 수 있었지.”
그는 과거의 고통을 떠올리며 셀렉터의 강력함을 다시 한번 인정했다. state => state.user.profile.address.zipCode
와 같이 아무리 깊숙한 곳에 있는 데이터라도, 셀렉터를 이용하면 정확히 그 값의 변경만을 감지하여 컴포넌트를 업데이트할 수 있었다. 마치 외과 의사의 메스처럼 정교하고 효율적인 도구였다.
하지만… 완벽하다고 생각했던 그 도구에도 아주 미세한, 그러나 카토의 예민한 감각에는 계속해서 거슬리는 부분이 있었다.
“항상 함수여야만 하는가?”
문제는 셀렉터의 ‘형식’이었다. Zustand에서 상태의 일부를 가져오려면, 개발자는 항상 state => state.some.value
와 같은 형태의 함수를 useStore
훅에 전달해야 했다.
물론 이 방식은 명확하고 강력했다. 복잡한 계산이나 여러 상태 값을 조합하여 새로운 값을 만들어내는 파생 상태(derived state)를 만들 때도 이 함수형 접근 방식은 빛을 발했다.
하지만 아주 단순한 경우, 예를 들어 단순히 state.user.profile.name
이라는 값 하나만 가져오고 싶을 때조차도, 어김없이 state => state.user.profile.name
이라는 함수를 작성해야 했다.
const name = useStore((state) => state.user.profile.name);
const email = useStore((state) => state.user.profile.email);
const isLoggedIn = useStore((state) => state.auth.isLoggedIn);
“음…”
카토는 자신의 코드나 다른 프로젝트의 코드를 살펴보면서, 이런 단순한 접근을 위한 셀렉터 함수들이 반복적으로 나타나는 것을 발견했다. 이것은 useReducer
의 보일러플레이트와는 다른 종류의 문제였다. 코드가 길어지거나 복잡해지는 것은 아니지만, 아주 약간의 ‘정형화된 수고’가 계속해서 요구되는 느낌. 마치 매번 문을 열 때마다 간단한 암호를 입력해야 하는 것과 같은 미묘한 번거로움이었다.
궁극의 간결함과 직관성을 추구하는 그의 개발 철학에는 이 작은 걸림돌조차도 성가시게 느껴졌다.
‘상태 값 자체를… 마치 변수처럼 직접 참조할 수는 없을까?’
그의 머릿속에 새로운 질문이 떠올랐다. state => ...
라는 함수라는 매개체를 거치지 않고, 상태 조각 그 자체에 더 직접적으로 접근하고, 그 변경을 감지하는 방법. 마치 지역 변수 const name = 'Daishi'
처럼, 상태 user.name
에 더 가깝게 다가갈 수는 없을까?
이것은 단순한 구문 설탕(syntactic sugar)의 문제가 아니었다. 상태를 바라보는 관점의 전환에 대한 고민이었다. 상태를 ‘꺼내와야 하는 대상’이 아니라, ‘직접 참조할 수 있는 대상’으로 만들 수 있다면, 개발 경험은 한 단계 더 직관적으로 변할 수 있지 않을까?
물론, 어떻게 구현할지는 막막했다. 함수라는 명시적인 장치 없이 어떻게 필요한 부분만 선택적으로 구독하고, 의존성을 추적할 것인가? 수많은 기술적인 난관이 예상되었다.
하지만 그 질문 자체는 카토의 마음속에 깊이 뿌리내렸다. 셀렉터는 분명 Zustand의 핵심이자 강력한 무기였지만, 어쩌면 그것조차도 ‘더 나은’ 방법으로 개선될 여지가 있는 것은 아닐까?
작은 돌멩이 하나가 연못에 파문을 일으키듯, 셀렉터에 대한 이 미묘한 아쉬움은 그의 탐구심에 다시 한번 불을 지폈다. 상태 관리의 더 근본적인 형태, 더 직관적인 접근 방식에 대한 갈망. 그것은 곧 그의 머릿속에서 잠자고 있던 ‘원자(Atom)’라는 개념을 다시 수면 위로 끌어올리는 계기가 될 터였다. 완벽해 보였던 왕국에도 개선의 여지는 남아 있었고, 카토의 여정은 다시 한번 새로운 방향으로 판을 틀 준비를 하고 있었다.