์ต์ ๋ฒ ํจํด์ ์ฑ
์ ๋ถ์ฐ์ ์ํ ํ์ ํจํด์ ํ ์ข
๋ฅ์ด๊ณ , ์ฃผ๋ก ๋ถ์ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ ์์คํ
์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉํ๋ค.
์ฃผ๋ก ์ด๋ค Subject์ ์ํ ๋ณํ์ ๋ฐ๋ผ Observer๊ฐ ํ์๋ฅผ ์ทจํ๋ ํจํด์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ๋๋ค ๊ทธ๋์ ๊ด์ฐฐ ๋นํ๋ subject์ ๋ค์์ ๊ด์ฐฐํ๋ observer๋ก ๊ตฌ์ฑ๋๋ค.(1:n ๊ด๊ณ)
์ฆ, ๋จ์ผ ํผ๊ด์ฐฐ์(subject)์ ์ํ ๋ณํ์ ๋ฐ๋ผ ๋ค์์ ๊ด์ฐฐ์(observer)๊ฐ ์ก์
(ํ๋, ํ์)๊ฐ ์๊ตฌ๋ ๋ ์ฌ์ฉํ๋ ํจํด์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ต์ ๋ฒ ํจํด(Observer Pattern)์ ํ์ฅํ ๋์์ธ ํจํด์ผ๋ก ๋ฐํ-๊ตฌ๋ ํจํด(Pub-Sub Pattern)์ด ์๋ค. ์ต์ ๋ฒ ํจํด์ด ์ค๋์ ์ฃผ์ธ๊ณต์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ ์ฐจ์ด๋ฅผ ์ค๋ช ํ๋ฉด pub-sub ํจํด์ ๋ณ๋์ ์ด๋ฒคํธ ์ฑ๋๋ก publisher๊ฐ ๋ฐํ์ ํ๋ฉด subscriber๊ฐ ๊ตฌ๋ ์ํ์ผ๋ ์ฒ๋ฆฌํ์ง๋ง, observer ํจํด์ ๋ณ๋์ ์ด๋ฒคํธ ์ฑ๋(์ค๊ฐ ๋งค๊ฐ) ์์ด ๋ฐํ์(Publisher)๊ฐ ๋ฐํ(or ์ํ ๋ณํ)๋ฅผ ํ๋ฉด ๋ฐ๋ก ๊ตฌ๋ ์(Observer, Subscriber)๊ฐ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค. ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ต์ ๋ฒ ํจํด์ ๋ํด ์์๋ณด์.
์ต์ ๋ฒ ํจํด์ ์ค๋ช ํ๋ ค๋ฉด ๋จผ์ ์ต์ ๋ฒ ํจํด ์ ์ฉ ์ ๊ตฌ์กฐ์ ์ ์ฉ ํ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ณ ๋ญ๊ฐ ๋ฌ๋ผ์ก๋์ง ๋น๊ตํ๊ณ ํ์ธํด์ผํ๋ค.

