@@ -149,6 +149,17 @@ Presenter 사용 패턴:
1491495 . 모든 엔드포인트 함수는 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