Skip to content

Commit a888c9c

Browse files
authored
๐Ÿ“ ์•„ํ‚คํ…์ฒ˜ ๊ด€๋ จ ํŒŒ์ผ ์ค‘ ํŒŒ์ผ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ž‘์„ฑ (#42)
1 parent 84f05d2 commit a888c9c

1 file changed

Lines changed: 39 additions & 33 deletions

File tree

โ€Ž.claude/architecture.mdโ€Ž

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,17 @@ Presenter ์‚ฌ์šฉ ํŒจํ„ด:
149149
5. ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ ํ•จ์ˆ˜๋Š” getLocalServerApis ๋ฐ˜ํ™˜ ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•˜๋ฉฐ,
150150
satisfies Record<string, Api> ์ œ์•ฝ์„ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค.
151151

152+
#### ํ˜„์žฌ ๋“ฑ๋ก๋œ ์—”๋“œํฌ์ธํŠธ (๋ณ€๊ฒฝ ์‹œ ์ด ๋ฌธ์„œ๋„ ์—…๋ฐ์ดํŠธ)
153+
POST /api/auth/email โ€” ์ด๋ฉ”์ผ ์ธ์ฆ ์ฝ”๋“œ ๋ฐœ์†ก (body: EmailRequest)
154+
POST /api/auth/email/verify โ€” ์ด๋ฉ”์ผ ์ธ์ฆ ์ฝ”๋“œ ์žฌ๋ฐœ์†ก (body: EmailRequest)
155+
POST /api/auth/email/validate โ€” ์ด๋ฉ”์ผ ์ธ์ฆ ์ฝ”๋“œ ๊ฒ€์ฆ (body: EmailValidateRequest) โ†’ VerificationTokenResponse
156+
POST /api/auth/user โ€” ํšŒ์›๊ฐ€์ž… (body: SignUpRequest) โ†’ UserWithAccessTokenResponse
157+
POST /api/auth/user/session โ€” ๋กœ๊ทธ์ธ (body: SignInRequest) โ†’ UserWithAccessTokenResponse
158+
GET /api/auth/token โ€” ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ โ†’ TokenResponse
159+
DELETE /api/auth/user/session โ€” ๋กœ๊ทธ์•„์›ƒ (token ํ•„์ˆ˜)
160+
GET /api/store โ€” ์Šคํ† ์–ด ๋ชฉ๋ก (query?: { category?, name?, page?, size? }) โ†’ StoreListWithEventsResponse
161+
GET /api/store/:storeId/events โ€” ์Šคํ† ์–ด ์ด๋ฒคํŠธ ๋ชฉ๋ก (query: { storeId }) โ†’ StoreEventListResponse
162+
152163
#### encodeQueryParams ๋™์ž‘
153164
ํŒŒ์ผ: src/infrastructure/api/apis/local-server/encode-query-params.ts
154165
- undefined / null ๊ฐ’์€ ์ž๋™์œผ๋กœ ์ œ์™ธ๋œ๋‹ค.
@@ -170,29 +181,34 @@ Presenter ์‚ฌ์šฉ ํŒจํ„ด:
170181
ํŒŒ์ผ ๊ฒฝ๋กœ: src/feature/shared/context/
171182

172183
๊ตฌ์กฐ:
173-
- query-context.ts : { authQuery, ... } โ€” application ํ›… ๋ฌถ์Œ
174-
- usecase-context.ts : { authUsecase, ... } โ€” usecase ์ธ์Šคํ„ด์Šค
184+
- query-context.ts : { authQuery, storeQuery } โ€” application ํ›… ๋ฌถ์Œ
185+
- usecase-context.ts : { authUsecase } โ€” usecase ์ธ์Šคํ„ด์Šค
175186
- token-context.ts : { token } โ€” ํ˜„์žฌ ์ธ์ฆ ํ† ํฐ
187+
- review-context.ts : { storeId, eventId, setStore, setEvent } โ€” ๋ฆฌ๋ทฐ ์ž‘์„ฑ ํ๋ฆ„์˜ ์„ ํƒ ์ƒํƒœ
176188
- use-gaurd-context.ts : useGuardContext<T> โ€” null-safe ์ปจํ…์ŠคํŠธ ์ ‘๊ทผ ํ›…
177189

178-
DI ์กฐ๋ฆฝ ์œ„์น˜: src/App.tsx (AppContent ์ปดํฌ๋„ŒํŠธ)
190+
ํ˜„์žฌ DI ์กฐ๋ฆฝ (src/App.tsx AppContent):
179191
const api = implApi({ externalCall });
180192
const tokenRepository = implTokenRepository({ setToken });
181193
const authUsecase = implAuthUsecase({ api, tokenRepository });
182194
const authQuery = useAuthQuery({ authUsecase });
195+
const storeUsecase = implStoreUsecase({ api });
196+
const storeQuery = useStoreQuery({ storeUsecase });
183197

184198
return (
185-
<QueryContext.Provider value={{ authQuery }}>
199+
<QueryContext.Provider value={{ authQuery, storeQuery }}>
186200
<TokenContext.Provider value={{ token }}>
187201
<UsecaseContext.Provider value={{ authUsecase }}>
188-
...
202+
<ReviewContext.Provider value={{ storeId, eventId, setStore, setEvent }}>
203+
<RouterProvider />
204+
</ReviewContext.Provider>
189205
</UsecaseContext.Provider>
190206
</TokenContext.Provider>
191207
</QueryContext.Provider>
192208
);
193209

194210
๊ทœ์น™:
195-
- ์ƒˆ ๋„๋ฉ”์ธ์˜ usecase/query๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด App.tsx์˜ Provider์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
211+
- ์ƒˆ ๋„๋ฉ”์ธ์˜ usecase/query๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด App.tsx์˜ Provider์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด ๋ฌธ์„œ๋„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
196212
- widget์—์„œ Context์— ์ง์ ‘ ์ ‘๊ทผํ•  ๋•Œ๋Š” ํ•ญ์ƒ useGuardContext๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
197213

198214
---
@@ -201,13 +217,12 @@ DI ์กฐ๋ฆฝ ์œ„์น˜: src/App.tsx (AppContent ์ปดํฌ๋„ŒํŠธ)
201217
ํŒŒ์ผ ๊ฒฝ๋กœ: src/feature/shared/routes/path.ts
202218
์—ญํ• : ์•ฑ ๋‚ด ๋ชจ๋“  URL ๊ฒฝ๋กœ๋ฅผ ์ƒ์ˆ˜๋กœ ์ •์˜ํ•œ๋‹ค. ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์ฝ”๋“œ ๊ณณ๊ณณ์— ์ง์ ‘ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
203219

204-
ํŒจํ„ด:
205-
export const PATH = {
206-
LANDING: '/',
207-
SIGN_IN: '/sign-in',
208-
MY_PAGE: '/my-page',
209-
// ์ƒˆ ํŽ˜์ด์ง€ ์ถ”๊ฐ€ ์‹œ ์—ฌ๊ธฐ์— ํ•ญ๋ชฉ ์ถ”๊ฐ€
210-
};
220+
ํ˜„์žฌ ๋“ฑ๋ก๋œ PATH (๋ณ€๊ฒฝ ์‹œ ์ด ๋ฌธ์„œ๋„ ์—…๋ฐ์ดํŠธ):
221+
LANDING : '/'
222+
SIGN_IN : '/sign-in'
223+
SIGN_UP : '/sign-up'
224+
SIGN_UP_COMPLETE : '/sign-up-complete'
225+
SUBMIT : '/submit'
211226

212227
๊ทœ์น™:
213228
- ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๋ฉด PATH์— ํ•ญ๋ชฉ์„ ๋จผ์ € ์ถ”๊ฐ€ํ•œ๋‹ค.
@@ -221,18 +236,14 @@ DI ์กฐ๋ฆฝ ์œ„์น˜: src/App.tsx (AppContent ์ปดํฌ๋„ŒํŠธ)
221236
- react-router์˜ useNavigate๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์ด๋ฆ„ ์žˆ๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
222237
- ์ปดํฌ๋„ŒํŠธ์™€ application ๋ ˆ์ด์–ด ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
223238

224-
ํŒจํ„ด:
225-
export const useRouteNavigation = () => {
226-
const navigate = useNavigate();
227-
228-
return {
229-
toMain: () => { void navigate(PATH.LANDING); },
230-
toSignIn: () => { void navigate(PATH.SIGN_IN); },
231-
toMyPage: () => { void navigate(PATH.MY_PAGE); },
232-
toBack: () => { void navigate(-1); },
233-
refreshPage: () => { void navigate(0); },
234-
};
235-
};
239+
ํ˜„์žฌ ๋“ฑ๋ก๋œ ํ•จ์ˆ˜ (๋ณ€๊ฒฝ ์‹œ ์ด ๋ฌธ์„œ๋„ ์—…๋ฐ์ดํŠธ):
240+
toMain โ†’ PATH.LANDING
241+
toSignIn โ†’ PATH.SIGN_IN
242+
toSignUp โ†’ PATH.SIGN_UP
243+
toSignUpComplete โ†’ PATH.SIGN_UP_COMPLETE
244+
toSubmit โ†’ PATH.SUBMIT
245+
toBack โ†’ navigate(-1)
246+
refreshPage โ†’ navigate(0)
236247

237248
์‚ฌ์šฉ ์œ„์น˜:
238249
- widget: ๋ฒ„ํŠผ ํด๋ฆญ ๋“ฑ UI ์ด๋ฒคํŠธ์—์„œ ์ง์ ‘ ํ˜ธ์ถœ
@@ -258,24 +269,19 @@ DI ์กฐ๋ฆฝ ์œ„์น˜: src/App.tsx (AppContent ์ปดํฌ๋„ŒํŠธ)
258269
- ๋ชจ๋“  ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ PATH ์ƒ์ˆ˜์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ผ์šฐํŠธ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
259270
- ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ(GNB ๋“ฑ)๊ณผ ์ธ์ฆ ๊ฐ€๋“œ๋ฅผ ์ค‘์ฒฉ ๋ผ์šฐํŠธ๋กœ ์กฐํ•ฉํ•œ๋‹ค.
260271

261-
ํ˜„์žฌ ๊ตฌ์กฐ:
272+
ํ˜„์žฌ ๋“ฑ๋ก๋œ ๋ผ์šฐํŠธ (๋ณ€๊ฒฝ ์‹œ ์ด ๋ฌธ์„œ๋„ ์—…๋ฐ์ดํŠธ):
262273
<Routes>
263274
{/* ์ธ์ฆ ๋ถˆํ•„์š” */}
264275
<Route path={PATH.SIGN_IN} element={<SignInPage />} />
265276
<Route path={PATH.SIGN_UP} element={<SignUpPage />} />
266277

267-
{/* ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์‹œ๋„ ํ›„ ์ง„์ž… (ReissueToken: ๋งˆ์šดํŠธ ์‹œ ํ† ํฐ ์—†์œผ๋ฉด reissue ์‹œ๋„) */}
278+
{/* ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์‹œ๋„ ํ›„ ์ง„์ž… */}
268279
<Route element={<ReissueToken />}>
269280
<Route path={PATH.LANDING} element={<LandingPage />} />
270281

271282
{/* ๋กœ๊ทธ์ธ ํ•„์ˆ˜ */}
272283
<Route element={<ProtectedRoute role="SIGN_IN" />}>
273-
<Route path={PATH.MY_PAGE} element={<MyPage />} />
274-
</Route>
275-
276-
{/* ํŠน์ • ์—ญํ•  ํ•„์ˆ˜ (์˜ˆ: OWNER๋งŒ ์ ‘๊ทผ) */}
277-
<Route element={<ProtectedRoute role="OWNER" />}>
278-
<Route path={PATH.OWNER_ONLY} element={<OwnerPage />} />
284+
<Route path="/test" element={<MyPage />} />
279285
</Route>
280286
</Route>
281287
</Routes>

0 commit comments

Comments
ย (0)