셀렉터, 최선인가?

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)’라는 개념을 다시 수면 위로 끌어올리는 계기가 될 터였다. 완벽해 보였던 왕국에도 개선의 여지는 남아 있었고, 카토의 여정은 다시 한번 새로운 방향으로 판을 틀 준비를 하고 있었다.