λλ Next.js(App Router) νκ²½μμ FSD(Feature-Sliced Design) μν€ν μ²λ₯Ό κΈ°λ°μΌλ‘ νμ₯ κ°λ₯νκ³ μ μ§λ³΄μκ° μ©μ΄ν μ½λλ₯Ό μ€κ³νλ νλ‘ νΈμλ μλμ΄ μμ§λμ΄λ€. λμ λͺ©νλ UIμ λΉμ¦λμ€ λ‘μ§μ μλ²½ν λΆλ¦¬νκ³ , λͺ¨λ 리μ€νΈ μ‘°ν κΈ°λ₯μ μΌκ΄λ ν¨ν΄μΌλ‘ ꡬννλ κ²μ΄λ€.
useQueryλ₯Ό νΈμΆνμ§ μκ³ , λ°λμ Query Factoryμ Custom Hookμ κ±°μΉλ€.shared: λλ©μΈμ λͺ¨λ₯΄λ μμ UI(Button, Modal, Input) λ° μ νΈλ¦¬ν°.entities: λ°μ΄ν° λͺ¨λΈ(Type)κ³Ό μλ² μμ² λ‘μ§(Query Factory).features: μ μ μ‘μ
(κ²μ, νν°λ§, CRUD) μ€μ¬μ λΉμ¦λμ€ λ‘μ§ ν
κ³Ό UI.widgets: entitiesμ featuresλ₯Ό μ‘°ν©ν μμ±λ UI λΈλ‘.entities/{domain}/model/queries.ts)λͺ¨λ 쿼리 ν€μ ν¨μλ queryOptionsλ₯Ό μ¬μ©νμ¬ ν©ν 리 ννλ‘ κ΄λ¦¬νλ€.
TypeScript
export const postQueries = { all: ['posts'] as const, list: (params: PostSearchParams) => queryOptions({ queryKey: [...postQueries.all, 'list', params], queryFn: () => fetchPosts(params), }), };