์ ๊ทธ๋ฆผ์ ํํ์ด์ง์ ์ธ์ด ์ค์ ์ ๋ณ๊ฒฝํ์๋, ๊ฐ๊ฒฉ ์ถ๋ ฅ๊ธฐ๋ก ์ธ์ด์ ๋ง๋ ๊ตญ๊ฐ์ ํํ๋จ์์ ์์์ ์ฒ๋ฆฌ ๋ฐฉ์, ํ์จ์ ์ ์ฉํ ๊ฐ๊ฒฉ์ ์ถ๋ ฅํด์ฃผ๋ ์ฝ๋์ ๋ค์ด์ด๊ทธ๋จ์ด๋ค. ๊ทธ๋์ ์ด ๊ธฐ๋ฅ ๊ตฌํ์ ์ํด ํํ์ด์ง ์ธ์ด ๊ด๋ฆฌ ๊ฐ์ฒด์์ ์ธ์ด๊ฐ ๋ณ๊ฒฝ๋ ๋ ๊ฐ๊ฒฉ ๊ณ์ฐ๊ธฐ์ ๊ฐ๊ฒฉ ํ์ ๊ด๋ฆฌ๊ธฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝํด์ค์ ๊ฐ๊ฒฉ ์ถ๋ ฅ๊ธฐ์ ๋ณ๊ฒฝ๋ ์ํ์ ๋ฐ๋ผ ์ถ๋ ฅํด์ฃผ๋๋ก ๋ง๋ค์๋ค.
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ์ ์ ํํ์ด์ง ์ธ์ด ๊ด๋ฆฌ๊ธฐ๋ ๋๋ฉ์ธ์ ์ผ๋ก ๊ด๋ จ ์์ด ๋ณด์ด๋ ๊ฐ๊ฒฉ ๊ณ์ฐ๊ธฐ๊ณผ ๊ฐ๊ฒฉ ํ์ ๊ด๋ฆฌ๊ธฐ๋ฅผ ๋ด๋ถ ๊ตฌ์ฑ์ผ๋ก ๊ฐ์ง๊ณ ์๋ค. ์ฌ์ง์ด ๊ฐ๊ฒฉ ๊ณ์ฐ๊ธฐ์ ํ์ ๊ด๋ฆฌ๊ธฐ์ ๊ตญ๊ฐ ๋ณ๊ฒฝ() ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๊ทธ๋์ ์ธ์ด ๊ด๋ฆฌ๊ธฐ๋ ์๊ธฐ ์ซ์ ๊ฐ์ฒด์ ์์กด์ฑ์ด ์๊ฒจ ๊ฐํ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?? ์๋์ ๊ฐ์ด ๋ฐ๊ฟ๋ดค๋ค.

์ด์ ๊ฐ ๊ฐ์ฒด์ Class์ ๊ทธ ๊ตฌํ์ ์์กด์ฑ์ด ์์ด์ก๋ค. ์ธํฐํ์ด์ค์ ์์กดํ ๊ตฌํ์ผ๋ก๋ง ์ํ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ํ์๋ฅผ ํ ์ ์๋ค. ๊ทธ๋์ ์ธ์ด ๊ด๋ฆฌ๊ธฐ๋ ์ด๋ค ๊ฐ์ฒด์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, subscribeํ ์ต์ ๋ฒ๋ observers์ ์ถ๊ฐํ๊ณ ์ํ ๋ณ๊ฒฝ์ ์ผ๊ด ์ ์ผ๋ก observer ์ธํฐํ์ด์ค์ updateํจ์๋ฅผ ์คํํ๋๋ก ํ์ฌ ์์์ ๊ฐ ํด๋์ค ๊ตฌํ์ ๋ง๊ฒ ์๋๋๋๋ก ๋ณ๊ฒฝ๋ฌ๋ค. ์ธ์ด ๊ด๋ฆฌ๊ธฐ๋ ๋์ด์ ์ด๋ค ๊ฐ์ฒด๊ฐ ๋ญ ํ๋์ง ์๊ด ์์ด ์ํ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ํ์ ์ ๋ฐ์ ํ ์ ์๊ฒ๋์๋ค. ๊ทธ๋์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ก๊ณ ๋ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ค๊ณ๊ฐ observer ํจํด ์ ์ฉ์ผ๋ก ์์ฑ๋์๋ค.
์ต์ ๋ฒ ํจํด์ด ํ๋ก ํธ์๋์์ ์ฐ์ธ ์์๋ก Tanstack Query์ React ๋ฒ์ ์ ๊ฐ์ ธ์๋ค. ์๋ ๋ค์ด์ด๊ทธ๋จ์์ useExternalStore๊ณผ ๊ทธ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ์ฌ์ค ์์ด๋ ๋์ง๋ง ์ด๋ป๊ฒ ์๋๋๋์ง ์ค๋ช ํ๋ ค๊ณ ์ถ๊ฐํ๋ค.(์ค์ ๋ก React Query ๊ตฌํ์ ์ข ๋ ๋ณต์กํฉ๋๋ค!)

