jhpka's blog

useAtomValue는 atom mount 시 rerender cascade 유발

Admin User

useAtomValue는 atom mount 시 rerender cascade 유발

jotaiStore.get()으로 직접 가져오기

이건 조금 더 실전 감각이야.

───

먼저 useAtomValue

const value = useAtomValue(someAtom);

이건 뜻이:

• 이 컴포넌트가 someAtom 값을 읽음 • 동시에 구독함 • 그래서 someAtom 바뀌면 이 컴포넌트 재렌더

이건 정상 동작이야.

───

근데 왜 문제될 수 있냐

어떤 컴포넌트나 hook에서 "난 그냥 지금 한 번 값만 필요해" 인데도

const value = useAtomValue(someAtom);

이렇게 해버리면 그 순간부터 구독자가 돼버려.

그러면 나중에 그 atom 바뀔 때마다 이 컴포넌트가 다시 렌더되고, 그게 또 자식들까지 퍼져서 rerender cascade가 생길 수 있어.

───

rerender cascade가 뭐냐

하나의 구독 때문에

• A 재렌더 • A 안의 B도 다시 실행 • B 안의 C도 다시 실행

이런 식으로 연쇄적으로 렌더가 퍼지는 현상이야.

물론 React가 다 최적화는 해주겠지만, 불필요하게 커지면 성능이나 추적성이 안 좋아짐.

───

그래서 jotaiStore.get()은 뭐냐

이건 말 그대로

"구독하지 말고, 지금 값만 그냥 읽자"

는 거야.

예를 들면:

const store = useStore(); const value = store.get(someAtom);

이건:

• 현재 값을 읽기는 함 • 하지만 React hook처럼 구독해서 재렌더 연결하진 않음

즉 snapshot read 느낌.

───

비유

useAtomValue

뉴스 구독 신청

• 새 소식 오면 계속 알림 옴

store.get(atom)

지금 기사 한 번 열람

• 읽고 끝 • 알림 구독 안 함

───

이 프로젝트 주석 뜻

주석에서 말한 건 대충 이거야:

"여기서 useAtomValue 쓰면 이 hook/component가 atom 구독자가 돼서 쓸데없이 ChatView 쪽 렌더를 계속 흔들 수 있으니, 그냥 필요한 순간에만 store.get()으로 읽자"

즉 실시간 반응이 필요 없는 값은 구독하지 말자는 최적화 전략이야.

───

한 번에 요약

atomWithLocalStorage

상태를 localStorage에도 저장해서 새로고침 후에도 유지

atomFamily

키별로 독립된 atom을 여러 개 만들기 위한 패턴

useAtomValue vs store.get()

• useAtomValue = 읽기 + 구독 + 값 바뀌면 재렌더 • store.get() = 지금 값만 1회 읽기, 구독 없음

댓글을 불러오는 중...