Skip to content

Commit df8b588

Browse files
authored
Merge branch 'main' into feat/#44
2 parents 59ad49b + a888c9c commit df8b588

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)