queryObserver์ Query๊ฐ ์ด๋ค ์์๋ก React์ ํ๋ฉด๊น์ง ๋ฆฌ๋ ๋๋งํ ์ ์๋๋ก ์ ๋ฐํ๋์ง ์ค๋ช ํด๋ณด๊ฒ ๋ค.(์ค์ ๋ก ์ฝ๊ฐ ๋ ๋ณต์ก!)
useQuery ํ ์ ์ฌ์ฉํ๋ฉด Query์ QueryObserver ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
queryObserver๋ queryKey์ ๋ง๋ Query๋ฅผ subscribe ํจ์๋ก ๊ตฌ๋ ํ๊ฒ ๋๋ค
QueryObserver.subscribe(Query)๋ Query.addObserver(queryObserver or this)๋ก ๊ตฌ๋ ์๋ฅผ ์ถ๊ฐํ๋ค.
Query์ ์ํ ๋ณํ๊ฐ ๋ฐ์ํ๋ฉด ๋ชจ๋ observer์ observer.onQueryUpdate()๋ฅผ ์คํํ๋ค.
queryObserver.onQueryUpdate() ํจ์๋ externalStore์ ๋ฆฌ๋ ๋๋ง์ ์์ฒญํ์ฌ React ์ํ์ ํ๋ฉด์ ๋ฐ๋ ๊ฐ์ ๋ฐ์ํ๋ค.
์ ๊ณผ์ ์์ Query์ QueryObserver๋ ์๋ก ์ต์ ๋ฒ ๊ด๊ณ์์ ์ ์ ์๋ค. Query์ ์ํ ๋ณํ์ ๋ฐ๋ผ Query๋ ๋ด๋ถ ๊ตฌํ์ด ์ด๋ป๊ฒ ๋์๋์ง ์ ํ ๋ชจ๋ฅด๋ QueryObserver์ ๋ด๋ถ ๊ตฌํ๋ ํจ์๋ฅผ ์คํํ๊ฒ ๋์ด ๋์จํ ๊ฒฐํฉ๋ ฅ์ ๊ฐ์ง๋ค. ๋ํ useQueryํ ์ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ QueryObserver๊ฐ ์๊ธฐ๋ฉด์๋ ๊ฐ์ QueryKey๋ฅผ ๊ฐ์ง Query๋ฅผ ๊ตฌ๋ ํ๊ธฐ ๋๋ฌธ์ 1:n ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.
์ต์ ๋ฒ ํจํด์ ์๋ก ์ํธ์์ฉ ํ๋ ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ์ ๋์จํ๊ฒ ํด์ฃผ๋ ๋์์ธ ํจํด์ด๋ค. ์์๋ค์ ๋ณด๋ฉด ์ธํฐํ์ด์ค์๋ง ๋ง์ถฐ ๊ตฌํํ๊ณ ๊ฐ์ฒด๊ฐ ๋ด๋ถ ๊ตฌํ์ ์ ๊ฒฝ์ฐ์ง ์์ผ๋ฉฐ, ์์กด์ฑ์ด ์ค์ด๋ค์ด ๊ฐ์ฒด ์ฌ์ด์ ์ํธ ์์กด์ฑ์ ์ต์ํํ๋ค. ๋ ๊ธธ๊ฒ ์ค๋ช ํ๋ฉด ์ต์ ๋ฒ๋ Observerable์ด๋ผ๋ ํน์ ์ธํฐํ์ด์ค๋ง ๊ตฌํํ์ฌ ๊ตฌ๋ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ๋ง ํ๋ฉด ๋๊ณ , ์ด๋ค ์ต์ ๋ฒ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ผ๋ฉด Observerable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ฉฐ, ์ด๋ค ์ต์ ๋ฒ์ ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝํ๋ ค๊ณ ํด๋ ๊ตณ์ด Subject๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๊ณ , ์ต์ ๋ฒ๋ ์๋ก ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์ต์ ๋ฒ๋ ๋ค๋ฅธ Subject๋ฅผ ๊ตฌ๋ ํ ์๋ ์๋ค. ์ด๋ ๋ฏ ์ต์ ๋ฒ ํจํด์ ์ด๋ค ๊ฐ์ฒด์ ์ํ๋ณํ์ ๋ฐ๋ผ ์ฐ๊ด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํธ ์์ฉ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ฉด ๋ ๊ฐ์ฒด ์งํฅ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค!!