Visitar URL original
[Chore] #15 ky config/client 설정 by gustn99 · Pull Request #23 · woowacourse-teams/2026-rilog · GitHub
Skip to content

[Chore] #15 ky config/client 설정 - #23

Merged
gustn99 merged 15 commits into
developfrom
fe/chore/#15-ky-config-client-설정
Aug 12, 2026

Hidden character warning

The head ref may contain hidden characters: "fe/chore/#15-ky-config-client-\uc124\uc815"
Merged

gustn99 merged 15 commits into
developfrom
fe/chore/#15-ky-config-client-설정

Conversation

@gustn99

@gustn99 gustn99 commented Aug 11, 2026 •

Copy link
Copy Markdown
Contributor

관련 이슈

변경 목적

api 함수 작성을 위한 ky client 기본 세팅

작업 내역

  • ky 클라이언트 구현
    • csr에서는 토큰을 담고, ssr에서는 토큰 없이 요청을 보냅니다.
    • 토큰 만료료 401(또는 403, 서버와 논의 필요) 응답 시 refresh 토큰을 재발급하고 retry합니다.
  • 구독발행 패턴을 활용해 토큰 재발급 실패 시 유저 관련 쿼리 캐시 초기화 로직 구현
    • apiClient에 토큰 재발급 실패 콜백을 설정할 수 있습니다.
    • 현재는 subscribeTokenRefreshFailureQueryRemoval 함수가 등록되어 있습니다.
    • AuthenticatedQueryCacheSubscriber 컴포넌트에서 위 함수를 호출해 구독합니다.

query 훅을 사용할 땐 아래와 같이 배열로 된 query key를 사용하고, authenticatedQueryKeys 키를 포함하는 쿼리는 모두 초기화 대상이 됩니다.

export const currentUserQueryKeys = {
      all: [...authenticatedQueryKeys.all, 'current-user'] as const,
      detail: () => [...currentUserQueryKeys.all, 'detail'] as const,
};

리뷰어가 집중해서 볼 부분

  • AuthenticatedQueryCacheSubscriber 컴포넌트의 경로

세션 만료 로직이 auth에 포함되는 개념이라 우선은 features/auth/session-expiration/AuthenticatedQueryCacheSubscriber 구조로 잡았는데, features 내부 파일에 다시 하위 feature가 오는 구조가 어색하게 느껴집니다. 이걸 고민하느라 PR이 늦어지기보다는 함께 생각하면 좋을 것 같아 PR을 올리니 더 좋은 구조가 떠오르신다면 추천 부탁드립니다!

Summary by CodeRabbit

  • New Features

    • Added reliable API authentication handling, including automatic token refresh and request retry after expired sessions.
    • Added automatic cleanup of authenticated data when session renewal fails.
    • Added shared data-fetching support across application pages.
    • Added shared design tokens for colors, typography, buttons, and focus states.
    • Added configurable API base URL support.
  • Bug Fixes

    • Improved concurrent token refresh handling to prevent repeated refresh attempts.
  • Tests

    • Expanded coverage for authentication, API requests, caching, and session expiration.

@gustn99
gustn99 requested a review from JetProc as a code owner August 11, 2026 15:21
@gustn99 gustn99 linked an issue Aug 11, 2026 that may be closed by this pull request
2 of 7 tasks
@gustn99 gustn99 changed the title [Chore] ky config/client 설정 [Chore] #15 ky config/client 설정 Aug 11, 2026
@coderabbitai

coderabbitai Bot commented Aug 11, 2026 •

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9fe58914-d446-4054-bfc3-5d76092cc7dc

📥 Commits

Reviewing files that changed from the base of the PR and between 997f85a and 0350afb.

📒 Files selected for processing (14)
  • AGENTS.md
  • docs/harness/team-defaults.md
  • frontend/.env.example
  • frontend/.gitignore
  • frontend/.vscode/settings.json
  • frontend/playwright.config.ts
  • frontend/src/app/globals.css
  • frontend/src/app/page.tsx
  • frontend/src/shared/api/api-client.ts
  • frontend/src/shared/api/create-api-client.ts
  • frontend/src/shared/styles/tokens/button.css
  • frontend/src/shared/styles/tokens/colors.css
  • frontend/src/shared/styles/tokens/index.css
  • frontend/src/shared/styles/tokens/typography.css

📝 Walkthrough

Walkthrough

The frontend adds a shared Ky client with token refresh handling, publishes refresh failures, removes authenticated React Query cache entries, and mounts the behavior through the root layout. It also adds frontend-local test configuration, design tokens, editor settings, and branch naming updates.

Changes

Authentication-aware API and query state

Layer / File(s) Summary
Token refresh API client
frontend/src/shared/api/create-api-client.ts, frontend/src/shared/api/api-client.ts, frontend/src/shared/api/*test.ts
The Ky client attaches browser tokens, refreshes expired tokens once, shares concurrent refreshes, and notifies refresh-failure listeners.
Authenticated query cache removal
frontend/src/shared/query/*
Authenticated query keys and a subscription helper remove matching React Query cache entries after token-refresh failure.
Application providers and validation
frontend/src/shared/query/QueryProvider.tsx, frontend/src/features/auth/session-expiration/*, frontend/src/app/layout.tsx
The root layout provides React Query and mounts the session-expiration subscriber. Tests cover cache removal and subscriber cleanup.

Frontend tooling and visual foundation

Layer / File(s) Summary
Frontend test tooling and environment
frontend/package.json, frontend/playwright.config.ts, frontend/vitest-*.config.ts, frontend/.env.example, frontend/.gitignore, frontend/.vscode/settings.json
Test scripts, aliases, Playwright discovery, environment setup, and editor settings now use frontend-local configuration.
Shared design tokens and global styles
frontend/src/shared/styles/tokens/*, frontend/src/app/globals.css, frontend/src/app/page.tsx
The frontend adds color, typography, and button tokens. Global styles and homepage typography use the new tokens.

Repository branch conventions

Layer / File(s) Summary
Branch naming guidance
AGENTS.md, docs/harness/team-defaults.md
Branch naming rules and examples now use hyphen-separated issue descriptions and the common/ prefix.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant APIRequest
  participant createApiClient
  participant apiClient
  participant AuthenticatedQueryCacheSubscriber
  participant QueryClient
  APIRequest->>createApiClient: Send request with access token
  createApiClient->>apiClient: Publish refresh failure after 401 handling
  apiClient->>AuthenticatedQueryCacheSubscriber: Notify subscriber
  AuthenticatedQueryCacheSubscriber->>QueryClient: Remove authenticated queries
Loading

Possibly related PRs

Suggested reviewers: jetproc

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR implements token handling and refresh logic but does not provide a distinct server-side client or login-required middleware. Implement the server-side ky client and middleware for login-required pages, then verify the linked issue requirements.
✅ Passed checks (4 passed)
Check name Status Explanation
Out of Scope Changes check ✅ Passed The configuration, query provider, cache invalidation, tests, and API client changes support the linked ky client objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main change: configuring the ky API client for issue #15.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fe/chore/#15-ky-config-client-설정

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (6)
frontend/src/shared/query/QueryProvider.tsx (1)

12-16: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Consider a non-zero default staleTime.

The client uses staleTime: 0. With server rendering, every query refetches immediately after hydration. TanStack Query recommends a default above zero for App Router applications.

♻️ Proposed change
-	const [queryClient] = useState(() => new QueryClient());
+	const [queryClient] = useState(
+		() =>
+			new QueryClient({
+				defaultOptions: {
+					queries: { staleTime: 60 * 1000 },
+				},
+			}),
+	);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/shared/query/QueryProvider.tsx` around lines 12 - 16, Update the
QueryClient initialization in QueryProvider to configure a non-zero default
staleTime, preserving the existing provider structure and using the client’s
default query options so hydrated server-rendered queries do not refetch
immediately.
frontend/src/shared/api/create-api-client.ts (1)

23-36: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

ensureRefreshRetry silently overrides an explicit retry: 0.

A caller that passes retry: 0 asks for no retries. The function converts it to 1. The refresh path then re-sends the request through ky.retry, so the caller loses control over the retry budget.

Consider keeping the caller value and letting the refresh path own its single re-request, or document the forced minimum in the type.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/shared/api/create-api-client.ts` around lines 23 - 36, Update
ensureRefreshRetry so an explicit numeric retry value of 0 remains 0 instead of
being coerced to 1, preserving the caller’s retry budget while allowing the
refresh path’s own re-request behavior to remain unchanged.
frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.component.test.tsx (1)

5-12: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Move the vi.hoisted block above the imports.

The call works because Vitest hoists it above the import statements. The current position suggests that it runs after line 1-3 imports and before line 9-12 imports, which is not what happens. Place it directly after the Vitest import to match execution order.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.component.test.tsx`
around lines 5 - 12, Move the vi.hoisted block in
AuthenticatedQueryCacheSubscriber.component.test.tsx directly after the Vitest
import, before all other imports, so the file’s order reflects Vitest’s actual
execution order.
frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.tsx (1)

9-22: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Placement looks reasonable.

The PR asks for feedback on the path. The component owns an auth session concern, so features/auth/session-expiration fits. The cleanup contract is correct: useEffect returns the unsubscribe function, and queryClient is the only dependency.

One option: rename the file to reflect that it renders nothing, for example SessionExpirationEffect.tsx. This is a naming preference only.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.tsx`
around lines 9 - 22, Optionally rename the AuthenticatedQueryCacheSubscriber
component file to SessionExpirationEffect.tsx to reflect that it renders
nothing, preserving its existing implementation and export.
frontend/src/shared/api/api-client.ts (1)

22-22: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Handle a missing NEXT_PUBLIC_API_BASE_URL.

If the environment variable is absent, baseUrl is undefined and every call resolves against the current origin. This fails silently in deployed environments. Add a startup check that throws a clear error, or provide a documented default.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/shared/api/api-client.ts` at line 22, Validate
NEXT_PUBLIC_API_BASE_URL during API client initialization before assigning
baseUrl, and throw a clear startup error when it is missing; alternatively, use
an explicitly documented default if the project already defines one. Ensure all
API calls continue using the validated base URL rather than silently falling
back to the current origin.
frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.unit.test.ts (1)

25-39: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a nested query key case.

The test only stores data under the exact key authenticatedQueryKeys.all. Production passes the same key without exact, so removal relies on prefix matching. Add an entry such as [...authenticatedQueryKeys.all, 'current-user'] and assert it is also removed.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.unit.test.ts`
around lines 25 - 39, Add a nested query entry using
[...authenticatedQueryKeys.all, 'current-user'] in the
subscribeTokenRefreshFailureQueryRemoval test setup, then assert its query data
is undefined after the 401 failure alongside the exact currentUserQueryKey
assertion. Keep the unrelated postsQueryKey data unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/playwright.config.ts`:
- Line 4: Update the Playwright configuration’s testDir setting to use the
frontend-relative path ./src/test/e2e, ensuring it collects the frontend E2E
tests such as home.spec.ts.

In `@frontend/src/shared/api/api-client.ts`:
- Around line 21-24: The production apiClient configuration lacks a real
tokenProvider, causing authenticated requests to omit Authorization and 401
refreshes to use the anonymous provider. Update the apiClient initialization to
supply the application’s existing token provider, or ensure
publishTokenRefreshFailure only runs after an actual refresh attempt; preserve
the current onTokenRefreshFailure wiring once refresh handling is valid.

In `@frontend/src/shared/api/create-api-client.ts`:
- Around line 89-94: Update the response-status guard in the afterResponse hook
to handle 403 alongside 401 when the backend contract identifies 403 as token
expiration, while preserving the existing browser and retry-count checks;
otherwise revise the objective to state that only 401 responses trigger token
refresh.

---

Nitpick comments:
In
`@frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.component.test.tsx`:
- Around line 5-12: Move the vi.hoisted block in
AuthenticatedQueryCacheSubscriber.component.test.tsx directly after the Vitest
import, before all other imports, so the file’s order reflects Vitest’s actual
execution order.

In
`@frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.tsx`:
- Around line 9-22: Optionally rename the AuthenticatedQueryCacheSubscriber
component file to SessionExpirationEffect.tsx to reflect that it renders
nothing, preserving its existing implementation and export.

In `@frontend/src/shared/api/api-client.ts`:
- Line 22: Validate NEXT_PUBLIC_API_BASE_URL during API client initialization
before assigning baseUrl, and throw a clear startup error when it is missing;
alternatively, use an explicitly documented default if the project already
defines one. Ensure all API calls continue using the validated base URL rather
than silently falling back to the current origin.

In `@frontend/src/shared/api/create-api-client.ts`:
- Around line 23-36: Update ensureRefreshRetry so an explicit numeric retry
value of 0 remains 0 instead of being coerced to 1, preserving the caller’s
retry budget while allowing the refresh path’s own re-request behavior to remain
unchanged.

In `@frontend/src/shared/query/QueryProvider.tsx`:
- Around line 12-16: Update the QueryClient initialization in QueryProvider to
configure a non-zero default staleTime, preserving the existing provider
structure and using the client’s default query options so hydrated
server-rendered queries do not refetch immediately.

In
`@frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.unit.test.ts`:
- Around line 25-39: Add a nested query entry using
[...authenticatedQueryKeys.all, 'current-user'] in the
subscribeTokenRefreshFailureQueryRemoval test setup, then assert its query data
is undefined after the 401 failure alongside the exact currentUserQueryKey
assertion. Keep the unrelated postsQueryKey data unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2e43a62c-55e7-4bd8-af12-635c01ec7b0f

📥 Commits

Reviewing files that changed from the base of the PR and between 9d15cfd and 997f85a.

📒 Files selected for processing (15)
  • frontend/package.json
  • frontend/playwright.config.ts
  • frontend/src/app/layout.tsx
  • frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.component.test.tsx
  • frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.tsx
  • frontend/src/shared/api/api-client.ts
  • frontend/src/shared/api/api-client.unit.test.ts
  • frontend/src/shared/api/create-api-client.ts
  • frontend/src/shared/api/create-api-client.unit.test.ts
  • frontend/src/shared/query/QueryProvider.tsx
  • frontend/src/shared/query/authenticated-query-keys.ts
  • frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.ts
  • frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.unit.test.ts
  • frontend/vitest-component.config.ts
  • frontend/vitest-unit.config.ts

Comment thread frontend/src/shared/api/api-client.ts Resolved

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 3

🧹 Nitpick comments (6)
frontend/src/shared/query/QueryProvider.tsx (1)

12-16: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Consider a non-zero default staleTime.

The client uses staleTime: 0. With server rendering, every query refetches immediately after hydration. TanStack Query recommends a default above zero for App Router applications.

♻️ Proposed change
-	const [queryClient] = useState(() => new QueryClient());
+	const [queryClient] = useState(
+		() =>
+			new QueryClient({
+				defaultOptions: {
+					queries: { staleTime: 60 * 1000 },
+				},
+			}),
+	);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/shared/query/QueryProvider.tsx` around lines 12 - 16, Update the
QueryClient initialization in QueryProvider to configure a non-zero default
staleTime, preserving the existing provider structure and using the client’s
default query options so hydrated server-rendered queries do not refetch
immediately.
frontend/src/shared/api/create-api-client.ts (1)

23-36: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

ensureRefreshRetry silently overrides an explicit retry: 0.

A caller that passes retry: 0 asks for no retries. The function converts it to 1. The refresh path then re-sends the request through ky.retry, so the caller loses control over the retry budget.

Consider keeping the caller value and letting the refresh path own its single re-request, or document the forced minimum in the type.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/shared/api/create-api-client.ts` around lines 23 - 36, Update
ensureRefreshRetry so an explicit numeric retry value of 0 remains 0 instead of
being coerced to 1, preserving the caller’s retry budget while allowing the
refresh path’s own re-request behavior to remain unchanged.
frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.component.test.tsx (1)

5-12: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Move the vi.hoisted block above the imports.

The call works because Vitest hoists it above the import statements. The current position suggests that it runs after line 1-3 imports and before line 9-12 imports, which is not what happens. Place it directly after the Vitest import to match execution order.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.component.test.tsx`
around lines 5 - 12, Move the vi.hoisted block in
AuthenticatedQueryCacheSubscriber.component.test.tsx directly after the Vitest
import, before all other imports, so the file’s order reflects Vitest’s actual
execution order.
frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.tsx (1)

9-22: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Placement looks reasonable.

The PR asks for feedback on the path. The component owns an auth session concern, so features/auth/session-expiration fits. The cleanup contract is correct: useEffect returns the unsubscribe function, and queryClient is the only dependency.

One option: rename the file to reflect that it renders nothing, for example SessionExpirationEffect.tsx. This is a naming preference only.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.tsx`
around lines 9 - 22, Optionally rename the AuthenticatedQueryCacheSubscriber
component file to SessionExpirationEffect.tsx to reflect that it renders
nothing, preserving its existing implementation and export.
frontend/src/shared/api/api-client.ts (1)

22-22: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Handle a missing NEXT_PUBLIC_API_BASE_URL.

If the environment variable is absent, baseUrl is undefined and every call resolves against the current origin. This fails silently in deployed environments. Add a startup check that throws a clear error, or provide a documented default.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/shared/api/api-client.ts` at line 22, Validate
NEXT_PUBLIC_API_BASE_URL during API client initialization before assigning
baseUrl, and throw a clear startup error when it is missing; alternatively, use
an explicitly documented default if the project already defines one. Ensure all
API calls continue using the validated base URL rather than silently falling
back to the current origin.
frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.unit.test.ts (1)

25-39: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a nested query key case.

The test only stores data under the exact key authenticatedQueryKeys.all. Production passes the same key without exact, so removal relies on prefix matching. Add an entry such as [...authenticatedQueryKeys.all, 'current-user'] and assert it is also removed.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.unit.test.ts`
around lines 25 - 39, Add a nested query entry using
[...authenticatedQueryKeys.all, 'current-user'] in the
subscribeTokenRefreshFailureQueryRemoval test setup, then assert its query data
is undefined after the 401 failure alongside the exact currentUserQueryKey
assertion. Keep the unrelated postsQueryKey data unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/playwright.config.ts`:
- Line 4: Update the Playwright configuration’s testDir setting to use the
frontend-relative path ./src/test/e2e, ensuring it collects the frontend E2E
tests such as home.spec.ts.

In `@frontend/src/shared/api/api-client.ts`:
- Around line 21-24: The production apiClient configuration lacks a real
tokenProvider, causing authenticated requests to omit Authorization and 401
refreshes to use the anonymous provider. Update the apiClient initialization to
supply the application’s existing token provider, or ensure
publishTokenRefreshFailure only runs after an actual refresh attempt; preserve
the current onTokenRefreshFailure wiring once refresh handling is valid.

In `@frontend/src/shared/api/create-api-client.ts`:
- Around line 89-94: Update the response-status guard in the afterResponse hook
to handle 403 alongside 401 when the backend contract identifies 403 as token
expiration, while preserving the existing browser and retry-count checks;
otherwise revise the objective to state that only 401 responses trigger token
refresh.

---

Nitpick comments:
In
`@frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.component.test.tsx`:
- Around line 5-12: Move the vi.hoisted block in
AuthenticatedQueryCacheSubscriber.component.test.tsx directly after the Vitest
import, before all other imports, so the file’s order reflects Vitest’s actual
execution order.

In
`@frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.tsx`:
- Around line 9-22: Optionally rename the AuthenticatedQueryCacheSubscriber
component file to SessionExpirationEffect.tsx to reflect that it renders
nothing, preserving its existing implementation and export.

In `@frontend/src/shared/api/api-client.ts`:
- Line 22: Validate NEXT_PUBLIC_API_BASE_URL during API client initialization
before assigning baseUrl, and throw a clear startup error when it is missing;
alternatively, use an explicitly documented default if the project already
defines one. Ensure all API calls continue using the validated base URL rather
than silently falling back to the current origin.

In `@frontend/src/shared/api/create-api-client.ts`:
- Around line 23-36: Update ensureRefreshRetry so an explicit numeric retry
value of 0 remains 0 instead of being coerced to 1, preserving the caller’s
retry budget while allowing the refresh path’s own re-request behavior to remain
unchanged.

In `@frontend/src/shared/query/QueryProvider.tsx`:
- Around line 12-16: Update the QueryClient initialization in QueryProvider to
configure a non-zero default staleTime, preserving the existing provider
structure and using the client’s default query options so hydrated
server-rendered queries do not refetch immediately.

In
`@frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.unit.test.ts`:
- Around line 25-39: Add a nested query entry using
[...authenticatedQueryKeys.all, 'current-user'] in the
subscribeTokenRefreshFailureQueryRemoval test setup, then assert its query data
is undefined after the 401 failure alongside the exact currentUserQueryKey
assertion. Keep the unrelated postsQueryKey data unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2e43a62c-55e7-4bd8-af12-635c01ec7b0f

📥 Commits

Reviewing files that changed from the base of the PR and between 9d15cfd and 997f85a.

📒 Files selected for processing (15)
  • frontend/package.json
  • frontend/playwright.config.ts
  • frontend/src/app/layout.tsx
  • frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.component.test.tsx
  • frontend/src/features/auth/session-expiration/AuthenticatedQueryCacheSubscriber.tsx
  • frontend/src/shared/api/api-client.ts
  • frontend/src/shared/api/api-client.unit.test.ts
  • frontend/src/shared/api/create-api-client.ts
  • frontend/src/shared/api/create-api-client.unit.test.ts
  • frontend/src/shared/query/QueryProvider.tsx
  • frontend/src/shared/query/authenticated-query-keys.ts
  • frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.ts
  • frontend/src/shared/query/subscribe-token-refresh-failure-query-removal.unit.test.ts
  • frontend/vitest-component.config.ts
  • frontend/vitest-unit.config.ts
🛑 Comments failed to post (1)
frontend/playwright.config.ts (1)

4-4: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

test -f frontend/src/test/e2e/home.spec.ts

listed_tests="$(
	cd frontend
	pnpm exec playwright test --config playwright.config.ts --list
)"

printf '%s\n' "$listed_tests"
grep -F 'src/test/e2e/home.spec.ts' <<<"$listed_tests"

Repository: woowacourse-teams/2026-rilog

Length of output: 678


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- tracked candidate files ---'
git ls-files 'frontend/playwright.config.ts' 'frontend/src/test/e2e/*' 'frontend/package.json' 'package.json' 'pnpm-lock.yaml'

printf '%s\n' '--- config ---'
cat -n frontend/playwright.config.ts

printf '%s\n' '--- E2E files ---'
find frontend/src/test/e2e -maxdepth 2 -type f -print 2>/dev/null | sort

printf '%s\n' '--- package scripts and Playwright references ---'
python3 - <<'PY'
import json
from pathlib import Path
for name in ("package.json", "frontend/package.json"):
    p = Path(name)
    if p.exists():
        data = json.loads(p.read_text())
        print(name)
        print(json.dumps({
            "scripts": data.get("scripts", {}),
            "devDependencies": {k:v for k,v in data.get("devDependencies", {}).items() if "playwright" in k.lower()},
            "dependencies": {k:v for k,v in data.get("dependencies", {}).items() if "playwright" in k.lower()},
        }, indent=2))
PY

Repository: woowacourse-teams/2026-rilog

Length of output: 1731


🏁 Script executed:

#!/usr/bin/env bash
set -u

printf '%s\n' '--- Playwright config path-resolution probes ---'
for cwd in . frontend; do
  printf 'cwd=%s\n' "$cwd"
  (
    cd "$cwd" || exit
    pnpm exec playwright test --config playwright.config.ts --list 2>&1
  )
  printf 'status=%s\n' "$?"
done

printf '%s\n' '--- resolved filesystem paths ---'
python3 - <<'PY'
from pathlib import Path
config = Path("frontend/playwright.config.ts").resolve()
for value in ("../src/test/e2e", "./src/test/e2e"):
    print(value, "=>", (config.parent / value).resolve(), "exists=", (config.parent / value).resolve().exists())
PY

Repository: woowacourse-teams/2026-rilog

Length of output: 1123


Point testDir at the frontend E2E directory.

../src/test/e2e resolves outside frontend and collects zero tests. Use ./src/test/e2e to collect frontend/src/test/e2e/home.spec.ts.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/playwright.config.ts` at line 4, Update the Playwright
configuration’s testDir setting to use the frontend-relative path
./src/test/e2e, ensuring it collects the frontend E2E tests such as
home.spec.ts.

Comment thread frontend/playwright.config.ts Resolved

@JetProc JetProc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

파일들 굉장히 많네요..

큰 흐름이나 대부분은 다 이해가 되었고, 자잘한 것 몇 개만 코멘트 남겨두었습니다~

가장 중요한 작업에 너무 고생많았어요!

@gustn99 gustn99 self-assigned this Aug 12, 2026
@gustn99 gustn99 added chore 빌드, 설정, 의존성, 개발 환경 등 보조 작업을 수행합니다. frontend 프론트엔드 관련 작업입니다. labels Aug 12, 2026
JetProc and others added 3 commits August 12, 2026 10:30
* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검
@gustn99
gustn99 merged commit c6a8c28 into develop Aug 12, 2026
1 check was pending
@JetProc
JetProc deleted the fe/chore/#15-ky-config-client-설정 branch August 12, 2026 01:31
Wlsflfh added a commit that referenced this pull request Aug 21, 2026
* chore: 저장소 공통 제외 규칙 설정 (#6)

* docs: 프로젝트 하네스 기본 기준 정리 (#8)

* chore: 파트별 변경의 리뷰 요청 자동화 (#12)

* [Chore] #9 프론트엔드 초기 세팅 (#10)

* chore: 프론트엔드 공통 실행·검증 환경 구성

* docs: 프론트엔드 개발 및 협업 기준 문서화

* chore: 미사용 코드와 빈 줄 검사 강화

* docs: 작업 범위별 브랜치 명명 기준 통일 (#17)

* [Chore] #14 프론트엔드 디자인 토큰 구성 (#18)

* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검

* [Chore] #15 ky config/client 설정 (#23)

* chore: config 폴더 제거

* chore: api client 테스트를 위한 의존성 설치

* feature: 토큰 재발급 로직을 포함하는 api client 모듈 구현

* feature: 토큰 재발급 실패 시 유저 데이터 초기화를 위한 구독발행 모델 구축

* style: import 순서 정렬

* chore: vitest config 내 alias 대상 상대경로 수정

* refactor: 토큰 재발급 실패 시 초기화 필요한 쿼리의 키를 그루핑

* feature: 토큰 재발급 실패 시 쿼리 초기화를 트리거하는 훅 컴포넌트 구현

* feature: QueryProvider 구현 및 적용

* chore(apiClient): tokenProvider 관련 TODO 추가

* chore(playwright.config): 대상 디렉터리 경로 수정

* chore: .env.example 파일 추가

* docs: 작업 범위별 브랜치 명명 기준 통일 (#17)

* [Chore] #14 프론트엔드 디자인 토큰 구성 (#18)

* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검

* chore(createApiClient): 토큰 재발급 분기 처리 관련 TODO 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #20 공용 버튼 컴포넌트 추가 (#21)

* feature: 서비스 전역 버튼 인터페이스 통일

* refactor: Button 타입과 크기별 스타일을 정리

Button에서만 사용하는 props 타입을 컴포넌트 파일로 옮기고 public entry의 타입 export를 제거했다.
버튼 크기별 모서리 반경도 sm/md와 lg의 위계를 드러내도록 조정했다.

Constraint: Button 타입의 외부 소비처가 없음
Rejected: 별도 타입 파일 유지 | 단일 소비처를 위한 파일 경계가 불필요함
Confidence: high
Scope-risk: narrow
Directive: 외부 타입 소비처가 생기면 필요한 타입만 public entry로 다시 공개할 것
Tested: pnpm check (format, lint, typecheck, component tests, build)
Not-tested: E2E 브라우저 흐름

* refactor: Button 전용 토큰의 소유 위치 정리

Button만 소비하는 시맨틱 토큰을 컴포넌트 폴더로 이동하고, 전역 스타일 진입점에서 등록하도록 import 경로를 분리했다.

Constraint: Tailwind 유틸리티 생성을 위해 @theme 토큰은 전역 CSS에서 import되어야 함
Rejected: foundations 토큰 폴더 유지 | Button 컴포넌트와 토큰의 소유 관계가 분산됨
Confidence: high
Scope-risk: narrow
Directive: 다른 공용 컴포넌트 전용 토큰도 소비처가 하나면 해당 컴포넌트와 함께 관리할 것
Tested: pnpm check (format, lint, typecheck, component tests, build)
Not-tested: E2E 브라우저 흐름

* [Chore] #19 전역예외처리핸들러 초기세팅 (#24)

* chore: domain 패키지 구조 유지 (#19)

* feat: InvalidParam 추가 (#19)

- 유효하지 않은 Param을 전달하기 위함.

* feat: ErrorDetail 추가 (#19)

* feat: RilogBusinessException 추가 (#19)

- 어플리케이션 최상위 커스텀 예외

* feat: ErrorInformation 추가 (#19)

- 커스텀 예외 생성자 시그니처를 Interface로 단축

* feat: GlobalExceptionInformation 추가 (#19)

* feat: GlobalExceptionHandler 추가 (#19)

- 전역 예외처리 핸들러로 한 곳에서 예외처리 관리

* docs: exception-handling.md 추가 (#19)

- 비즈니스 예외를 일관된 API 오류 응답으로 변환하는 방법을 설명

* refactor: 메서드 네이밍 수정 (#19)

* refactor: 자바 기본 예외는 초기세팅에 포함하지 않음. (#19)

* refactor: 클래스 선언 직후, 괄호 닫기 전 개행 추가 (#19)

* [Chore] #27 BaseEntity 초기세팅 (#28)

* build: Spring Data Jpa 라이브러리 추가 (#27)

* feat: BaseEntity 추가 (#27)

* feat: JpaAuditingConfig 추가 (#27)

- JpaAuditing 설정 허용

* feat: Spring Data 관련 예외처리 등록 (#27)

* docs: BaseEntity 사용 가이드.md 추가  (#27)

* chore: 프론트엔드 타입과 모듈 경계 규칙 통일 (#29)

객체 계약은 interface를 기본으로 사용하고 모듈 경계 import만 절대 경로를 사용하도록 기존 코드와 하네스를 함께 정리한다.

Constraint: 같은 모듈 내부 상대 경로는 허용
Rejected: 모듈별 barrel 유지 | 현재 공개 API 규모 대비 관리 비용과 runtime 혼합 위험이 큼
Directive: barrel 재도입은 명시적인 public API 필요가 확인된 뒤 별도 이슈 또는 ADR로 결정
Tested: Node 24.19.0에서 pnpm check 및 Playwright E2E 통과

* [Feature] #31 로그인 사용자 식별자 초기 구현 (#32)

* feat: @LoginUserId 추가 (#31)

* feat: @LoginUserSlug 추가 (#31)

* feat: 임시 LoginUserIdArgumentResolver 추가 (#31)

- 작업 병목을 막기 위한 임시 ArgumentResolver

* feat: 임시 LoginUserSlugArgumentResolver 추가 (#31)

- 작업 병목을 막기 위한 임시 ArgumentResolver

* [Feature] #30 users 테이블 구현 (#33)

* chore: service, repository 패키지 구조 추가

* refactor: HealthController 패키지 위치 변경

* refactor: HealthController 패키지 구조 변경에 의한 수정

* feature: User 테이블 구현

* feature: OnboardingStatus 구현

* test: UserTest 구현

* refactor: Onboarding 입력 값 추가

* test: Onboarding 입력 값 추가에 의한 테스트 케이스 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #34 1차 MVP Entity 초기 구현 (#39)

* refactor: 잘못된 패키지 구조 형식 제거 (#34)

* feature: test 패키지 gitignore 추가 (#34)

* refactor: User 패키지로 이동 (#34)

* refactor: HealthCheckController 패키지 이동 (#34)

* feature: user entity에 UNIQUE 제약 추가 (#34)

* feature: blog entity 추가 (#34)

* feature: post entity 추가 (#34)

* feature: BlogMember entity 추가 (#34)

* feature: local.env gitignore 추가 (#34)

* refactor: BlogMember Entity 잘못된 @table name 속성 수정  (#34)

* feature: application profile별 분리  (#34)

* refactor: author를 user로 변경 (#34)

* [Feature] #42 Swagger 추가 (#44)

* build: swagger 의존성 추가 (#42)

* build: dev, local 환경에 swagger 접속 허용 (#42)

* feature: OpenApiConfig 추가 (#42)

* [Feature] #47 예외 응답 형식 변경 (#48)

* refactor: GlobalExceptionInformation getErrorCode 응답 형식 변경

* docs: 예외 Enum 사용 방식 변경으로 docs 반영

* [Feature] #49 GitHub oauth 로그인 요청 및 callback 구현 (#56)

* refactor: 인증 보조 타입의 도메인 패키지 이동

* refactor: 인증 보조 타입의 패키지 선언 정리

* feature: GitHub OAuth 로그인 요청과 callback 검증 추가

* fix: 온보딩 slug 최초 저장과 재변경 방지

* docs: 아키텍쳐 구조 설명 추가

* fix: 파라미터 버그 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #45 게시글 발행 기능 구현 (#59)

* feature: Blog Entity에 owner 추가

* feature: Post Builder 패턴 적용

* refactor: 잘못 사용된 어노테이션 수정

- LoginUserId -> LoginUserSlug

* refactor: BlogType을 도메인 용어로 수정 COLOG, RILOG

* feat: Colog인지 확인하는 도메인 로직 추가

* feat: Blog 도메인 예외 추가

* Merge branch 'develop' of https://github.com/woowacourse-teams/2026-rilog into be/feature/#45-게시글-발행-기능-구현

# Conflicts:
#	backend/src/main/java/kr/rilog/domain/auth/resolver/LoginUserSlugArgumentResolver.java

* feat: 사용자를 찾을 수 없는 예외 에러 코드 추가

* feat: UserRepository 추가

* feat: BlogRepository 추가

- 개인사용자의 블로그를 조회하는 메서드 추가

* refactor: default 생성자 문제 해결 @Autowired 적용

* feat: PostRepository 추가

* feat: PostPublishRequest 추가

* feat: PostPublishResponse 추가

* feat: PostDetail 추가

* feat: PostSaveCommand 추가

* feat: PostPublishResult 추가

* refactor: default 생성자 문제 해결

* feat: PostService 추가 및 게시글 작성 구현

- 이미지 처리는 다음 이슈에 구현

* feat: PostController 추가 및 게시글 작성 API 구현

- 이미지 처리는 다음 이슈에 구현

* feat: NoResourceException 전역 예외 처리 추가

* feat: Post 게시글 작성 단위 테스트 추가

* refactor: .gradle-codex gitignore에 추가

* refactor: NoResourceFoundException 발생 시 잘못된 예외 코드 수정

* feature: Blog 소유자인지 판단하는 도메인 로직 추가

* feature: 게시글 작성 시, 다른 개인 블로그에 글을 작성할 수 있는 엣지케이스 제거 및 테스트 코드 작성

* [Feature] #57 GitHub access token 교환 및 사용자 정보 조회 구현 (#58)

* fix: GitHub 로그인 시작 생성자 주입 대상 명확화

* feature: GitHub Access Token 교환과 사용자 조회 추가

* refactor: 소셜 로그인 provider 경계 분리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #60 GitHub 로그인 사용자 생성과 온보딩 대기 처리 (#61)

* feature: GitHub 로그인 사용자 생성과 온보딩 대기 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

* refactor: OAuth 로그인 사용자 조회 흐름과 테스트 정리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

* fix: 생성자 충돌로 인한 정적 팩토리 메서드로 변경

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #62 전체 게시글 수 조회 API 구현 (#63)

* feature: 전체 게시글 수 조회 메서드 추가

* feature: TotalPostsCountResponse 추가

* feature: 전체 게시글 수 API 구현

* [Feature] #64 특정 게시글 상세 조회 API 구현 (#66)

* feat: hibernate Jackson 버전을 Spring Boot 4.0.x의 기본 Jackson 버전으로 명시

* feat: Post와 Author Fetch Join 메서드 추가

* feat: Post 도메인 예외 추가

* feat: 비공개 게시글 읽기 검증 로직 추가

* feat: 게시글 상세 조회 ResponseDto 추가

* feat: 게시글 상세 조회 비즈니스 로직 추가

* feat: 게시글 상세 조회 API 추가

* refactor: 잘못된 import 경로 수정

* refactor: 메서드명 readPosts에서 readPost로 변경

* refactor: Post에서 사용하지 않는 logoUrl 삭제

* fix: 메서드 시그니처 수정 누락 반영 (#71)

- logoUrl 메서드 시그니처 삭제

* feature: 자체 Access Token 발급과 검증 구현 (#67)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #68 Bearer 인증 인터셉터 구현 (#74)

* feature: Bearer 인증 인터셉터 구현

* refactor: 인증 선언과 사용자 주입 책임 분리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 역할 기반 인가 처리 구현 (#77)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feataure: 공용 텍스트 인풋 컴포넌트 구현 (#38)

* chore: placeholder 컬러 토큰 추가

* feature: 인풋 text 컴포넌트 구현

* chore: 범용 spacing 토큰 추가

* feature(Input): 아이콘/주소 prefix 등을 위해 인풋 좌측 슬롯 구현

* feature: 텍스트 영역 컴포넌트 구현

* style: css prettier 포맷 통일

* feature: left 컴포넌트를 클릭해도 input에 focus 되는 기능 추가

* feature(Textarea): 포커스 시 아웃라인 색상 지정

* test(Textarea): uncontrolled 방식의 테스트 제거

* [Feature] #72 전체 피드 게시글 목록 조회 (#79)

* feature: 전체 피드 게시글 목록 조회 메서드 구현

- 데이터 양이 많은 content 생략을 위해 Projection 사용.
- 정렬순은 하드코딩, 추후 확장성 고민해야함.

* feature: 전체피드 게시글 목록 Response 추가

- Inner Record를 사용

* feature: 전체피드 게시글 목록 조회 비즈니스 로직 추가

* feature: 전체피드 게시글 목록 조회 API 추가

* feature: 전체피드 게시글 목록 조회 API 추가

* feature: 전체피드 게시글 목록 조회 API Swagger 명세 추가

* feature: FeedService 단위 테스트 추가

* feature: 요청에 필요한 파라미터 누락 예외 상세하게 처리

* refactor: 잘못된 import 경로 수정

* [Refactor] #80 공통 응답 형식 적용 (#82)

* refactor: 공통 응답 ApiResponse 적용

- 소셜 로그인 컨트롤러는 미적용

* feature: ApiResponse 응답 적용

* refactor: 공통 응답 ApiResponse 적용

- 소셜 로그인 컨트롤러는 미적용

* feat: .gradle-user-home/ .gitignore 추가

* feature: 자체 로그인 토큰 흐름 제공 (#85)

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #84 Colog 피드에서 게시글 목록 조회 (#87)

* refactor: 전체피드 게시글 목록 조회 API에 ApiResponse 적용

* feature: 팀 피드 전체 게시글 목록 조회 메서드 추가

* feature: 팀 전체 피드 게시글 목록 응답 Dto 추가

* feature: 블로그 조회 메서드 추가

* refactor: 사용하지 않는 code 필드 제거 - ApiResponse

* feat: 팀피드 게시글 목록 조회 API 추가

* feat: 팀피드 게시글 목록 조회 비즈니스 로직 추가

* refactor: 전체 피드 게시글 목록 조회 비즈니스 로직 메서드명 수정

- 읽는다는 행위가 잘 드러나도록 read로 수정

* feature: 팀피드 게시글 조회 서비스 단위테스트코드 추가

* [Feature] #83 Refresh Token 재발급과 Rotation 처리 (#86)

* feature: Refresh Token 재발급과 Rotation 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

* [Feature] #84 Colog 피드에서 게시글 목록 조회 (#87)

* refactor: 전체피드 게시글 목록 조회 API에 ApiResponse 적용

* feature: 팀 피드 전체 게시글 목록 조회 메서드 추가

* feature: 팀 전체 피드 게시글 목록 응답 Dto 추가

* feature: 블로그 조회 메서드 추가

* refactor: 사용하지 않는 code 필드 제거 - ApiResponse

* feat: 팀피드 게시글 목록 조회 API 추가

* feat: 팀피드 게시글 목록 조회 비즈니스 로직 추가

* refactor: 전체 피드 게시글 목록 조회 비즈니스 로직 메서드명 수정

- 읽는다는 행위가 잘 드러나도록 read로 수정

* feature: 팀피드 게시글 조회 서비스 단위테스트코드 추가

* feature: Refresh Token 재발급과 Rotation 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>
Co-authored-by: koreaioi <koreaioi@gachon.ac.kr>

* feature: 로고이미지, 깃허브주소, 이메일 필드 추가 (#91)

* feature: #22 공용 모달 컴포넌트 구현 (#35)

* feature: 공용 모달의 접근성과 표시 동작 기반 마련

* feature: 단일 확인 동작을 제공하는 알림 모달 구성

* feature: 위험도와 처리 상태를 반영하는 확인 모달 구성

* feature: 다양한 콘텐츠 구성을 수용하는 범용 모달 제공

* chore: 프론트엔드 pnpm workspace 패키지 범위 명시

* refactor: 모달 Props 계약의 컴포넌트별 소유권 정리

* design: 모달 모서리 곡률을 서비스 스타일에 맞게 조정

* design: 모달 닫기 버튼의 클릭 영역과 배치 조정

* design: 모달 기본 액션 버튼의 높이와 최소 너비 통일

* fix: 모달 표시 중 배경 페이지 스크롤 차단

* design: 모달 백드랍 색상을 중립적인 톤으로 조정

* fix: 모달 pending 중 모든 액션과 종료 동작 차단

* refactor: 모달 처리 상태 계약 통일

* design: 버튼 포커스 링 여백 제거

* design: 버튼 포커스 표현을 아웃라인으로 통일

* feature: #36 공용 파일 인풋 컴포넌트 구현 (#75)

* feature: 파일 업로더 컴포넌트 구현

* feature: 이미지 업로더 컴포넌트 구현

* refactor(FileUploader): 불필요한 props 제거

* feat: change 핸들러 인터페이스 추가

* fix: 파일 업로더에 키보드 접근이 가능하도록 수정

* feature: 이미지 파일 검증 로직 추가

* [Feature] #89 팀 생성 로직 구현 (#95)

* feature: 팀 블로그 생성 도메인 모델 추가

* feature: 팀 블로그 생성 서비스 구현

* feature: 팀 블로그 생성 API 제공

* feature: 팀 블로그 URL 정보 생성 요청 반영

* refactor: @requiredargsconstructor 사용하도록 변경

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #88 나의 팀 목록 요약 API (#96)

* feature: 나의 팀 리스트 조회 메서드 추가

* feature: MyCologResponse 추가

* feature: 나의 팀 목록 조회 비즈니스 로직 추가

* feature: 나의 팀 목록 조회 API 추가

* feature: 나의 팀 목록 조회 단위테스트 추가

* feature: BlogController에 ApiSpec 명세 적용

* hofix: 생성자 중복 삭제 (#101)

* [Feature] 팀 멤버 초대 API 구현 (#98)

* feature: 팀 멤버 초대 API 구현

* fix: CologService 오류 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* fix: Clock 필드 주입 삭제 (#104)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 멤버 초대용 유저 정보 조회 제공 (#106)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #103 사용자 닉네임 슬러그 유효성 검사 구현 (#109)

* feat: 닉네임, 슬러그로 조회 메서드 추가

* feat: 닉네임, 슬러그 중복 예외 추가

* feat: 닉네임, 슬러그 중복검사 비즈니스 로직 추가

* feat: 닉네임, 슬러그 중복검사 API 구현

* feat: 닉네임, 슬러그 중복검사 테스트 코드 작성

* feature: 팀 상세 조회 API 구현 (#111)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 팀 프로필 조회 API 구현 (#113)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #110 colog 전체 멤버 목록 API 구현 (#114)

* feat: 팀목록 조회 메서드 추가

* feat: 팀목록 조회 비즈니스 로직 추가

* feat: 팀목록 멤버 조회 API 추가

* feat: 팀목록 멤버 조회 테스트 코드 추가

* feature: 온보딩 완료 후 정식 인증 세션 발급 (#116)

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #117 글 작성 및 조회 권한 처리 구현 (#118)

* feature: 게시글 상세 조회 선택 인증 지원

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

* feature: 게시글 작성과 비공개 조회 권한 검증

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #99 S3 PresignedUrl 발급 (#119)

* build: aws sdk s3 의존성 추가

* refactor: 예외 응답 고도화

* refactor: Upload 도메인 예외 추가

* refactor: Upload 도메인 enum 추가

* feat: PresignedUrl 관련 Dto 추가

* feat: S3 관련 환경변수 추가

* feat: S3Config 추가

* feat: S3Properties 추가

* feat: PresignedUrl 발급 비즈니스 로직 추가

* feat: PresignedUrl 발급 API 추가

* refactor: Dockerfile 캐싱 적용

* feat: 등록 가능 contentType, type 예시 추가

* [Build] #123 개발서버 CI-CD 파이프라인 구축 (#124)

* build: 개발서버 CI-CD 파이프라인 구축

* build: 잘못된 Dockerfile 명시 수정

* refactor: Push 에서 deploy job이 동작하도록 수정

* feature: 프론트 연동을 위한 CORS 설정 추가 (#125)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #127 크로스 플랫폼 설정과 GHA 캐싱 적용 (#128)

* refactor: 크로스 플랫폼 설정과 gha 캐싱 적용

* refactor: 잘못된 Dockerfile 이름 수정

* refactor: GitActions Runner 환경 ARM64 네이티브 러너 적용

* feature: 전달헤더 설정 추가 (#132)

- Swagger에서 API 요청 시 발생하는 CORS 문제 해결을 위함

* [Refactor] #129 로그인 이후 개인 블로그 생성 흐름 복구 (#130)

* fix: 로그인 이후 개인 블로그 생성 흐름 복구

* refactor: 온보딩 완료 책임의 서비스 의존 제거

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: #92 사이드바 구현 (#108)

* feature(Button): fullWidth 추가

* chore: navy 스케일 컬러 토큰 추가

* feature: 사이드바 컴포넌트 구현

* feature: 사이드바 접힘/열림 인터랙션 구현

* feature: 사이드바 관련 페이지 레이아웃 세팅

* feature: Button 스타일의 Link 컴포넌트를 ButtonLink로 분리

* feature: user/colog 공통 아바타 컴포넌트 구현

* feature: 사이드바 내비게이션 버튼 컴포넌트 구현

* feature: 사이드바 푸터 컴포넌트 구현

* feature: 사이드바 헤더 컴포넌트 구현

* refactor: 사이드바 컴포넌트 재구성

* test: 라우트 기반 로그아웃 동작을 버튼 기반으로 변경

* fix(Sidebar): 인가 여부 기본값 제거

* refactor(with-sidebar-layout): 메인 영역에 시맨틱 태그 사용

* feature: 공용 Divider 컴포넌트 구현

* feature: 사이드바에 Divider 추가

* fix(Sidebar): 인가 기본값 제거

* refactor(SidebarLayout): main 태그 제거

* test: 하드코딩된 UI 값 제거

* [Feature] #40 블로그 글 작성 페이지 UI 구현 (#126)

* build: BlockNote 패키지 버전 고정

* build: Pretendard 로컬 폰트 기반 제공

* design: BlockNote 스타일의 Rilog 토큰 연결

* feature: 글 작성 에디터 공개 계약 제공

* feature: 한국어 BlockNote 편집기 제공

* feature: 에디터 로드 실패 복구 상태 제공

* feature: BlockNote 브라우저 전용 로딩 경계 제공

* feature: 게시글 문서 유효성 판별

* feature: 자동 확장 제목 입력 흐름 제공

* feature: 본문 오류와 에디터 접근성 연결

* feature: 본문 이미지 로컬 업로더 제공

* feature: 글 작성 페이지의 기본 편집 흐름 제공

* feature: 글 작성 발행 진입 액션 제공

* feature: 저장되지 않은 글의 이탈 보호 제공

* feature: 게시 설정 도메인 계약과 선택 항목 제공

* feature: 대표 이미지 우선순위와 기본 미리보기 제공

* design: 파일 선택 컨트롤의 포커스 표현 통일

* feature: 접근 가능한 게시 설정 모달 제공

* feature: 게시 설정 유지와 발행 전 검증 제공

* feature: 교체 가능한 mock 발행 계약과 상세 경로 제공

* feature: 발행 상태 전이와 성공 후 이동 제공

* design: 게시 설정 모달의 경계와 포커스 표현 정돈

대표 이미지와 게시 설정 영역을 동일 비율로 배치하고 여백을 넓혀 정보 밀도를 조정한다. 모달 가장자리의 컨트롤은 focus outline을 내부에 표시해 잘림 없이 일관된 키보드 탐색 피드백을 제공한다.

Rejected: 공용 Button의 전역 outline offset 변경 | 모달 밖 버튼의 기존 시각 계약까지 바뀜
Confidence: high
Scope-risk: moderate
Directive: 모달 가장자리의 기본 컨트롤은 내부 focus outline 계약을 유지할 것
Tested: ESLint, TypeScript typecheck, component tests 86개, 키보드 focus 브라우저 확인, git diff check

* fix: 한글 조합 중 제목 Enter 이동 방지

IME 조합 중 발생한 Enter 이벤트를 본문 이동으로 처리하지 않도록
composition 상태를 확인한다.

Confidence: high
Scope-risk: narrow
Tested: PostTitleField component tests

* fix: 확정된 이탈 이동의 history 경쟁 제거

guard entry 제거와 실제 이동을 동기적으로 처리해 history.back과
fallback timer 사이의 중복 이동 가능성을 제거한다.

Rejected: popstate와 fallback timer 유지 | 이동 시점에 따라 두 경로가 경쟁할 수 있음
Confidence: high
Scope-risk: moderate
Tested: PostWriteWorkspace component tests

* fix: 유효한 상세 경로 확인 후 발행 상태 정리

발행 결과의 상세 경로를 먼저 검증해 잘못된 postId가 반환되더라도
작성 상태와 이탈 보호가 유지되도록 한다.

Rejected: 상태 정리 후 경로 생성 | 경로 생성 실패 시 작성 상태를 복구할 수 없음
Confidence: high
Scope-risk: narrow
Tested: PostWriteWorkspace component tests

* fix: BlockNote 표 셀 본문 유효성 판별

일반 content뿐 아니라 tableContent의 rows와 cells를 재귀 탐색해
표 안에 작성된 텍스트도 유효한 본문으로 인정한다.

Confidence: high
Scope-risk: narrow
Tested: post-write validation unit tests

* design: BlockNote 키보드 포커스와 블록 선택 표시 복원

BlockNote의 투명한 ring 값을 공용 focus token에 연결하고 선택된
콘텐츠에 outline을 제공해 현재 조작 대상을 식별할 수 있게 한다.

Constraint: 제목 입력은 기존 무경계 표현 유지
Rejected: box-shadow ring 추가 | 기존 outline 포커스 계약과 시각 효과가 중복됨
Confidence: high
Scope-risk: narrow
Tested: CSS formatting, production build, TypeScript

* fix: 실제 발행 제목과 길이 검증 기준 통일

제목의 앞뒤 공백을 제거한 값을 빈 값과 최대 길이 검증에 함께
사용해 실제 발행되는 제목과 검증 기준을 일치시킨다.

Confidence: high
Scope-risk: narrow
Tested: post-write validation unit tests

* design: 대표 이미지 선택 후 제어 영역 정렬

좁은 모달 열 안에서 이미지 변경과 제거 제어가 줄바꿈되지 않도록
설명과 버튼 행을 분리하고 선택 상태의 버튼 규격을 통일한다.

Rejected: viewport breakpoint 기반 flex 유지 | 실제 열 너비와 무관하게 가로 배치가 활성화됨
Confidence: high
Scope-risk: narrow
Tested: component tests, ESLint, TypeScript, production build, browser visual verification

* feat: 본문 placeholder에 마크다운 단축 문법 안내 제공

* [Feature] #93 로그인 모달 구현 (#137)

* design(Modal): 모달 내 개행 허용 및 레이아웃 조정

* feature: 로그인 모달 구현

* feature: 사이드바 로그인 버튼에 로그인 모달 연결

* feature: 로그인 모달을 전역으로 관리할 수 있도록 Context 구현

* feature: 로그인 상태에 따라 로그인 모달과 기존 액션을 분기하는 공통 훅 구현

* refactor(GuestSidebarFooter): 공통 로그인 모달 로직 적용

* [Feature] #94 온보딩 페이지 구현 (#136)

* chore: 브레이크포인트 토큰 추가

* feature: aside 기반 레이아웃 컴포넌트 구현

* feature: 프로필/커버 이미지 프리뷰 컴포넌트 구현

* feature: 공용 단일 인풋 field 컴포넌트 구현

* feature: 회원가입 폼 구현

* feature: 회원가입 페이지 구현

* design(FileUploader): ring을 outline으로 변경

* refactor: auth 하위 features를 auth/ui로 이동

* refactor: signup을 auth에서 분리

* feature: 공용 체크박스 컴포넌트 구현

* feature: 온보딩 폼에 약관 동의 추가

* fix: 온보딩 컴포넌트 import 경로 수정

* design: 존재하는 aside 영역만 표시하도록 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #140 팀 설정 멤버관리 페이지 구현 (#142)

* feature: 코로그 멤버 모조 데이터 추가

* feature: 코로그 설정 탭 구현

* feature: 코로그 멤버 관리 멤버 행 구현

* feature: 멤버 관리 섹션 구현

* feature: 코로그 설정 내 탭 조합

* feature: 코로그 설정 페이지(멤버 관리) 구현

* design(MemberManagementSection): 우상단 버튼 간격 조정

* [Feature] #93 로그인 모달 구현 (#137)

* design(Modal): 모달 내 개행 허용 및 레이아웃 조정

* feature: 로그인 모달 구현

* feature: 사이드바 로그인 버튼에 로그인 모달 연결

* feature: 로그인 모달을 전역으로 관리할 수 있도록 Context 구현

* feature: 로그인 상태에 따라 로그인 모달과 기존 액션을 분기하는 공통 훅 구현

* refactor(GuestSidebarFooter): 공통 로그인 모달 로직 적용

* [Feature] #94 온보딩 페이지 구현 (#136)

* chore: 브레이크포인트 토큰 추가

* feature: aside 기반 레이아웃 컴포넌트 구현

* feature: 프로필/커버 이미지 프리뷰 컴포넌트 구현

* feature: 공용 단일 인풋 field 컴포넌트 구현

* feature: 회원가입 폼 구현

* feature: 회원가입 페이지 구현

* design(FileUploader): ring을 outline으로 변경

* refactor: auth 하위 features를 auth/ui로 이동

* refactor: signup을 auth에서 분리

* feature: 공용 체크박스 컴포넌트 구현

* feature: 온보딩 폼에 약관 동의 추가

* fix: 온보딩 컴포넌트 import 경로 수정

* design: 존재하는 aside 영역만 표시하도록 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* fix: 아바타가 이미지 소스를 받을 수 있도록 수정

* feature: 멤버 초대 모조 데이터 추가

* feature: 멤버 초대 모달 내 멤버 행 컴포넌트 구현

* feature: 멤버 초대 모달 구현

* feature: 멤버 초대 모달 연결

* design: 멤버 초대 모달 내 스크롤 영역 조정

* refactor: 저장되지 않은 변경 가드 로직을 공통으로 분리

* feature: 멤버 수정 중 페이지 이탈 시 확인 모달 연결

* refactor: 코로그 설정 내 모든 저장되지 않은 변경을 일괄 처리할 수 있도록 개선

* fix(RootLayout): 사용자 정보 캐시 초기화 구독 컴포넌트 import 위치 수정

* feature: 코로그 설정 페이지에 셸 레이아웃 적용

* design: 멤버 목록 표 bg 및 border 설정 변경

* test: 누락된 코로그 설정 페이지 테스트 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #146 팀 생성 페이지 구현 (#147)

* fix: left 요소가 없을 때에도 gap이 적용되는 문제 해결

* chore: 팀 커버 이미지 플레이스홀더 에셋 추가

* feature: 팀 생성 폼 구현

* feature: 팀 생성 페이지 구현

* style: 불필요한 공백 제거

* feature: 팀 생성 버튼을 링크로 변경

* test: 팀 생성 페이지 통합 테스트 추가

* fix: 팀 생성 페이지에서 취소 시 이전 페이지로 리다이렉트하도록 변경

* chore: tailwind 속성 오타 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #81 피드 페이지 UI와 무한 스크롤 구현 (#143)

* feature: 피드 게시글 표시 모델과 날짜 포맷터 정의

* feature: 피드 카드와 이미지 fallback UI 구현

* feature: 목 데이터 기반 피드 페이지 조회 상태 구성

* feature: 피드 무한 스크롤과 요청 상태 UI 구현

* feature: 피드 위젯을 조립해 feeds 페이지 구현

* feature: 루트 진입 경로를 피드로 연결

* feature: 피드 진입 시 콘텐츠로 자연스럽게 이동

* refactor: 피드 Colog 식별자 명명 통일

* refactor: 피드 작성자 프로필 표현을 UserAvatar로 통일

* [Chore] #120 SVGR 기반 아이콘 사용 환경 설정 (#149)

* build: SVG 아이콘의 컴포넌트 사용 환경 제공

Next.js의 Turbopack과 Webpack, Vitest가 동일한 SVG import 계약을 사용하도록 구성한다.

Constraint: 개발 서버와 프로덕션 빌드 양쪽에서 SVG 컴포넌트 import가 동작해야 함
Rejected: SVG 전용 React 래퍼 유지 | 아이콘마다 반복되는 수동 마크업과 컴포넌트가 필요함
Confidence: high
Scope-risk: moderate
Directive: SVG를 URL로 사용할 때는 ?url import를 명시적으로 사용
Tested: pnpm check, Turbopack production build, Webpack production build, frozen lockfile install

* refactor: 사이드바 아이콘 표현 방식 통일

문자 기반 임시 아이콘을 제거하고 currentColor를 사용하는 SVG 컴포넌트로 교체한다.

Constraint: 기존 사이드바의 크기와 디자인 토큰을 유지해야 함
Rejected: 범용 아이콘 레지스트리 추가 | 현재 사용 범위에 비해 추상화 비용이 큼
Confidence: high
Scope-risk: narrow
Tested: pnpm check, 사이드바 component test, visual verification

* style: 기존 코드의 불필요한 빈 줄 정리

검증 도구가 요구하는 포맷을 맞추기 위해 동작에 영향을 주지 않는 공백만 정리한다.

Scope-risk: narrow
Tested: pnpm check

* [Feature] #144 게시글 상세 뷰 구현 (#148)

* feature: BlockNote 게시글 콘텐츠의 서버 렌더링 기반 마련

게시글 상세 화면은 작성 시 저장한 BlockNote 블록을 동일한 스키마로 받아 서버에서 HTML로 변환한다. 렌더러와 도메인 계약, 필요한 패키지 및 Next 외부 패키지 설정을 한 변경 단위로 묶었다.

Constraint: 실제 게시글 API 연동은 후속 작업으로 분리한다
Rejected: 클라이언트 에디터로 읽기 화면을 렌더링 | 읽기 전용 화면에 불필요한 클라이언트 경계를 만든다
Directive: API 연동 시 content 필드는 BlockNote Block 배열 계약을 유지해야 한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: develop 기준 기존 포맷 및 인증 import 오류로 전체 pnpm check 미실행

* feature: 게시글 상세 정보와 본문의 도메인 표현 구성

게시글 제목과 작성자, 발행일, 대표 이미지, CoLog 요약 및 본문 HTML 출력을 게시글 도메인 UI로 분리했다. 각 컴포넌트는 화면 조립이나 목차 행동을 알지 않고 게시글 데이터 표현에만 집중한다.

Constraint: 실제 게시글 데이터 조회는 후속 API 작업에서 연결한다
Rejected: 상세 위젯 한 파일에 모든 마크업 배치 | 도메인 표현과 화면 조립의 변경 이유가 섞인다
Directive: 상세 도메인 UI에는 목차 상태나 route 조회 책임을 추가하지 않는다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: develop 기준 기존 포맷 및 인증 import 오류로 전체 pnpm check 미실행

* feature: 게시글 구조에 맞춘 목차 탐색 흐름 제공

Swagger 계약을 대신하는 상세 목 데이터와 BlockNote h1부터 h3까지의 heading 추출, 현재 위치 추적 및 부드러운 앵커 이동을 하나의 상세 탐색 기능으로 구성했다.

Constraint: 실제 게시글 API 연결 전까지 Swagger 계약 기반 목 데이터를 사용한다
Rejected: 렌더링된 HTML을 다시 파싱해 목차 생성 | 원본 BlockNote 구조와 ID 정보를 중복 해석한다
Directive: API 연동 후에도 목차 입력은 렌더링 HTML이 아니라 BlockNote Block 배열을 사용한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: 실제 API 응답 및 브라우저 E2E는 후속 조립 커밋에서 검증

* feature: 게시글 상세 화면의 공개 경로 연결

게시글 도메인 UI와 목차 기능을 읽기 화면으로 조립하고 /posts/[postId] 경로에서 목 데이터를 제공한다. 존재하지 않는 게시글에는 피드 복귀가 가능한 404 화면을 제공하며 BlockNote 본문 스타일을 route 범위에서 적용한다.

Constraint: 실제 상세 API 연결 전까지 route는 동기 목 데이터 조회를 사용한다
Rejected: page 컴포넌트에 상세 마크업 직접 구현 | route와 화면 조립 책임이 결합된다
Directive: API 연동 시 page의 데이터 조회만 교체하고 PostDetail 조립 계약을 유지한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: 게시글 상세 Playwright 시나리오는 후속 테스트 작업에서 검증

* fix: develop 병합에서 누락된 BlockNote 서버 외부화 설정 복구

* chore: 각 태그 별 개행 간격 보정

* chore: 각 태그 별 개행 간격 보정 (헤딩 태그 유동적인 개행 간격 설정)

* feature: 전역에서 접근 가능한 공통 푸터 제공 (#69)

브랜드·정책·연락처 정보를 모든 페이지에서 일관되게 제공하도록 정적 Footer를 루트 레이아웃에 연결한다. 재사용 가능한 브랜드와 contact SVG는 public 자산으로 관리하고, 좁은 화면과 키보드 탐색을 회귀 테스트로 보호한다.

Constraint: 실제 정책 페이지와 연락 채널 URL은 후속 작업에서 연결
Rejected: 인라인 SVG 유지 | 다른 화면에서 동일 자산을 재사용하기 어려움
Confidence: high
Scope-risk: moderate
Directive: 실제 채널이 확정되면 Footer의 mock URL만 교체
Tested: format, lint, typecheck, unit 10개, component 11개, build, home E2E 3개

* [Feature] #139 팀 설정 프로필 페이지 구현 (#150)

* refactor: 코로그 요약과 프로필 타입을 단일 정보 모델로 통합

* feature: 코로그 프로필 설정값 검증과 정규화 정책 추가

* refactor: GitHub 로그인 아이콘을 공용 SVG 자산으로 통합

* feature: 코로그 프로필 이미지와 정보 입력 UI 구현

* feature: 팀 설정에 프로필 저장과 이탈 방지 흐름 연결

* test: 팀 프로필 설정의 저장과 이탈 방지 흐름 검증

* fix: 게시글의 긴 제목이 카드 내부에서 줄바꿈되도록 수정

* [Feature] #141 팀 설정 위험 영역 페이지 구현 (#151)

* feature: 팀 설정에서 영구 삭제 전 위험과 결과를 확인

* refactor: 팀 설정 기능을 동등한 섹션 계층으로 정렬

* feature: 클릭 가능한 공통 요소에 포인터 커서 제공

* refactor: SVG 아이콘을 소유 영역으로 이동해 컴포넌트 사용 방식 통일

* refactor: 워크스페이스에서 프로필 저장 상태 책임 분리

* refactor: 활성 설정 탭만 렌더링해 이탈 상태 관리 단순화

* [Feature] #145 팀 홈 페이지 구현 (#153)

* feature(PageShell): header가 전체 크기를 차지하는 레이아웃 추가

* chore: 깃허브/메일/링크 아이콘을 shared로 이동

* chore: 미트볼 아이콘 추가

* chore: 코로그 홈 mock 데이터 추가

* feature: 코로그 홈 히어로 컴포넌트 구현

* feature: 코로그 홈 멤버 목록 컴포넌트 구현

* design: 히어로 상단 더보기 버튼 반응형 위치 조정

* feature: 코로그 홈 게시글 목록 컴포넌트 구현

* test: 코로그 홈 내 컴포넌트 테스트 추가

* feature: 코로그 홈 페이지 구현

* design: 코로그 홈 반응형 추가

* design: 코로그 설명 및 코로그 게시글 캡션 폰트 사이즈 조정

* chore: 코로그 홈 페이지 진입 로직 주석 추가

* design: 코로그 홈 히어로 깃허브/메일 아이콘 사이 간격 조정

* refactor: 기존 도메인 model을 사용하도록 수정

* design: 코로그 소개 글 max-width 설정

* design(PageShell): main 섹션이 항상 중앙 배치되도록 수정

* design(CologMemberList): 유저 아바타 크기 조정

* [Refactor] #134 User Entity VO 고도화 (#158)

* feature: Email VO 추가

* feature: Nickname VO 추가

* feature: Slug VO 추가

* refactor: UserEntity VO 포장 적용

* refactor: Email은 VO이므로 null에 대한 방어 로직 적용

* refactor: Test Code Builder 수정

* feat: slug는 소문자로 저장한다는 정책 반영

* [Feature] #135 운영 서버 ci/cd 배포 파이프라인 추가 (#152)

* ci: 운영 서버 배포 파이프라인 추가

* ci: 운영 이미지 태그의 버전 변수 관리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 공개 팀 프로필 조회 경로 통합 (#165)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Chore] #155 공통 레이아웃 및 피드 UI 정리 (#157)

* feature: 브라우저 탭 파비콘 적용

* refactor: 루트 피드 리다이렉트를 설정으로 이전

* style: 게시글 상세 헤딩 하단 여백 확대

* refactor: 공통 Shell 합성 구조로 페이지 레이아웃 정리

* style: 게시글 피드 카드 가독성 조정

* chore: 게시글 상세 mock data 수정

* chore: tailwind css 속성값에 맞게 변경

* chore: sidebar/footer shell 제거

* chore: footer가 있는 페이지의 하단 여백을 공용 layout으로 추출

* [Feature] #159 게시글 상세조회 전용 단일 API 추가 (#163)

* feat: slug로 Blog 조회 메서드 추가

* feat: 특정 Post 조회시 연관관계를 함께 조회하는 메서드 추가

* feat: 특정 블로그의 전체 게시글 수 count 조회 메서드 추가

* feature: 해당 블로그의 팀원수를 count하는 집계 메서드 추가

* feature: 게시물 읽기 검증 및 소속 판단 로직 구현

- 테스트 코드추가

* feature: 게시글 소속에 따른 유동적인 응답을 제공하는 Dto 추가

* feature: 블로그의 특정 게시물을 상세 조회하는 통합 API 구현

* refactor: 기존 게시글 상세 조회 API를 V2로 마이그레이션

* feature: rilog, colog에 따른 응답 형식 변환을 Swagger 명세로 작성

* refactor: Controller 네이밍 & 어노테이션 순서 수정

* refactor: Colog 소속은 getColog를 사용하도록 변경

* refactor: 기존 PostDetailResponse
dV2를 PostDetailResponse로 네이밍 이전

* refactor: 도메인 용어를 affiliation에서 owner로 변경

* feature: 마지막 개행 추가

* feature: PostDetailResponse에 잘못된 블로그가 저장되지 않도록 방어하는 테스트 코드 추가

* refactor: jsonPath 수정

* [Feature] #156 팀 생성 페이지 로직 추가 (#160)

* feature: 팀 생성 구조 및 플로우를 팀 프로필 설정과 통일

* refactor: 코로그 생성 및 프로필 수정 공통 폼을 도메인 레이어로 분리

* chore: are로 시작하던 변수명을 is로 수정

* fix(CologCreateForm): 병합 충돌 과정에서 망가진 코드 복구

* fix(CologHomeHero): 테스트 용으로 남아있던 프로필 소개 repeat 제거

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>
Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Refactor] #172 affiliation에서 owner로 수정 (#173)

* [Feature] #161 모바일 반응형 대응 (#162)

* feature: 모바일용 하단 내비게이션바 추가

* design: 모바일 뷰에서도 게시글 상세 본문 텍스트를 16px로 통일

* design: 에디터 및 게시글 상세 list 요소 상하에 여백 추가

* feature: 모바일에서 발행 버튼을 하단으로 이동

* design: 푸터 모바일 반응형 추가

* refactor: 코로그 게시글에서도 PostFeedImage를 사용하도록 수정

* design: 코로그 홈 게시글 리스트 제목 폰트 사이즈 조정

* feature: 모바일용 date format 추가

* feature: 코로그 게시글 목록 닉네임에 truncate 추가

* design(CologPostList): 닉네임 우측 여백 제거

* design(Footer): 모바일 뷰에서 약관 제거

* feature: 모바일 뷰에서 하단 내비게이션바 대신 상단 헤더 사용

* design: 모바일 헤더 프로필에 border 추가

* fix: 사이드바 ui에서 로그아웃이 위로 옮겨짐 현상의 스파이 적출

* fix: footer 좌측에 여백이 중복으로 적용되던 문제 수정

* chore: format-published-date-mobile 파일을 기존 파일에 병합 및 모바일 여부를 인자로 받을 수 있도록 리팩토링

---------

Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Feature] #170 온보딩 폼 로직 연결 (#174)

* feature: 온보딩 폼 로직 추가

* chore(get-service-url-label): 네이밍 규칙에 맞지 않는 파일명 수정

* test(BlockNoteEditor): placeholder 관련 테스트 수정

* chore: navigate 라우터에 replace('/') 속성 추가

* feature: 온보딩 입력 유효성 검사 로직 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>
Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Refactor] #166 공개 블로그 게시글 목록 조회 제공 (#169)

* feature: 공개 블로그 게시글 목록 조회 제공

* fix: 공개 블로그 경로의 골뱅이 표기 복원

* fix: 공개 블로그 조회의 삭제 블로그 제외

공개 블로그 게시글 목록 조회에서 삭제된 블로그를 제외하도록 slug 조회 계약을 변경하고 공개 프로필 조회 진입점을 BlogController와 BlogService로 이동한다.

Tested: backend ./gradlew test

* refactor: 게시글 피드의 블로그 응답 이름 통일

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Fix] #171 코로그 설정 페이지 중첩 스크롤 문제 해결 (#175)

* feature: 코로그 프로필 설정 중첩 스크롤 제거

* refactor: 섹션이 page shell을 관리하도록 변경

* [Refactor] #167 라우트 경로 정리 (#178)

* refactor: App Router 페이지를 통일된 URL 구조로 재배치

* refactor: 내부 링크를 @slug 기반 라우트 계약으로 통일

* refactor: 코로그 설정 탭을 URL query와 동기화

* [Feature] #176 전체 피드 게시물 목록 조회 api 함수 구현 (#181)

* docs(frontend/AGENTS): api 아키텍처 관련 에이전트 지침 추가

* feature: 전체 피드 목록 조회 api 함수 구현

* config(next.config): mock 데이터 수용을 위해 remotePattern 전체 허용

* refactor: ssr prefetch에도 대응할 수 있도록 option/prefetch/query를 모아 관리하는 구조로 개편

* feature: 전체 피드 목록 조회 api 연동

* refactor: src/api 구조 개선

* chore: read-full-feed-posts.md task 파일 삭제

* chore: refactor-query-mutation task 파일 삭제

* refactor: 함수명은 축약하지 않은 상태로 복구

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* fix: 라우터 슬러그에 undefined 되던 버그 수정 (#185)

* [Refactor] #177 blogid를 slug로 통일 (#180)

* refactor: 멤버초대 검증 로직을 BlogMember 내부로 응집화

* refactor: cologId 대신 slug로 통일

* refactor: cologId 대신 slug로 멤버 초대 API 수정

* refactor: 게시글 발행 시 blogId 대신 slug를 사용하도록 통일

* refactor: BlogMember는 blogId로 조회하도록 개선

* refactor: 탈퇴된 Blog는 조회하지 않도록 JPA 쿼리 메서드에 반영

* [Feature]#186 게시글 상세 조회 api 구현 (#188)

* refactor: 피드 API 모듈을 shared 영역으로 이동

* feature: 게시글 상세 조회 API 연동

* refactor: 응답 필드명과 게시글 소유자 구조 통일 (#182)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #191 게시글 응답의 작성자 이름 필드명 통일 (#193)

* refactor: 게시글 응답의 작성자 이름 필드명 통일

* test: 전체 피드의 팀 소유자 응답 계약 보강

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Fix]  #189 피드 응답 필드명/소유자 구조 통일 반영 (#190)

* feature: 바뀐 백엔드 응답 형식에 맞게 반영

* fix: 블로그 상세 조회 API 타입 통일 및 author 필드명 호환성 처리

* [Feature] #187 공통 예외처리 로직 구현 (#194)

* chore: 에러 코드 상수화

* style: import문 정렬 수정

* chore: 서버 에러 응답 타입 정의

* feature: 서버 에러 정규화 로직 구현

* test: 테스트 내 401 에러 응답 공통 모듈로 분리

* feature: 블록노트 content 타입을 더 구체적으로 정의

* feature: 에러 정규화 로직을 가진 apiRequest/apiClient 구현 및 적용

* feature: 에러 정규화 로직을 가진 apiRequest/apiClient 구현 및 적용

* fix: 누락된 토큰 재발급 실패 이벤트 발행 로직 연결

* refactor: ky instance 생성 함수명 및 파일명 변경

* fix: requires auth 관련 로직 제거

* refactor: 오류 분류 세분화

* feature: Tanstack Query 전역 재시도 정책 설정

* feature: 폼 필드 에러 추출 함수 구현

* test: 요청 재시도 관련 테스트 추가

* refactor: 응답 필드명과 게시글 소유자 구조 통일 (#182)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* fix: kind/category 혼용되는 용어를 type/kind로 정리

* fix: 백엔드 Author 속성 코드 롤백

* fix: 백엔드 Author 속성 코드 롤백

---------

Co-authored-by: 진리로 <riro12@naver.com>

* [Refactor] #192 Blog Entity의 String slug를 Slug VO로 적용 (#195)

* refactor: Blog Entity의 String slug를 Slug VO로 적용

* refactor: Slug를 Blog 패키지로 이동한다.

* refactor: slug로 Blog 조회 이후는 id를 사용하도록 개선

* fix: Feed 조회 시, Slug VO도입으로 인한 JPQL 파싱 문제 해결 (#199)

* chore: backend-prod 라벨 추가 (#202)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #196 프론트엔드 모델 구조 리팩터링 (#203)

* chore: VSCode 작업 환경 설정 업데이트

* refactor: 도메인 계층 모델 구조 단일화 및 통합

* refactor: 코로그 관련 피처 model 및 lib 책임 분리

* refactor: 게시글 상세 피처 구조 개선 및 ID 매핑 수정

* refactor: 게시글 피드 피처 model 및 lib 책임 분리

* refactor: 게시글 작성 피처 model 및 lib 책임 분리

* refactor: 회원가입 피처 model 및 lib 책임 분리

* refactor: 게시글 피드 카드 및 관련 UI 컴포넌트를 post-feed 피처로 이전

* [Chore] #197 프론트엔드 배포 세팅 (#200)

* chore: pm2 스크립트 추가

* chore: CD 배포 파이프라인 구축 및 self-hosted 러너 연동

* chore: 워크플로우 수동 테스트 수단 추가

* chore: 워크플로우 수동 실행 시 배포 스크립트까지 실행되도록 수정

* chore: 임시로 PR 업데이트 시에도 배포 스크립트가 돌아가도록 설정

* chore: TARGET_DIR 경로 수정

* chore: NVM_DIR 경로 수정

* chore: node 설치 스크립트 추가

* chore: 환경변수 동적 할당 방식으로 변경

* chore: 환경변수를 절대경로로 변경

* chore: 전역 설치된 pnpm 및 pm2를 사용하도록 스크립트 수정

* fix: nvm 로드하는 코드 추가

* fix: nvm 파일 경로 확인되는지 디버깅

* fix: node와 pnpm 조합으로 변경

* fix: ssh 접속 환경과 동기화하는 코드 추가

* chore: NVM 경로를 환경변수 기반으로 변경

* chore: corepack 기반으로 pnpm 실행하도록 수정

* chore: 디버깅 코드 추가

* fix: nvm 자체 설치 로직 추가

* fix: pm2 자동 종료 정책 예외 처리

* chore: 초기 배포 스크립트로 복구

* chore: npm 경로 설정

* chore: env secret 이름 변경

* fix: 배포 환경 무한 재렌더 문제 해결

* chore: 요청 응답 공통 로깅 추가

* fix: 남아있는 배포 환경 무한 재렌더 문제 해결

* chore: 배포 스크립트를 프로덕션으로 전환

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #205 파일 업로드 api 구현 (#206)

* feat: 파일 업로드를 위한 Presigned URL API 및 클라이언트 구현

* refactor: Content-Type 방어 로직 추가 및 Presigned 네이밍 일관성 정렬

* refactor: S3 업로드 시 kyInstance 재활용 및 외부 URL 인증 토큰 주입 방어

* refactor: 토큰 만료 응답 판별 로직 캡슐화 및 타입 안정성 개선

---------

Co-authored-by: 송아영 <azerosong@gmail.com>

* [Feature] #207 getpublicprofile api 프론트엔드 연동 (#208)

* feature: 공개 블로그 프로필 조회 API 및 타입 정의

공개 블로그 프로필 정보를 조회하는 백엔드 엔드포인트(/v1/blogs/@{slug}) 호출 함수와 응답 인터페이스를 추가한다.

Tested: readBlogPublicProfile 단위 테스트 통과

* feature: 공개 블로그 프로필 React Query 훅 및 옵션 추가

공개 블로그 프로필 조회를 위한 query key, query options, useQuery 훅 및 prefetch 함수를 추가한다.

Tested: vitest 단위 테스트 및 타입 검사 통과

* feature: 블로그 홈 프로필 정보 API 연동

기존의 목 데이터를 제거하고 실제 getPublicProfile API를 호출하여 블로그 홈의 헤더 프로필 정보를 렌더링한다.
응답 데이터를 화면 컴포넌트 규격에 맞게 변환하는 매핑 유틸 함수를 추가한다.

Tested: mapCologProfileResponse 단위 테스트 통과

* [Feature] #204 서비스 통합테스트 유틸 ServiceSupport 추가 (#220)

* build: 테스트 DB h2 의존성 추가

* feature: 테스트 격리를 위한 DatabaseCleaner 추가

* feature: DatabaseCleanerConfiguration 설정 추가

* feature: 서비스 통합테스트 유틸 ServiceSupport 추가

* feature: application-test.yaml 추가

* chore: 사용하지 않는 주석 제거

* feature: Slug, Nickname 중복검사 서비스 통합테스트 작성

* refactor: 개행 두번을 하나로 삭제

* refactor: 잘못된 서비스 호출 오류 수정

* [Feature] #210 로그아웃 API 제공 (#216)

* feature: 로그아웃 API 제공

* refactor: Refresh Token 쿠키 주입 방식 정리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: @LoingUserId, @LoginUserSulg 어노테이션 스웨거 무시 설정 추가 (#222)

* [Feature] #217 내 블로그 목록 조회 api 연동 (#223)

* feature: 내 블로그 목록 요약 조회 api 함수 구현

* test: 테스트용 QueryClient 구현

* feature: 사이드바 팀 내비게이션에 내 팀 목록 요약 조회 api 연동

* [Feature] #225 토큰 기반 유저정보 조회 API 추가 (#228)

* refactor: 패키지 유지 용도의 .gitkeep 삭제

* feature: 유저 정보 조회 비즈니스 로직 추가 (by UserId)

* feature: 토큰 기반 유저 정보 조회 API 추가

* refactor: 닉네임, 슬러그 중복 검사 코드 위치 수정

* test: 유저 정보 조회 서비스통합테스트 코드 추가

* feature: 누락된 UserApiSpec 추가

* [Build] #231 deploy job 셀프호스트 라벨 추가 (#232)

* [Feature] #227 GitHub OAuth 프론트 콜백 흐름 제공 (#229)

* feature: GitHub OAuth 프론트 콜백 흐름 제공

* feature: 내부 경로 검증 추가

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #211 코로그 홈 게시글 피드 조회 api 연동 (#226)

* feature: 공개 블로그 게시글 목록 조회 API 및 쿼리 구현

* feature: 코로그 홈 게시글 목록 API 연동 및 무한 스크롤 적용

* [Refactor] #211 colog-home 위젯 내부 UI를 features 계층으로 분리

- colog-home 위젯의 CologHomeHero, CologPostList를 위젯의 Public UI(조합 레이어)로 격상
- 기존 colog-home/ui에 혼재되어 있던 기능별 표현 로직을 features 하위(colog-profile, colog-members, colog-post-feed)로 추출
- CologPostList에 스켈레톤 UI(CologPostFeedSkeleton) 적용 및 관련 훅 이동
- page.tsx 내의 불필요한 데이터 fetch 및 매퍼 로직을 제거하고 각 위젯/기능이 스스로 데이터를 책임지도록 개선

* [Feature] #219 멤버 추가 시 유저 정보 조회 api 연동 (#230)

* feature: 슬러그 기반 유저 정보 조회 api 함수 구현

* feature: 멤버 초대 모달 유저 정보 조회 api 함수 연동

* refactor: 멤버 초대 시 유저 조회 로직을 mutation으로 리팩터링

* [Feature] #224 토큰 기반 유저 정보 조회 api 연동 (#234)

* style: 불필요한 공백 제거

* feature: 토큰 기반 유저 정보 조회 api 함수 구현

* feature: 유저 관련 쿼리에 인가 쿼리 키 추가

* feature: 마스터토큰 기반 임시 token provider 구현

* feature: 전역 로그인 상태를 context로 관리

* feature: 전역 인가 상태를 기반으로 분기 로직 수정

* feature: 로그아웃/토큰 만료 시 인증 상태 초기화 로직 추가

* feature: 토큰이 없는 경우 토큰 기반 api가 호출되지 않도록 방어

* feature: map 변환 함수 추가

* [Feature] #213 팀 블로그 생성 api 연동 (#235)

* refactor(colog): 이메일 필드 완전 제거 및 잔재 정리

* [Feature] #213 팀 블로그 생성 API 및 타입 추가

* [Feature] #213 팀 블로그 생성 useMutation 훅 추가

* [Feature] #213 팀 블로그 생성 폼 실제 API 연동 및 모의 데이터 제거

* [Test] #213 팀 블로그 생성 폼 연동 테스트 업데이트

* [Hotfix] #236 멤버 모의 데이터 누락 복구 (#237)

* [Feature] #209 깃허브 소셜 로그인 구현 (#238)

* feature: 깃허브 소셜 로그인 구현

* refactor: auth api 경로를 shared 하위로 이동

* feature: 소셜 로그인 뒤 헤더로부터 토큰을 추출하는 로직 추가

* [Feature] #240 환경변수 추가 설정 (#243)

* refactor: RefreshToken SameSite Option 환경변수로 분리

* feature: AWS_S3_DIRECTORY application.yaml에 환경변수 추가

* [Feature] #215 팀…
Wlsflfh added a commit that referenced this pull request Aug 21, 2026
* chore: 저장소 공통 제외 규칙 설정 (#6)

* docs: 프로젝트 하네스 기본 기준 정리 (#8)

* chore: 파트별 변경의 리뷰 요청 자동화 (#12)

* [Chore] #9 프론트엔드 초기 세팅 (#10)

* chore: 프론트엔드 공통 실행·검증 환경 구성

* docs: 프론트엔드 개발 및 협업 기준 문서화

* chore: 미사용 코드와 빈 줄 검사 강화

* docs: 작업 범위별 브랜치 명명 기준 통일 (#17)

* [Chore] #14 프론트엔드 디자인 토큰 구성 (#18)

* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검

* [Chore] #15 ky config/client 설정 (#23)

* chore: config 폴더 제거

* chore: api client 테스트를 위한 의존성 설치

* feature: 토큰 재발급 로직을 포함하는 api client 모듈 구현

* feature: 토큰 재발급 실패 시 유저 데이터 초기화를 위한 구독발행 모델 구축

* style: import 순서 정렬

* chore: vitest config 내 alias 대상 상대경로 수정

* refactor: 토큰 재발급 실패 시 초기화 필요한 쿼리의 키를 그루핑

* feature: 토큰 재발급 실패 시 쿼리 초기화를 트리거하는 훅 컴포넌트 구현

* feature: QueryProvider 구현 및 적용

* chore(apiClient): tokenProvider 관련 TODO 추가

* chore(playwright.config): 대상 디렉터리 경로 수정

* chore: .env.example 파일 추가

* docs: 작업 범위별 브랜치 명명 기준 통일 (#17)

* [Chore] #14 프론트엔드 디자인 토큰 구성 (#18)

* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검

* chore(createApiClient): 토큰 재발급 분기 처리 관련 TODO 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #20 공용 버튼 컴포넌트 추가 (#21)

* feature: 서비스 전역 버튼 인터페이스 통일

* refactor: Button 타입과 크기별 스타일을 정리

Button에서만 사용하는 props 타입을 컴포넌트 파일로 옮기고 public entry의 타입 export를 제거했다.
버튼 크기별 모서리 반경도 sm/md와 lg의 위계를 드러내도록 조정했다.

Constraint: Button 타입의 외부 소비처가 없음
Rejected: 별도 타입 파일 유지 | 단일 소비처를 위한 파일 경계가 불필요함
Confidence: high
Scope-risk: narrow
Directive: 외부 타입 소비처가 생기면 필요한 타입만 public entry로 다시 공개할 것
Tested: pnpm check (format, lint, typecheck, component tests, build)
Not-tested: E2E 브라우저 흐름

* refactor: Button 전용 토큰의 소유 위치 정리

Button만 소비하는 시맨틱 토큰을 컴포넌트 폴더로 이동하고, 전역 스타일 진입점에서 등록하도록 import 경로를 분리했다.

Constraint: Tailwind 유틸리티 생성을 위해 @theme 토큰은 전역 CSS에서 import되어야 함
Rejected: foundations 토큰 폴더 유지 | Button 컴포넌트와 토큰의 소유 관계가 분산됨
Confidence: high
Scope-risk: narrow
Directive: 다른 공용 컴포넌트 전용 토큰도 소비처가 하나면 해당 컴포넌트와 함께 관리할 것
Tested: pnpm check (format, lint, typecheck, component tests, build)
Not-tested: E2E 브라우저 흐름

* [Chore] #19 전역예외처리핸들러 초기세팅 (#24)

* chore: domain 패키지 구조 유지 (#19)

* feat: InvalidParam 추가 (#19)

- 유효하지 않은 Param을 전달하기 위함.

* feat: ErrorDetail 추가 (#19)

* feat: RilogBusinessException 추가 (#19)

- 어플리케이션 최상위 커스텀 예외

* feat: ErrorInformation 추가 (#19)

- 커스텀 예외 생성자 시그니처를 Interface로 단축

* feat: GlobalExceptionInformation 추가 (#19)

* feat: GlobalExceptionHandler 추가 (#19)

- 전역 예외처리 핸들러로 한 곳에서 예외처리 관리

* docs: exception-handling.md 추가 (#19)

- 비즈니스 예외를 일관된 API 오류 응답으로 변환하는 방법을 설명

* refactor: 메서드 네이밍 수정 (#19)

* refactor: 자바 기본 예외는 초기세팅에 포함하지 않음. (#19)

* refactor: 클래스 선언 직후, 괄호 닫기 전 개행 추가 (#19)

* [Chore] #27 BaseEntity 초기세팅 (#28)

* build: Spring Data Jpa 라이브러리 추가 (#27)

* feat: BaseEntity 추가 (#27)

* feat: JpaAuditingConfig 추가 (#27)

- JpaAuditing 설정 허용

* feat: Spring Data 관련 예외처리 등록 (#27)

* docs: BaseEntity 사용 가이드.md 추가  (#27)

* chore: 프론트엔드 타입과 모듈 경계 규칙 통일 (#29)

객체 계약은 interface를 기본으로 사용하고 모듈 경계 import만 절대 경로를 사용하도록 기존 코드와 하네스를 함께 정리한다.

Constraint: 같은 모듈 내부 상대 경로는 허용
Rejected: 모듈별 barrel 유지 | 현재 공개 API 규모 대비 관리 비용과 runtime 혼합 위험이 큼
Directive: barrel 재도입은 명시적인 public API 필요가 확인된 뒤 별도 이슈 또는 ADR로 결정
Tested: Node 24.19.0에서 pnpm check 및 Playwright E2E 통과

* [Feature] #31 로그인 사용자 식별자 초기 구현 (#32)

* feat: @LoginUserId 추가 (#31)

* feat: @LoginUserSlug 추가 (#31)

* feat: 임시 LoginUserIdArgumentResolver 추가 (#31)

- 작업 병목을 막기 위한 임시 ArgumentResolver

* feat: 임시 LoginUserSlugArgumentResolver 추가 (#31)

- 작업 병목을 막기 위한 임시 ArgumentResolver

* [Feature] #30 users 테이블 구현 (#33)

* chore: service, repository 패키지 구조 추가

* refactor: HealthController 패키지 위치 변경

* refactor: HealthController 패키지 구조 변경에 의한 수정

* feature: User 테이블 구현

* feature: OnboardingStatus 구현

* test: UserTest 구현

* refactor: Onboarding 입력 값 추가

* test: Onboarding 입력 값 추가에 의한 테스트 케이스 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #34 1차 MVP Entity 초기 구현 (#39)

* refactor: 잘못된 패키지 구조 형식 제거 (#34)

* feature: test 패키지 gitignore 추가 (#34)

* refactor: User 패키지로 이동 (#34)

* refactor: HealthCheckController 패키지 이동 (#34)

* feature: user entity에 UNIQUE 제약 추가 (#34)

* feature: blog entity 추가 (#34)

* feature: post entity 추가 (#34)

* feature: BlogMember entity 추가 (#34)

* feature: local.env gitignore 추가 (#34)

* refactor: BlogMember Entity 잘못된 @table name 속성 수정  (#34)

* feature: application profile별 분리  (#34)

* refactor: author를 user로 변경 (#34)

* [Feature] #42 Swagger 추가 (#44)

* build: swagger 의존성 추가 (#42)

* build: dev, local 환경에 swagger 접속 허용 (#42)

* feature: OpenApiConfig 추가 (#42)

* [Feature] #47 예외 응답 형식 변경 (#48)

* refactor: GlobalExceptionInformation getErrorCode 응답 형식 변경

* docs: 예외 Enum 사용 방식 변경으로 docs 반영

* [Feature] #49 GitHub oauth 로그인 요청 및 callback 구현 (#56)

* refactor: 인증 보조 타입의 도메인 패키지 이동

* refactor: 인증 보조 타입의 패키지 선언 정리

* feature: GitHub OAuth 로그인 요청과 callback 검증 추가

* fix: 온보딩 slug 최초 저장과 재변경 방지

* docs: 아키텍쳐 구조 설명 추가

* fix: 파라미터 버그 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #45 게시글 발행 기능 구현 (#59)

* feature: Blog Entity에 owner 추가

* feature: Post Builder 패턴 적용

* refactor: 잘못 사용된 어노테이션 수정

- LoginUserId -> LoginUserSlug

* refactor: BlogType을 도메인 용어로 수정 COLOG, RILOG

* feat: Colog인지 확인하는 도메인 로직 추가

* feat: Blog 도메인 예외 추가

* Merge branch 'develop' of https://github.com/woowacourse-teams/2026-rilog into be/feature/#45-게시글-발행-기능-구현

# Conflicts:
#	backend/src/main/java/kr/rilog/domain/auth/resolver/LoginUserSlugArgumentResolver.java

* feat: 사용자를 찾을 수 없는 예외 에러 코드 추가

* feat: UserRepository 추가

* feat: BlogRepository 추가

- 개인사용자의 블로그를 조회하는 메서드 추가

* refactor: default 생성자 문제 해결 @Autowired 적용

* feat: PostRepository 추가

* feat: PostPublishRequest 추가

* feat: PostPublishResponse 추가

* feat: PostDetail 추가

* feat: PostSaveCommand 추가

* feat: PostPublishResult 추가

* refactor: default 생성자 문제 해결

* feat: PostService 추가 및 게시글 작성 구현

- 이미지 처리는 다음 이슈에 구현

* feat: PostController 추가 및 게시글 작성 API 구현

- 이미지 처리는 다음 이슈에 구현

* feat: NoResourceException 전역 예외 처리 추가

* feat: Post 게시글 작성 단위 테스트 추가

* refactor: .gradle-codex gitignore에 추가

* refactor: NoResourceFoundException 발생 시 잘못된 예외 코드 수정

* feature: Blog 소유자인지 판단하는 도메인 로직 추가

* feature: 게시글 작성 시, 다른 개인 블로그에 글을 작성할 수 있는 엣지케이스 제거 및 테스트 코드 작성

* [Feature] #57 GitHub access token 교환 및 사용자 정보 조회 구현 (#58)

* fix: GitHub 로그인 시작 생성자 주입 대상 명확화

* feature: GitHub Access Token 교환과 사용자 조회 추가

* refactor: 소셜 로그인 provider 경계 분리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #60 GitHub 로그인 사용자 생성과 온보딩 대기 처리 (#61)

* feature: GitHub 로그인 사용자 생성과 온보딩 대기 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

* refactor: OAuth 로그인 사용자 조회 흐름과 테스트 정리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

* fix: 생성자 충돌로 인한 정적 팩토리 메서드로 변경

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #62 전체 게시글 수 조회 API 구현 (#63)

* feature: 전체 게시글 수 조회 메서드 추가

* feature: TotalPostsCountResponse 추가

* feature: 전체 게시글 수 API 구현

* [Feature] #64 특정 게시글 상세 조회 API 구현 (#66)

* feat: hibernate Jackson 버전을 Spring Boot 4.0.x의 기본 Jackson 버전으로 명시

* feat: Post와 Author Fetch Join 메서드 추가

* feat: Post 도메인 예외 추가

* feat: 비공개 게시글 읽기 검증 로직 추가

* feat: 게시글 상세 조회 ResponseDto 추가

* feat: 게시글 상세 조회 비즈니스 로직 추가

* feat: 게시글 상세 조회 API 추가

* refactor: 잘못된 import 경로 수정

* refactor: 메서드명 readPosts에서 readPost로 변경

* refactor: Post에서 사용하지 않는 logoUrl 삭제

* fix: 메서드 시그니처 수정 누락 반영 (#71)

- logoUrl 메서드 시그니처 삭제

* feature: 자체 Access Token 발급과 검증 구현 (#67)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #68 Bearer 인증 인터셉터 구현 (#74)

* feature: Bearer 인증 인터셉터 구현

* refactor: 인증 선언과 사용자 주입 책임 분리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 역할 기반 인가 처리 구현 (#77)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feataure: 공용 텍스트 인풋 컴포넌트 구현 (#38)

* chore: placeholder 컬러 토큰 추가

* feature: 인풋 text 컴포넌트 구현

* chore: 범용 spacing 토큰 추가

* feature(Input): 아이콘/주소 prefix 등을 위해 인풋 좌측 슬롯 구현

* feature: 텍스트 영역 컴포넌트 구현

* style: css prettier 포맷 통일

* feature: left 컴포넌트를 클릭해도 input에 focus 되는 기능 추가

* feature(Textarea): 포커스 시 아웃라인 색상 지정

* test(Textarea): uncontrolled 방식의 테스트 제거

* [Feature] #72 전체 피드 게시글 목록 조회 (#79)

* feature: 전체 피드 게시글 목록 조회 메서드 구현

- 데이터 양이 많은 content 생략을 위해 Projection 사용.
- 정렬순은 하드코딩, 추후 확장성 고민해야함.

* feature: 전체피드 게시글 목록 Response 추가

- Inner Record를 사용

* feature: 전체피드 게시글 목록 조회 비즈니스 로직 추가

* feature: 전체피드 게시글 목록 조회 API 추가

* feature: 전체피드 게시글 목록 조회 API 추가

* feature: 전체피드 게시글 목록 조회 API Swagger 명세 추가

* feature: FeedService 단위 테스트 추가

* feature: 요청에 필요한 파라미터 누락 예외 상세하게 처리

* refactor: 잘못된 import 경로 수정

* [Refactor] #80 공통 응답 형식 적용 (#82)

* refactor: 공통 응답 ApiResponse 적용

- 소셜 로그인 컨트롤러는 미적용

* feature: ApiResponse 응답 적용

* refactor: 공통 응답 ApiResponse 적용

- 소셜 로그인 컨트롤러는 미적용

* feat: .gradle-user-home/ .gitignore 추가

* feature: 자체 로그인 토큰 흐름 제공 (#85)

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #84 Colog 피드에서 게시글 목록 조회 (#87)

* refactor: 전체피드 게시글 목록 조회 API에 ApiResponse 적용

* feature: 팀 피드 전체 게시글 목록 조회 메서드 추가

* feature: 팀 전체 피드 게시글 목록 응답 Dto 추가

* feature: 블로그 조회 메서드 추가

* refactor: 사용하지 않는 code 필드 제거 - ApiResponse

* feat: 팀피드 게시글 목록 조회 API 추가

* feat: 팀피드 게시글 목록 조회 비즈니스 로직 추가

* refactor: 전체 피드 게시글 목록 조회 비즈니스 로직 메서드명 수정

- 읽는다는 행위가 잘 드러나도록 read로 수정

* feature: 팀피드 게시글 조회 서비스 단위테스트코드 추가

* [Feature] #83 Refresh Token 재발급과 Rotation 처리 (#86)

* feature: Refresh Token 재발급과 Rotation 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

* [Feature] #84 Colog 피드에서 게시글 목록 조회 (#87)

* refactor: 전체피드 게시글 목록 조회 API에 ApiResponse 적용

* feature: 팀 피드 전체 게시글 목록 조회 메서드 추가

* feature: 팀 전체 피드 게시글 목록 응답 Dto 추가

* feature: 블로그 조회 메서드 추가

* refactor: 사용하지 않는 code 필드 제거 - ApiResponse

* feat: 팀피드 게시글 목록 조회 API 추가

* feat: 팀피드 게시글 목록 조회 비즈니스 로직 추가

* refactor: 전체 피드 게시글 목록 조회 비즈니스 로직 메서드명 수정

- 읽는다는 행위가 잘 드러나도록 read로 수정

* feature: 팀피드 게시글 조회 서비스 단위테스트코드 추가

* feature: Refresh Token 재발급과 Rotation 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>
Co-authored-by: koreaioi <koreaioi@gachon.ac.kr>

* feature: 로고이미지, 깃허브주소, 이메일 필드 추가 (#91)

* feature: #22 공용 모달 컴포넌트 구현 (#35)

* feature: 공용 모달의 접근성과 표시 동작 기반 마련

* feature: 단일 확인 동작을 제공하는 알림 모달 구성

* feature: 위험도와 처리 상태를 반영하는 확인 모달 구성

* feature: 다양한 콘텐츠 구성을 수용하는 범용 모달 제공

* chore: 프론트엔드 pnpm workspace 패키지 범위 명시

* refactor: 모달 Props 계약의 컴포넌트별 소유권 정리

* design: 모달 모서리 곡률을 서비스 스타일에 맞게 조정

* design: 모달 닫기 버튼의 클릭 영역과 배치 조정

* design: 모달 기본 액션 버튼의 높이와 최소 너비 통일

* fix: 모달 표시 중 배경 페이지 스크롤 차단

* design: 모달 백드랍 색상을 중립적인 톤으로 조정

* fix: 모달 pending 중 모든 액션과 종료 동작 차단

* refactor: 모달 처리 상태 계약 통일

* design: 버튼 포커스 링 여백 제거

* design: 버튼 포커스 표현을 아웃라인으로 통일

* feature: #36 공용 파일 인풋 컴포넌트 구현 (#75)

* feature: 파일 업로더 컴포넌트 구현

* feature: 이미지 업로더 컴포넌트 구현

* refactor(FileUploader): 불필요한 props 제거

* feat: change 핸들러 인터페이스 추가

* fix: 파일 업로더에 키보드 접근이 가능하도록 수정

* feature: 이미지 파일 검증 로직 추가

* [Feature] #89 팀 생성 로직 구현 (#95)

* feature: 팀 블로그 생성 도메인 모델 추가

* feature: 팀 블로그 생성 서비스 구현

* feature: 팀 블로그 생성 API 제공

* feature: 팀 블로그 URL 정보 생성 요청 반영

* refactor: @requiredargsconstructor 사용하도록 변경

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #88 나의 팀 목록 요약 API (#96)

* feature: 나의 팀 리스트 조회 메서드 추가

* feature: MyCologResponse 추가

* feature: 나의 팀 목록 조회 비즈니스 로직 추가

* feature: 나의 팀 목록 조회 API 추가

* feature: 나의 팀 목록 조회 단위테스트 추가

* feature: BlogController에 ApiSpec 명세 적용

* hofix: 생성자 중복 삭제 (#101)

* [Feature] 팀 멤버 초대 API 구현 (#98)

* feature: 팀 멤버 초대 API 구현

* fix: CologService 오류 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* fix: Clock 필드 주입 삭제 (#104)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 멤버 초대용 유저 정보 조회 제공 (#106)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #103 사용자 닉네임 슬러그 유효성 검사 구현 (#109)

* feat: 닉네임, 슬러그로 조회 메서드 추가

* feat: 닉네임, 슬러그 중복 예외 추가

* feat: 닉네임, 슬러그 중복검사 비즈니스 로직 추가

* feat: 닉네임, 슬러그 중복검사 API 구현

* feat: 닉네임, 슬러그 중복검사 테스트 코드 작성

* feature: 팀 상세 조회 API 구현 (#111)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 팀 프로필 조회 API 구현 (#113)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #110 colog 전체 멤버 목록 API 구현 (#114)

* feat: 팀목록 조회 메서드 추가

* feat: 팀목록 조회 비즈니스 로직 추가

* feat: 팀목록 멤버 조회 API 추가

* feat: 팀목록 멤버 조회 테스트 코드 추가

* feature: 온보딩 완료 후 정식 인증 세션 발급 (#116)

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #117 글 작성 및 조회 권한 처리 구현 (#118)

* feature: 게시글 상세 조회 선택 인증 지원

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

* feature: 게시글 작성과 비공개 조회 권한 검증

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #99 S3 PresignedUrl 발급 (#119)

* build: aws sdk s3 의존성 추가

* refactor: 예외 응답 고도화

* refactor: Upload 도메인 예외 추가

* refactor: Upload 도메인 enum 추가

* feat: PresignedUrl 관련 Dto 추가

* feat: S3 관련 환경변수 추가

* feat: S3Config 추가

* feat: S3Properties 추가

* feat: PresignedUrl 발급 비즈니스 로직 추가

* feat: PresignedUrl 발급 API 추가

* refactor: Dockerfile 캐싱 적용

* feat: 등록 가능 contentType, type 예시 추가

* [Build] #123 개발서버 CI-CD 파이프라인 구축 (#124)

* build: 개발서버 CI-CD 파이프라인 구축

* build: 잘못된 Dockerfile 명시 수정

* refactor: Push 에서 deploy job이 동작하도록 수정

* feature: 프론트 연동을 위한 CORS 설정 추가 (#125)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #127 크로스 플랫폼 설정과 GHA 캐싱 적용 (#128)

* refactor: 크로스 플랫폼 설정과 gha 캐싱 적용

* refactor: 잘못된 Dockerfile 이름 수정

* refactor: GitActions Runner 환경 ARM64 네이티브 러너 적용

* feature: 전달헤더 설정 추가 (#132)

- Swagger에서 API 요청 시 발생하는 CORS 문제 해결을 위함

* [Refactor] #129 로그인 이후 개인 블로그 생성 흐름 복구 (#130)

* fix: 로그인 이후 개인 블로그 생성 흐름 복구

* refactor: 온보딩 완료 책임의 서비스 의존 제거

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: #92 사이드바 구현 (#108)

* feature(Button): fullWidth 추가

* chore: navy 스케일 컬러 토큰 추가

* feature: 사이드바 컴포넌트 구현

* feature: 사이드바 접힘/열림 인터랙션 구현

* feature: 사이드바 관련 페이지 레이아웃 세팅

* feature: Button 스타일의 Link 컴포넌트를 ButtonLink로 분리

* feature: user/colog 공통 아바타 컴포넌트 구현

* feature: 사이드바 내비게이션 버튼 컴포넌트 구현

* feature: 사이드바 푸터 컴포넌트 구현

* feature: 사이드바 헤더 컴포넌트 구현

* refactor: 사이드바 컴포넌트 재구성

* test: 라우트 기반 로그아웃 동작을 버튼 기반으로 변경

* fix(Sidebar): 인가 여부 기본값 제거

* refactor(with-sidebar-layout): 메인 영역에 시맨틱 태그 사용

* feature: 공용 Divider 컴포넌트 구현

* feature: 사이드바에 Divider 추가

* fix(Sidebar): 인가 기본값 제거

* refactor(SidebarLayout): main 태그 제거

* test: 하드코딩된 UI 값 제거

* [Feature] #40 블로그 글 작성 페이지 UI 구현 (#126)

* build: BlockNote 패키지 버전 고정

* build: Pretendard 로컬 폰트 기반 제공

* design: BlockNote 스타일의 Rilog 토큰 연결

* feature: 글 작성 에디터 공개 계약 제공

* feature: 한국어 BlockNote 편집기 제공

* feature: 에디터 로드 실패 복구 상태 제공

* feature: BlockNote 브라우저 전용 로딩 경계 제공

* feature: 게시글 문서 유효성 판별

* feature: 자동 확장 제목 입력 흐름 제공

* feature: 본문 오류와 에디터 접근성 연결

* feature: 본문 이미지 로컬 업로더 제공

* feature: 글 작성 페이지의 기본 편집 흐름 제공

* feature: 글 작성 발행 진입 액션 제공

* feature: 저장되지 않은 글의 이탈 보호 제공

* feature: 게시 설정 도메인 계약과 선택 항목 제공

* feature: 대표 이미지 우선순위와 기본 미리보기 제공

* design: 파일 선택 컨트롤의 포커스 표현 통일

* feature: 접근 가능한 게시 설정 모달 제공

* feature: 게시 설정 유지와 발행 전 검증 제공

* feature: 교체 가능한 mock 발행 계약과 상세 경로 제공

* feature: 발행 상태 전이와 성공 후 이동 제공

* design: 게시 설정 모달의 경계와 포커스 표현 정돈

대표 이미지와 게시 설정 영역을 동일 비율로 배치하고 여백을 넓혀 정보 밀도를 조정한다. 모달 가장자리의 컨트롤은 focus outline을 내부에 표시해 잘림 없이 일관된 키보드 탐색 피드백을 제공한다.

Rejected: 공용 Button의 전역 outline offset 변경 | 모달 밖 버튼의 기존 시각 계약까지 바뀜
Confidence: high
Scope-risk: moderate
Directive: 모달 가장자리의 기본 컨트롤은 내부 focus outline 계약을 유지할 것
Tested: ESLint, TypeScript typecheck, component tests 86개, 키보드 focus 브라우저 확인, git diff check

* fix: 한글 조합 중 제목 Enter 이동 방지

IME 조합 중 발생한 Enter 이벤트를 본문 이동으로 처리하지 않도록
composition 상태를 확인한다.

Confidence: high
Scope-risk: narrow
Tested: PostTitleField component tests

* fix: 확정된 이탈 이동의 history 경쟁 제거

guard entry 제거와 실제 이동을 동기적으로 처리해 history.back과
fallback timer 사이의 중복 이동 가능성을 제거한다.

Rejected: popstate와 fallback timer 유지 | 이동 시점에 따라 두 경로가 경쟁할 수 있음
Confidence: high
Scope-risk: moderate
Tested: PostWriteWorkspace component tests

* fix: 유효한 상세 경로 확인 후 발행 상태 정리

발행 결과의 상세 경로를 먼저 검증해 잘못된 postId가 반환되더라도
작성 상태와 이탈 보호가 유지되도록 한다.

Rejected: 상태 정리 후 경로 생성 | 경로 생성 실패 시 작성 상태를 복구할 수 없음
Confidence: high
Scope-risk: narrow
Tested: PostWriteWorkspace component tests

* fix: BlockNote 표 셀 본문 유효성 판별

일반 content뿐 아니라 tableContent의 rows와 cells를 재귀 탐색해
표 안에 작성된 텍스트도 유효한 본문으로 인정한다.

Confidence: high
Scope-risk: narrow
Tested: post-write validation unit tests

* design: BlockNote 키보드 포커스와 블록 선택 표시 복원

BlockNote의 투명한 ring 값을 공용 focus token에 연결하고 선택된
콘텐츠에 outline을 제공해 현재 조작 대상을 식별할 수 있게 한다.

Constraint: 제목 입력은 기존 무경계 표현 유지
Rejected: box-shadow ring 추가 | 기존 outline 포커스 계약과 시각 효과가 중복됨
Confidence: high
Scope-risk: narrow
Tested: CSS formatting, production build, TypeScript

* fix: 실제 발행 제목과 길이 검증 기준 통일

제목의 앞뒤 공백을 제거한 값을 빈 값과 최대 길이 검증에 함께
사용해 실제 발행되는 제목과 검증 기준을 일치시킨다.

Confidence: high
Scope-risk: narrow
Tested: post-write validation unit tests

* design: 대표 이미지 선택 후 제어 영역 정렬

좁은 모달 열 안에서 이미지 변경과 제거 제어가 줄바꿈되지 않도록
설명과 버튼 행을 분리하고 선택 상태의 버튼 규격을 통일한다.

Rejected: viewport breakpoint 기반 flex 유지 | 실제 열 너비와 무관하게 가로 배치가 활성화됨
Confidence: high
Scope-risk: narrow
Tested: component tests, ESLint, TypeScript, production build, browser visual verification

* feat: 본문 placeholder에 마크다운 단축 문법 안내 제공

* [Feature] #93 로그인 모달 구현 (#137)

* design(Modal): 모달 내 개행 허용 및 레이아웃 조정

* feature: 로그인 모달 구현

* feature: 사이드바 로그인 버튼에 로그인 모달 연결

* feature: 로그인 모달을 전역으로 관리할 수 있도록 Context 구현

* feature: 로그인 상태에 따라 로그인 모달과 기존 액션을 분기하는 공통 훅 구현

* refactor(GuestSidebarFooter): 공통 로그인 모달 로직 적용

* [Feature] #94 온보딩 페이지 구현 (#136)

* chore: 브레이크포인트 토큰 추가

* feature: aside 기반 레이아웃 컴포넌트 구현

* feature: 프로필/커버 이미지 프리뷰 컴포넌트 구현

* feature: 공용 단일 인풋 field 컴포넌트 구현

* feature: 회원가입 폼 구현

* feature: 회원가입 페이지 구현

* design(FileUploader): ring을 outline으로 변경

* refactor: auth 하위 features를 auth/ui로 이동

* refactor: signup을 auth에서 분리

* feature: 공용 체크박스 컴포넌트 구현

* feature: 온보딩 폼에 약관 동의 추가

* fix: 온보딩 컴포넌트 import 경로 수정

* design: 존재하는 aside 영역만 표시하도록 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #140 팀 설정 멤버관리 페이지 구현 (#142)

* feature: 코로그 멤버 모조 데이터 추가

* feature: 코로그 설정 탭 구현

* feature: 코로그 멤버 관리 멤버 행 구현

* feature: 멤버 관리 섹션 구현

* feature: 코로그 설정 내 탭 조합

* feature: 코로그 설정 페이지(멤버 관리) 구현

* design(MemberManagementSection): 우상단 버튼 간격 조정

* [Feature] #93 로그인 모달 구현 (#137)

* design(Modal): 모달 내 개행 허용 및 레이아웃 조정

* feature: 로그인 모달 구현

* feature: 사이드바 로그인 버튼에 로그인 모달 연결

* feature: 로그인 모달을 전역으로 관리할 수 있도록 Context 구현

* feature: 로그인 상태에 따라 로그인 모달과 기존 액션을 분기하는 공통 훅 구현

* refactor(GuestSidebarFooter): 공통 로그인 모달 로직 적용

* [Feature] #94 온보딩 페이지 구현 (#136)

* chore: 브레이크포인트 토큰 추가

* feature: aside 기반 레이아웃 컴포넌트 구현

* feature: 프로필/커버 이미지 프리뷰 컴포넌트 구현

* feature: 공용 단일 인풋 field 컴포넌트 구현

* feature: 회원가입 폼 구현

* feature: 회원가입 페이지 구현

* design(FileUploader): ring을 outline으로 변경

* refactor: auth 하위 features를 auth/ui로 이동

* refactor: signup을 auth에서 분리

* feature: 공용 체크박스 컴포넌트 구현

* feature: 온보딩 폼에 약관 동의 추가

* fix: 온보딩 컴포넌트 import 경로 수정

* design: 존재하는 aside 영역만 표시하도록 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* fix: 아바타가 이미지 소스를 받을 수 있도록 수정

* feature: 멤버 초대 모조 데이터 추가

* feature: 멤버 초대 모달 내 멤버 행 컴포넌트 구현

* feature: 멤버 초대 모달 구현

* feature: 멤버 초대 모달 연결

* design: 멤버 초대 모달 내 스크롤 영역 조정

* refactor: 저장되지 않은 변경 가드 로직을 공통으로 분리

* feature: 멤버 수정 중 페이지 이탈 시 확인 모달 연결

* refactor: 코로그 설정 내 모든 저장되지 않은 변경을 일괄 처리할 수 있도록 개선

* fix(RootLayout): 사용자 정보 캐시 초기화 구독 컴포넌트 import 위치 수정

* feature: 코로그 설정 페이지에 셸 레이아웃 적용

* design: 멤버 목록 표 bg 및 border 설정 변경

* test: 누락된 코로그 설정 페이지 테스트 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #146 팀 생성 페이지 구현 (#147)

* fix: left 요소가 없을 때에도 gap이 적용되는 문제 해결

* chore: 팀 커버 이미지 플레이스홀더 에셋 추가

* feature: 팀 생성 폼 구현

* feature: 팀 생성 페이지 구현

* style: 불필요한 공백 제거

* feature: 팀 생성 버튼을 링크로 변경

* test: 팀 생성 페이지 통합 테스트 추가

* fix: 팀 생성 페이지에서 취소 시 이전 페이지로 리다이렉트하도록 변경

* chore: tailwind 속성 오타 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #81 피드 페이지 UI와 무한 스크롤 구현 (#143)

* feature: 피드 게시글 표시 모델과 날짜 포맷터 정의

* feature: 피드 카드와 이미지 fallback UI 구현

* feature: 목 데이터 기반 피드 페이지 조회 상태 구성

* feature: 피드 무한 스크롤과 요청 상태 UI 구현

* feature: 피드 위젯을 조립해 feeds 페이지 구현

* feature: 루트 진입 경로를 피드로 연결

* feature: 피드 진입 시 콘텐츠로 자연스럽게 이동

* refactor: 피드 Colog 식별자 명명 통일

* refactor: 피드 작성자 프로필 표현을 UserAvatar로 통일

* [Chore] #120 SVGR 기반 아이콘 사용 환경 설정 (#149)

* build: SVG 아이콘의 컴포넌트 사용 환경 제공

Next.js의 Turbopack과 Webpack, Vitest가 동일한 SVG import 계약을 사용하도록 구성한다.

Constraint: 개발 서버와 프로덕션 빌드 양쪽에서 SVG 컴포넌트 import가 동작해야 함
Rejected: SVG 전용 React 래퍼 유지 | 아이콘마다 반복되는 수동 마크업과 컴포넌트가 필요함
Confidence: high
Scope-risk: moderate
Directive: SVG를 URL로 사용할 때는 ?url import를 명시적으로 사용
Tested: pnpm check, Turbopack production build, Webpack production build, frozen lockfile install

* refactor: 사이드바 아이콘 표현 방식 통일

문자 기반 임시 아이콘을 제거하고 currentColor를 사용하는 SVG 컴포넌트로 교체한다.

Constraint: 기존 사이드바의 크기와 디자인 토큰을 유지해야 함
Rejected: 범용 아이콘 레지스트리 추가 | 현재 사용 범위에 비해 추상화 비용이 큼
Confidence: high
Scope-risk: narrow
Tested: pnpm check, 사이드바 component test, visual verification

* style: 기존 코드의 불필요한 빈 줄 정리

검증 도구가 요구하는 포맷을 맞추기 위해 동작에 영향을 주지 않는 공백만 정리한다.

Scope-risk: narrow
Tested: pnpm check

* [Feature] #144 게시글 상세 뷰 구현 (#148)

* feature: BlockNote 게시글 콘텐츠의 서버 렌더링 기반 마련

게시글 상세 화면은 작성 시 저장한 BlockNote 블록을 동일한 스키마로 받아 서버에서 HTML로 변환한다. 렌더러와 도메인 계약, 필요한 패키지 및 Next 외부 패키지 설정을 한 변경 단위로 묶었다.

Constraint: 실제 게시글 API 연동은 후속 작업으로 분리한다
Rejected: 클라이언트 에디터로 읽기 화면을 렌더링 | 읽기 전용 화면에 불필요한 클라이언트 경계를 만든다
Directive: API 연동 시 content 필드는 BlockNote Block 배열 계약을 유지해야 한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: develop 기준 기존 포맷 및 인증 import 오류로 전체 pnpm check 미실행

* feature: 게시글 상세 정보와 본문의 도메인 표현 구성

게시글 제목과 작성자, 발행일, 대표 이미지, CoLog 요약 및 본문 HTML 출력을 게시글 도메인 UI로 분리했다. 각 컴포넌트는 화면 조립이나 목차 행동을 알지 않고 게시글 데이터 표현에만 집중한다.

Constraint: 실제 게시글 데이터 조회는 후속 API 작업에서 연결한다
Rejected: 상세 위젯 한 파일에 모든 마크업 배치 | 도메인 표현과 화면 조립의 변경 이유가 섞인다
Directive: 상세 도메인 UI에는 목차 상태나 route 조회 책임을 추가하지 않는다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: develop 기준 기존 포맷 및 인증 import 오류로 전체 pnpm check 미실행

* feature: 게시글 구조에 맞춘 목차 탐색 흐름 제공

Swagger 계약을 대신하는 상세 목 데이터와 BlockNote h1부터 h3까지의 heading 추출, 현재 위치 추적 및 부드러운 앵커 이동을 하나의 상세 탐색 기능으로 구성했다.

Constraint: 실제 게시글 API 연결 전까지 Swagger 계약 기반 목 데이터를 사용한다
Rejected: 렌더링된 HTML을 다시 파싱해 목차 생성 | 원본 BlockNote 구조와 ID 정보를 중복 해석한다
Directive: API 연동 후에도 목차 입력은 렌더링 HTML이 아니라 BlockNote Block 배열을 사용한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: 실제 API 응답 및 브라우저 E2E는 후속 조립 커밋에서 검증

* feature: 게시글 상세 화면의 공개 경로 연결

게시글 도메인 UI와 목차 기능을 읽기 화면으로 조립하고 /posts/[postId] 경로에서 목 데이터를 제공한다. 존재하지 않는 게시글에는 피드 복귀가 가능한 404 화면을 제공하며 BlockNote 본문 스타일을 route 범위에서 적용한다.

Constraint: 실제 상세 API 연결 전까지 route는 동기 목 데이터 조회를 사용한다
Rejected: page 컴포넌트에 상세 마크업 직접 구현 | route와 화면 조립 책임이 결합된다
Directive: API 연동 시 page의 데이터 조회만 교체하고 PostDetail 조립 계약을 유지한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: 게시글 상세 Playwright 시나리오는 후속 테스트 작업에서 검증

* fix: develop 병합에서 누락된 BlockNote 서버 외부화 설정 복구

* chore: 각 태그 별 개행 간격 보정

* chore: 각 태그 별 개행 간격 보정 (헤딩 태그 유동적인 개행 간격 설정)

* feature: 전역에서 접근 가능한 공통 푸터 제공 (#69)

브랜드·정책·연락처 정보를 모든 페이지에서 일관되게 제공하도록 정적 Footer를 루트 레이아웃에 연결한다. 재사용 가능한 브랜드와 contact SVG는 public 자산으로 관리하고, 좁은 화면과 키보드 탐색을 회귀 테스트로 보호한다.

Constraint: 실제 정책 페이지와 연락 채널 URL은 후속 작업에서 연결
Rejected: 인라인 SVG 유지 | 다른 화면에서 동일 자산을 재사용하기 어려움
Confidence: high
Scope-risk: moderate
Directive: 실제 채널이 확정되면 Footer의 mock URL만 교체
Tested: format, lint, typecheck, unit 10개, component 11개, build, home E2E 3개

* [Feature] #139 팀 설정 프로필 페이지 구현 (#150)

* refactor: 코로그 요약과 프로필 타입을 단일 정보 모델로 통합

* feature: 코로그 프로필 설정값 검증과 정규화 정책 추가

* refactor: GitHub 로그인 아이콘을 공용 SVG 자산으로 통합

* feature: 코로그 프로필 이미지와 정보 입력 UI 구현

* feature: 팀 설정에 프로필 저장과 이탈 방지 흐름 연결

* test: 팀 프로필 설정의 저장과 이탈 방지 흐름 검증

* fix: 게시글의 긴 제목이 카드 내부에서 줄바꿈되도록 수정

* [Feature] #141 팀 설정 위험 영역 페이지 구현 (#151)

* feature: 팀 설정에서 영구 삭제 전 위험과 결과를 확인

* refactor: 팀 설정 기능을 동등한 섹션 계층으로 정렬

* feature: 클릭 가능한 공통 요소에 포인터 커서 제공

* refactor: SVG 아이콘을 소유 영역으로 이동해 컴포넌트 사용 방식 통일

* refactor: 워크스페이스에서 프로필 저장 상태 책임 분리

* refactor: 활성 설정 탭만 렌더링해 이탈 상태 관리 단순화

* [Feature] #145 팀 홈 페이지 구현 (#153)

* feature(PageShell): header가 전체 크기를 차지하는 레이아웃 추가

* chore: 깃허브/메일/링크 아이콘을 shared로 이동

* chore: 미트볼 아이콘 추가

* chore: 코로그 홈 mock 데이터 추가

* feature: 코로그 홈 히어로 컴포넌트 구현

* feature: 코로그 홈 멤버 목록 컴포넌트 구현

* design: 히어로 상단 더보기 버튼 반응형 위치 조정

* feature: 코로그 홈 게시글 목록 컴포넌트 구현

* test: 코로그 홈 내 컴포넌트 테스트 추가

* feature: 코로그 홈 페이지 구현

* design: 코로그 홈 반응형 추가

* design: 코로그 설명 및 코로그 게시글 캡션 폰트 사이즈 조정

* chore: 코로그 홈 페이지 진입 로직 주석 추가

* design: 코로그 홈 히어로 깃허브/메일 아이콘 사이 간격 조정

* refactor: 기존 도메인 model을 사용하도록 수정

* design: 코로그 소개 글 max-width 설정

* design(PageShell): main 섹션이 항상 중앙 배치되도록 수정

* design(CologMemberList): 유저 아바타 크기 조정

* [Refactor] #134 User Entity VO 고도화 (#158)

* feature: Email VO 추가

* feature: Nickname VO 추가

* feature: Slug VO 추가

* refactor: UserEntity VO 포장 적용

* refactor: Email은 VO이므로 null에 대한 방어 로직 적용

* refactor: Test Code Builder 수정

* feat: slug는 소문자로 저장한다는 정책 반영

* [Feature] #135 운영 서버 ci/cd 배포 파이프라인 추가 (#152)

* ci: 운영 서버 배포 파이프라인 추가

* ci: 운영 이미지 태그의 버전 변수 관리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 공개 팀 프로필 조회 경로 통합 (#165)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Chore] #155 공통 레이아웃 및 피드 UI 정리 (#157)

* feature: 브라우저 탭 파비콘 적용

* refactor: 루트 피드 리다이렉트를 설정으로 이전

* style: 게시글 상세 헤딩 하단 여백 확대

* refactor: 공통 Shell 합성 구조로 페이지 레이아웃 정리

* style: 게시글 피드 카드 가독성 조정

* chore: 게시글 상세 mock data 수정

* chore: tailwind css 속성값에 맞게 변경

* chore: sidebar/footer shell 제거

* chore: footer가 있는 페이지의 하단 여백을 공용 layout으로 추출

* [Feature] #159 게시글 상세조회 전용 단일 API 추가 (#163)

* feat: slug로 Blog 조회 메서드 추가

* feat: 특정 Post 조회시 연관관계를 함께 조회하는 메서드 추가

* feat: 특정 블로그의 전체 게시글 수 count 조회 메서드 추가

* feature: 해당 블로그의 팀원수를 count하는 집계 메서드 추가

* feature: 게시물 읽기 검증 및 소속 판단 로직 구현

- 테스트 코드추가

* feature: 게시글 소속에 따른 유동적인 응답을 제공하는 Dto 추가

* feature: 블로그의 특정 게시물을 상세 조회하는 통합 API 구현

* refactor: 기존 게시글 상세 조회 API를 V2로 마이그레이션

* feature: rilog, colog에 따른 응답 형식 변환을 Swagger 명세로 작성

* refactor: Controller 네이밍 & 어노테이션 순서 수정

* refactor: Colog 소속은 getColog를 사용하도록 변경

* refactor: 기존 PostDetailResponse
dV2를 PostDetailResponse로 네이밍 이전

* refactor: 도메인 용어를 affiliation에서 owner로 변경

* feature: 마지막 개행 추가

* feature: PostDetailResponse에 잘못된 블로그가 저장되지 않도록 방어하는 테스트 코드 추가

* refactor: jsonPath 수정

* [Feature] #156 팀 생성 페이지 로직 추가 (#160)

* feature: 팀 생성 구조 및 플로우를 팀 프로필 설정과 통일

* refactor: 코로그 생성 및 프로필 수정 공통 폼을 도메인 레이어로 분리

* chore: are로 시작하던 변수명을 is로 수정

* fix(CologCreateForm): 병합 충돌 과정에서 망가진 코드 복구

* fix(CologHomeHero): 테스트 용으로 남아있던 프로필 소개 repeat 제거

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>
Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Refactor] #172 affiliation에서 owner로 수정 (#173)

* [Feature] #161 모바일 반응형 대응 (#162)

* feature: 모바일용 하단 내비게이션바 추가

* design: 모바일 뷰에서도 게시글 상세 본문 텍스트를 16px로 통일

* design: 에디터 및 게시글 상세 list 요소 상하에 여백 추가

* feature: 모바일에서 발행 버튼을 하단으로 이동

* design: 푸터 모바일 반응형 추가

* refactor: 코로그 게시글에서도 PostFeedImage를 사용하도록 수정

* design: 코로그 홈 게시글 리스트 제목 폰트 사이즈 조정

* feature: 모바일용 date format 추가

* feature: 코로그 게시글 목록 닉네임에 truncate 추가

* design(CologPostList): 닉네임 우측 여백 제거

* design(Footer): 모바일 뷰에서 약관 제거

* feature: 모바일 뷰에서 하단 내비게이션바 대신 상단 헤더 사용

* design: 모바일 헤더 프로필에 border 추가

* fix: 사이드바 ui에서 로그아웃이 위로 옮겨짐 현상의 스파이 적출

* fix: footer 좌측에 여백이 중복으로 적용되던 문제 수정

* chore: format-published-date-mobile 파일을 기존 파일에 병합 및 모바일 여부를 인자로 받을 수 있도록 리팩토링

---------

Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Feature] #170 온보딩 폼 로직 연결 (#174)

* feature: 온보딩 폼 로직 추가

* chore(get-service-url-label): 네이밍 규칙에 맞지 않는 파일명 수정

* test(BlockNoteEditor): placeholder 관련 테스트 수정

* chore: navigate 라우터에 replace('/') 속성 추가

* feature: 온보딩 입력 유효성 검사 로직 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>
Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Refactor] #166 공개 블로그 게시글 목록 조회 제공 (#169)

* feature: 공개 블로그 게시글 목록 조회 제공

* fix: 공개 블로그 경로의 골뱅이 표기 복원

* fix: 공개 블로그 조회의 삭제 블로그 제외

공개 블로그 게시글 목록 조회에서 삭제된 블로그를 제외하도록 slug 조회 계약을 변경하고 공개 프로필 조회 진입점을 BlogController와 BlogService로 이동한다.

Tested: backend ./gradlew test

* refactor: 게시글 피드의 블로그 응답 이름 통일

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Fix] #171 코로그 설정 페이지 중첩 스크롤 문제 해결 (#175)

* feature: 코로그 프로필 설정 중첩 스크롤 제거

* refactor: 섹션이 page shell을 관리하도록 변경

* [Refactor] #167 라우트 경로 정리 (#178)

* refactor: App Router 페이지를 통일된 URL 구조로 재배치

* refactor: 내부 링크를 @slug 기반 라우트 계약으로 통일

* refactor: 코로그 설정 탭을 URL query와 동기화

* [Feature] #176 전체 피드 게시물 목록 조회 api 함수 구현 (#181)

* docs(frontend/AGENTS): api 아키텍처 관련 에이전트 지침 추가

* feature: 전체 피드 목록 조회 api 함수 구현

* config(next.config): mock 데이터 수용을 위해 remotePattern 전체 허용

* refactor: ssr prefetch에도 대응할 수 있도록 option/prefetch/query를 모아 관리하는 구조로 개편

* feature: 전체 피드 목록 조회 api 연동

* refactor: src/api 구조 개선

* chore: read-full-feed-posts.md task 파일 삭제

* chore: refactor-query-mutation task 파일 삭제

* refactor: 함수명은 축약하지 않은 상태로 복구

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* fix: 라우터 슬러그에 undefined 되던 버그 수정 (#185)

* [Refactor] #177 blogid를 slug로 통일 (#180)

* refactor: 멤버초대 검증 로직을 BlogMember 내부로 응집화

* refactor: cologId 대신 slug로 통일

* refactor: cologId 대신 slug로 멤버 초대 API 수정

* refactor: 게시글 발행 시 blogId 대신 slug를 사용하도록 통일

* refactor: BlogMember는 blogId로 조회하도록 개선

* refactor: 탈퇴된 Blog는 조회하지 않도록 JPA 쿼리 메서드에 반영

* [Feature]#186 게시글 상세 조회 api 구현 (#188)

* refactor: 피드 API 모듈을 shared 영역으로 이동

* feature: 게시글 상세 조회 API 연동

* refactor: 응답 필드명과 게시글 소유자 구조 통일 (#182)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #191 게시글 응답의 작성자 이름 필드명 통일 (#193)

* refactor: 게시글 응답의 작성자 이름 필드명 통일

* test: 전체 피드의 팀 소유자 응답 계약 보강

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Fix]  #189 피드 응답 필드명/소유자 구조 통일 반영 (#190)

* feature: 바뀐 백엔드 응답 형식에 맞게 반영

* fix: 블로그 상세 조회 API 타입 통일 및 author 필드명 호환성 처리

* [Feature] #187 공통 예외처리 로직 구현 (#194)

* chore: 에러 코드 상수화

* style: import문 정렬 수정

* chore: 서버 에러 응답 타입 정의

* feature: 서버 에러 정규화 로직 구현

* test: 테스트 내 401 에러 응답 공통 모듈로 분리

* feature: 블록노트 content 타입을 더 구체적으로 정의

* feature: 에러 정규화 로직을 가진 apiRequest/apiClient 구현 및 적용

* feature: 에러 정규화 로직을 가진 apiRequest/apiClient 구현 및 적용

* fix: 누락된 토큰 재발급 실패 이벤트 발행 로직 연결

* refactor: ky instance 생성 함수명 및 파일명 변경

* fix: requires auth 관련 로직 제거

* refactor: 오류 분류 세분화

* feature: Tanstack Query 전역 재시도 정책 설정

* feature: 폼 필드 에러 추출 함수 구현

* test: 요청 재시도 관련 테스트 추가

* refactor: 응답 필드명과 게시글 소유자 구조 통일 (#182)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* fix: kind/category 혼용되는 용어를 type/kind로 정리

* fix: 백엔드 Author 속성 코드 롤백

* fix: 백엔드 Author 속성 코드 롤백

---------

Co-authored-by: 진리로 <riro12@naver.com>

* [Refactor] #192 Blog Entity의 String slug를 Slug VO로 적용 (#195)

* refactor: Blog Entity의 String slug를 Slug VO로 적용

* refactor: Slug를 Blog 패키지로 이동한다.

* refactor: slug로 Blog 조회 이후는 id를 사용하도록 개선

* fix: Feed 조회 시, Slug VO도입으로 인한 JPQL 파싱 문제 해결 (#199)

* chore: backend-prod 라벨 추가 (#202)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #196 프론트엔드 모델 구조 리팩터링 (#203)

* chore: VSCode 작업 환경 설정 업데이트

* refactor: 도메인 계층 모델 구조 단일화 및 통합

* refactor: 코로그 관련 피처 model 및 lib 책임 분리

* refactor: 게시글 상세 피처 구조 개선 및 ID 매핑 수정

* refactor: 게시글 피드 피처 model 및 lib 책임 분리

* refactor: 게시글 작성 피처 model 및 lib 책임 분리

* refactor: 회원가입 피처 model 및 lib 책임 분리

* refactor: 게시글 피드 카드 및 관련 UI 컴포넌트를 post-feed 피처로 이전

* [Chore] #197 프론트엔드 배포 세팅 (#200)

* chore: pm2 스크립트 추가

* chore: CD 배포 파이프라인 구축 및 self-hosted 러너 연동

* chore: 워크플로우 수동 테스트 수단 추가

* chore: 워크플로우 수동 실행 시 배포 스크립트까지 실행되도록 수정

* chore: 임시로 PR 업데이트 시에도 배포 스크립트가 돌아가도록 설정

* chore: TARGET_DIR 경로 수정

* chore: NVM_DIR 경로 수정

* chore: node 설치 스크립트 추가

* chore: 환경변수 동적 할당 방식으로 변경

* chore: 환경변수를 절대경로로 변경

* chore: 전역 설치된 pnpm 및 pm2를 사용하도록 스크립트 수정

* fix: nvm 로드하는 코드 추가

* fix: nvm 파일 경로 확인되는지 디버깅

* fix: node와 pnpm 조합으로 변경

* fix: ssh 접속 환경과 동기화하는 코드 추가

* chore: NVM 경로를 환경변수 기반으로 변경

* chore: corepack 기반으로 pnpm 실행하도록 수정

* chore: 디버깅 코드 추가

* fix: nvm 자체 설치 로직 추가

* fix: pm2 자동 종료 정책 예외 처리

* chore: 초기 배포 스크립트로 복구

* chore: npm 경로 설정

* chore: env secret 이름 변경

* fix: 배포 환경 무한 재렌더 문제 해결

* chore: 요청 응답 공통 로깅 추가

* fix: 남아있는 배포 환경 무한 재렌더 문제 해결

* chore: 배포 스크립트를 프로덕션으로 전환

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #205 파일 업로드 api 구현 (#206)

* feat: 파일 업로드를 위한 Presigned URL API 및 클라이언트 구현

* refactor: Content-Type 방어 로직 추가 및 Presigned 네이밍 일관성 정렬

* refactor: S3 업로드 시 kyInstance 재활용 및 외부 URL 인증 토큰 주입 방어

* refactor: 토큰 만료 응답 판별 로직 캡슐화 및 타입 안정성 개선

---------

Co-authored-by: 송아영 <azerosong@gmail.com>

* [Feature] #207 getpublicprofile api 프론트엔드 연동 (#208)

* feature: 공개 블로그 프로필 조회 API 및 타입 정의

공개 블로그 프로필 정보를 조회하는 백엔드 엔드포인트(/v1/blogs/@{slug}) 호출 함수와 응답 인터페이스를 추가한다.

Tested: readBlogPublicProfile 단위 테스트 통과

* feature: 공개 블로그 프로필 React Query 훅 및 옵션 추가

공개 블로그 프로필 조회를 위한 query key, query options, useQuery 훅 및 prefetch 함수를 추가한다.

Tested: vitest 단위 테스트 및 타입 검사 통과

* feature: 블로그 홈 프로필 정보 API 연동

기존의 목 데이터를 제거하고 실제 getPublicProfile API를 호출하여 블로그 홈의 헤더 프로필 정보를 렌더링한다.
응답 데이터를 화면 컴포넌트 규격에 맞게 변환하는 매핑 유틸 함수를 추가한다.

Tested: mapCologProfileResponse 단위 테스트 통과

* [Feature] #204 서비스 통합테스트 유틸 ServiceSupport 추가 (#220)

* build: 테스트 DB h2 의존성 추가

* feature: 테스트 격리를 위한 DatabaseCleaner 추가

* feature: DatabaseCleanerConfiguration 설정 추가

* feature: 서비스 통합테스트 유틸 ServiceSupport 추가

* feature: application-test.yaml 추가

* chore: 사용하지 않는 주석 제거

* feature: Slug, Nickname 중복검사 서비스 통합테스트 작성

* refactor: 개행 두번을 하나로 삭제

* refactor: 잘못된 서비스 호출 오류 수정

* [Feature] #210 로그아웃 API 제공 (#216)

* feature: 로그아웃 API 제공

* refactor: Refresh Token 쿠키 주입 방식 정리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: @LoingUserId, @LoginUserSulg 어노테이션 스웨거 무시 설정 추가 (#222)

* [Feature] #217 내 블로그 목록 조회 api 연동 (#223)

* feature: 내 블로그 목록 요약 조회 api 함수 구현

* test: 테스트용 QueryClient 구현

* feature: 사이드바 팀 내비게이션에 내 팀 목록 요약 조회 api 연동

* [Feature] #225 토큰 기반 유저정보 조회 API 추가 (#228)

* refactor: 패키지 유지 용도의 .gitkeep 삭제

* feature: 유저 정보 조회 비즈니스 로직 추가 (by UserId)

* feature: 토큰 기반 유저 정보 조회 API 추가

* refactor: 닉네임, 슬러그 중복 검사 코드 위치 수정

* test: 유저 정보 조회 서비스통합테스트 코드 추가

* feature: 누락된 UserApiSpec 추가

* [Build] #231 deploy job 셀프호스트 라벨 추가 (#232)

* [Feature] #227 GitHub OAuth 프론트 콜백 흐름 제공 (#229)

* feature: GitHub OAuth 프론트 콜백 흐름 제공

* feature: 내부 경로 검증 추가

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #211 코로그 홈 게시글 피드 조회 api 연동 (#226)

* feature: 공개 블로그 게시글 목록 조회 API 및 쿼리 구현

* feature: 코로그 홈 게시글 목록 API 연동 및 무한 스크롤 적용

* [Refactor] #211 colog-home 위젯 내부 UI를 features 계층으로 분리

- colog-home 위젯의 CologHomeHero, CologPostList를 위젯의 Public UI(조합 레이어)로 격상
- 기존 colog-home/ui에 혼재되어 있던 기능별 표현 로직을 features 하위(colog-profile, colog-members, colog-post-feed)로 추출
- CologPostList에 스켈레톤 UI(CologPostFeedSkeleton) 적용 및 관련 훅 이동
- page.tsx 내의 불필요한 데이터 fetch 및 매퍼 로직을 제거하고 각 위젯/기능이 스스로 데이터를 책임지도록 개선

* [Feature] #219 멤버 추가 시 유저 정보 조회 api 연동 (#230)

* feature: 슬러그 기반 유저 정보 조회 api 함수 구현

* feature: 멤버 초대 모달 유저 정보 조회 api 함수 연동

* refactor: 멤버 초대 시 유저 조회 로직을 mutation으로 리팩터링

* [Feature] #224 토큰 기반 유저 정보 조회 api 연동 (#234)

* style: 불필요한 공백 제거

* feature: 토큰 기반 유저 정보 조회 api 함수 구현

* feature: 유저 관련 쿼리에 인가 쿼리 키 추가

* feature: 마스터토큰 기반 임시 token provider 구현

* feature: 전역 로그인 상태를 context로 관리

* feature: 전역 인가 상태를 기반으로 분기 로직 수정

* feature: 로그아웃/토큰 만료 시 인증 상태 초기화 로직 추가

* feature: 토큰이 없는 경우 토큰 기반 api가 호출되지 않도록 방어

* feature: map 변환 함수 추가

* [Feature] #213 팀 블로그 생성 api 연동 (#235)

* refactor(colog): 이메일 필드 완전 제거 및 잔재 정리

* [Feature] #213 팀 블로그 생성 API 및 타입 추가

* [Feature] #213 팀 블로그 생성 useMutation 훅 추가

* [Feature] #213 팀 블로그 생성 폼 실제 API 연동 및 모의 데이터 제거

* [Test] #213 팀 블로그 생성 폼 연동 테스트 업데이트

* [Hotfix] #236 멤버 모의 데이터 누락 복구 (#237)

* [Feature] #209 깃허브 소셜 로그인 구현 (#238)

* feature: 깃허브 소셜 로그인 구현

* refactor: auth api 경로를 shared 하위로 이동

* feature: 소셜 로그인 뒤 헤더로부터 토큰을 추출하는 로직 추가

* [Feature] #240 환경변수 추가 설정 (#243)

* refactor: RefreshToken SameSite Option 환경변수로 분리

* feature: AWS_S3_DIRECTORY application.yaml에 환경변수 추가

* [Featur…
Wlsflfh added a commit that referenced this pull request Aug 21, 2026
* chore: 저장소 공통 제외 규칙 설정 (#6)

* docs: 프로젝트 하네스 기본 기준 정리 (#8)

* chore: 파트별 변경의 리뷰 요청 자동화 (#12)

* [Chore] #9 프론트엔드 초기 세팅 (#10)

* chore: 프론트엔드 공통 실행·검증 환경 구성

* docs: 프론트엔드 개발 및 협업 기준 문서화

* chore: 미사용 코드와 빈 줄 검사 강화

* docs: 작업 범위별 브랜치 명명 기준 통일 (#17)

* [Chore] #14 프론트엔드 디자인 토큰 구성 (#18)

* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검

* [Chore] #15 ky config/client 설정 (#23)

* chore: config 폴더 제거

* chore: api client 테스트를 위한 의존성 설치

* feature: 토큰 재발급 로직을 포함하는 api client 모듈 구현

* feature: 토큰 재발급 실패 시 유저 데이터 초기화를 위한 구독발행 모델 구축

* style: import 순서 정렬

* chore: vitest config 내 alias 대상 상대경로 수정

* refactor: 토큰 재발급 실패 시 초기화 필요한 쿼리의 키를 그루핑

* feature: 토큰 재발급 실패 시 쿼리 초기화를 트리거하는 훅 컴포넌트 구현

* feature: QueryProvider 구현 및 적용

* chore(apiClient): tokenProvider 관련 TODO 추가

* chore(playwright.config): 대상 디렉터리 경로 수정

* chore: .env.example 파일 추가

* docs: 작업 범위별 브랜치 명명 기준 통일 (#17)

* [Chore] #14 프론트엔드 디자인 토큰 구성 (#18)

* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검

* chore(createApiClient): 토큰 재발급 분기 처리 관련 TODO 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #20 공용 버튼 컴포넌트 추가 (#21)

* feature: 서비스 전역 버튼 인터페이스 통일

* refactor: Button 타입과 크기별 스타일을 정리

Button에서만 사용하는 props 타입을 컴포넌트 파일로 옮기고 public entry의 타입 export를 제거했다.
버튼 크기별 모서리 반경도 sm/md와 lg의 위계를 드러내도록 조정했다.

Constraint: Button 타입의 외부 소비처가 없음
Rejected: 별도 타입 파일 유지 | 단일 소비처를 위한 파일 경계가 불필요함
Confidence: high
Scope-risk: narrow
Directive: 외부 타입 소비처가 생기면 필요한 타입만 public entry로 다시 공개할 것
Tested: pnpm check (format, lint, typecheck, component tests, build)
Not-tested: E2E 브라우저 흐름

* refactor: Button 전용 토큰의 소유 위치 정리

Button만 소비하는 시맨틱 토큰을 컴포넌트 폴더로 이동하고, 전역 스타일 진입점에서 등록하도록 import 경로를 분리했다.

Constraint: Tailwind 유틸리티 생성을 위해 @theme 토큰은 전역 CSS에서 import되어야 함
Rejected: foundations 토큰 폴더 유지 | Button 컴포넌트와 토큰의 소유 관계가 분산됨
Confidence: high
Scope-risk: narrow
Directive: 다른 공용 컴포넌트 전용 토큰도 소비처가 하나면 해당 컴포넌트와 함께 관리할 것
Tested: pnpm check (format, lint, typecheck, component tests, build)
Not-tested: E2E 브라우저 흐름

* [Chore] #19 전역예외처리핸들러 초기세팅 (#24)

* chore: domain 패키지 구조 유지 (#19)

* feat: InvalidParam 추가 (#19)

- 유효하지 않은 Param을 전달하기 위함.

* feat: ErrorDetail 추가 (#19)

* feat: RilogBusinessException 추가 (#19)

- 어플리케이션 최상위 커스텀 예외

* feat: ErrorInformation 추가 (#19)

- 커스텀 예외 생성자 시그니처를 Interface로 단축

* feat: GlobalExceptionInformation 추가 (#19)

* feat: GlobalExceptionHandler 추가 (#19)

- 전역 예외처리 핸들러로 한 곳에서 예외처리 관리

* docs: exception-handling.md 추가 (#19)

- 비즈니스 예외를 일관된 API 오류 응답으로 변환하는 방법을 설명

* refactor: 메서드 네이밍 수정 (#19)

* refactor: 자바 기본 예외는 초기세팅에 포함하지 않음. (#19)

* refactor: 클래스 선언 직후, 괄호 닫기 전 개행 추가 (#19)

* [Chore] #27 BaseEntity 초기세팅 (#28)

* build: Spring Data Jpa 라이브러리 추가 (#27)

* feat: BaseEntity 추가 (#27)

* feat: JpaAuditingConfig 추가 (#27)

- JpaAuditing 설정 허용

* feat: Spring Data 관련 예외처리 등록 (#27)

* docs: BaseEntity 사용 가이드.md 추가  (#27)

* chore: 프론트엔드 타입과 모듈 경계 규칙 통일 (#29)

객체 계약은 interface를 기본으로 사용하고 모듈 경계 import만 절대 경로를 사용하도록 기존 코드와 하네스를 함께 정리한다.

Constraint: 같은 모듈 내부 상대 경로는 허용
Rejected: 모듈별 barrel 유지 | 현재 공개 API 규모 대비 관리 비용과 runtime 혼합 위험이 큼
Directive: barrel 재도입은 명시적인 public API 필요가 확인된 뒤 별도 이슈 또는 ADR로 결정
Tested: Node 24.19.0에서 pnpm check 및 Playwright E2E 통과

* [Feature] #31 로그인 사용자 식별자 초기 구현 (#32)

* feat: @LoginUserId 추가 (#31)

* feat: @LoginUserSlug 추가 (#31)

* feat: 임시 LoginUserIdArgumentResolver 추가 (#31)

- 작업 병목을 막기 위한 임시 ArgumentResolver

* feat: 임시 LoginUserSlugArgumentResolver 추가 (#31)

- 작업 병목을 막기 위한 임시 ArgumentResolver

* [Feature] #30 users 테이블 구현 (#33)

* chore: service, repository 패키지 구조 추가

* refactor: HealthController 패키지 위치 변경

* refactor: HealthController 패키지 구조 변경에 의한 수정

* feature: User 테이블 구현

* feature: OnboardingStatus 구현

* test: UserTest 구현

* refactor: Onboarding 입력 값 추가

* test: Onboarding 입력 값 추가에 의한 테스트 케이스 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #34 1차 MVP Entity 초기 구현 (#39)

* refactor: 잘못된 패키지 구조 형식 제거 (#34)

* feature: test 패키지 gitignore 추가 (#34)

* refactor: User 패키지로 이동 (#34)

* refactor: HealthCheckController 패키지 이동 (#34)

* feature: user entity에 UNIQUE 제약 추가 (#34)

* feature: blog entity 추가 (#34)

* feature: post entity 추가 (#34)

* feature: BlogMember entity 추가 (#34)

* feature: local.env gitignore 추가 (#34)

* refactor: BlogMember Entity 잘못된 @table name 속성 수정  (#34)

* feature: application profile별 분리  (#34)

* refactor: author를 user로 변경 (#34)

* [Feature] #42 Swagger 추가 (#44)

* build: swagger 의존성 추가 (#42)

* build: dev, local 환경에 swagger 접속 허용 (#42)

* feature: OpenApiConfig 추가 (#42)

* [Feature] #47 예외 응답 형식 변경 (#48)

* refactor: GlobalExceptionInformation getErrorCode 응답 형식 변경

* docs: 예외 Enum 사용 방식 변경으로 docs 반영

* [Feature] #49 GitHub oauth 로그인 요청 및 callback 구현 (#56)

* refactor: 인증 보조 타입의 도메인 패키지 이동

* refactor: 인증 보조 타입의 패키지 선언 정리

* feature: GitHub OAuth 로그인 요청과 callback 검증 추가

* fix: 온보딩 slug 최초 저장과 재변경 방지

* docs: 아키텍쳐 구조 설명 추가

* fix: 파라미터 버그 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #45 게시글 발행 기능 구현 (#59)

* feature: Blog Entity에 owner 추가

* feature: Post Builder 패턴 적용

* refactor: 잘못 사용된 어노테이션 수정

- LoginUserId -> LoginUserSlug

* refactor: BlogType을 도메인 용어로 수정 COLOG, RILOG

* feat: Colog인지 확인하는 도메인 로직 추가

* feat: Blog 도메인 예외 추가

* Merge branch 'develop' of https://github.com/woowacourse-teams/2026-rilog into be/feature/#45-게시글-발행-기능-구현

# Conflicts:
#	backend/src/main/java/kr/rilog/domain/auth/resolver/LoginUserSlugArgumentResolver.java

* feat: 사용자를 찾을 수 없는 예외 에러 코드 추가

* feat: UserRepository 추가

* feat: BlogRepository 추가

- 개인사용자의 블로그를 조회하는 메서드 추가

* refactor: default 생성자 문제 해결 @Autowired 적용

* feat: PostRepository 추가

* feat: PostPublishRequest 추가

* feat: PostPublishResponse 추가

* feat: PostDetail 추가

* feat: PostSaveCommand 추가

* feat: PostPublishResult 추가

* refactor: default 생성자 문제 해결

* feat: PostService 추가 및 게시글 작성 구현

- 이미지 처리는 다음 이슈에 구현

* feat: PostController 추가 및 게시글 작성 API 구현

- 이미지 처리는 다음 이슈에 구현

* feat: NoResourceException 전역 예외 처리 추가

* feat: Post 게시글 작성 단위 테스트 추가

* refactor: .gradle-codex gitignore에 추가

* refactor: NoResourceFoundException 발생 시 잘못된 예외 코드 수정

* feature: Blog 소유자인지 판단하는 도메인 로직 추가

* feature: 게시글 작성 시, 다른 개인 블로그에 글을 작성할 수 있는 엣지케이스 제거 및 테스트 코드 작성

* [Feature] #57 GitHub access token 교환 및 사용자 정보 조회 구현 (#58)

* fix: GitHub 로그인 시작 생성자 주입 대상 명확화

* feature: GitHub Access Token 교환과 사용자 조회 추가

* refactor: 소셜 로그인 provider 경계 분리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #60 GitHub 로그인 사용자 생성과 온보딩 대기 처리 (#61)

* feature: GitHub 로그인 사용자 생성과 온보딩 대기 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

* refactor: OAuth 로그인 사용자 조회 흐름과 테스트 정리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

* fix: 생성자 충돌로 인한 정적 팩토리 메서드로 변경

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #62 전체 게시글 수 조회 API 구현 (#63)

* feature: 전체 게시글 수 조회 메서드 추가

* feature: TotalPostsCountResponse 추가

* feature: 전체 게시글 수 API 구현

* [Feature] #64 특정 게시글 상세 조회 API 구현 (#66)

* feat: hibernate Jackson 버전을 Spring Boot 4.0.x의 기본 Jackson 버전으로 명시

* feat: Post와 Author Fetch Join 메서드 추가

* feat: Post 도메인 예외 추가

* feat: 비공개 게시글 읽기 검증 로직 추가

* feat: 게시글 상세 조회 ResponseDto 추가

* feat: 게시글 상세 조회 비즈니스 로직 추가

* feat: 게시글 상세 조회 API 추가

* refactor: 잘못된 import 경로 수정

* refactor: 메서드명 readPosts에서 readPost로 변경

* refactor: Post에서 사용하지 않는 logoUrl 삭제

* fix: 메서드 시그니처 수정 누락 반영 (#71)

- logoUrl 메서드 시그니처 삭제

* feature: 자체 Access Token 발급과 검증 구현 (#67)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #68 Bearer 인증 인터셉터 구현 (#74)

* feature: Bearer 인증 인터셉터 구현

* refactor: 인증 선언과 사용자 주입 책임 분리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 역할 기반 인가 처리 구현 (#77)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feataure: 공용 텍스트 인풋 컴포넌트 구현 (#38)

* chore: placeholder 컬러 토큰 추가

* feature: 인풋 text 컴포넌트 구현

* chore: 범용 spacing 토큰 추가

* feature(Input): 아이콘/주소 prefix 등을 위해 인풋 좌측 슬롯 구현

* feature: 텍스트 영역 컴포넌트 구현

* style: css prettier 포맷 통일

* feature: left 컴포넌트를 클릭해도 input에 focus 되는 기능 추가

* feature(Textarea): 포커스 시 아웃라인 색상 지정

* test(Textarea): uncontrolled 방식의 테스트 제거

* [Feature] #72 전체 피드 게시글 목록 조회 (#79)

* feature: 전체 피드 게시글 목록 조회 메서드 구현

- 데이터 양이 많은 content 생략을 위해 Projection 사용.
- 정렬순은 하드코딩, 추후 확장성 고민해야함.

* feature: 전체피드 게시글 목록 Response 추가

- Inner Record를 사용

* feature: 전체피드 게시글 목록 조회 비즈니스 로직 추가

* feature: 전체피드 게시글 목록 조회 API 추가

* feature: 전체피드 게시글 목록 조회 API 추가

* feature: 전체피드 게시글 목록 조회 API Swagger 명세 추가

* feature: FeedService 단위 테스트 추가

* feature: 요청에 필요한 파라미터 누락 예외 상세하게 처리

* refactor: 잘못된 import 경로 수정

* [Refactor] #80 공통 응답 형식 적용 (#82)

* refactor: 공통 응답 ApiResponse 적용

- 소셜 로그인 컨트롤러는 미적용

* feature: ApiResponse 응답 적용

* refactor: 공통 응답 ApiResponse 적용

- 소셜 로그인 컨트롤러는 미적용

* feat: .gradle-user-home/ .gitignore 추가

* feature: 자체 로그인 토큰 흐름 제공 (#85)

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #84 Colog 피드에서 게시글 목록 조회 (#87)

* refactor: 전체피드 게시글 목록 조회 API에 ApiResponse 적용

* feature: 팀 피드 전체 게시글 목록 조회 메서드 추가

* feature: 팀 전체 피드 게시글 목록 응답 Dto 추가

* feature: 블로그 조회 메서드 추가

* refactor: 사용하지 않는 code 필드 제거 - ApiResponse

* feat: 팀피드 게시글 목록 조회 API 추가

* feat: 팀피드 게시글 목록 조회 비즈니스 로직 추가

* refactor: 전체 피드 게시글 목록 조회 비즈니스 로직 메서드명 수정

- 읽는다는 행위가 잘 드러나도록 read로 수정

* feature: 팀피드 게시글 조회 서비스 단위테스트코드 추가

* [Feature] #83 Refresh Token 재발급과 Rotation 처리 (#86)

* feature: Refresh Token 재발급과 Rotation 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

* [Feature] #84 Colog 피드에서 게시글 목록 조회 (#87)

* refactor: 전체피드 게시글 목록 조회 API에 ApiResponse 적용

* feature: 팀 피드 전체 게시글 목록 조회 메서드 추가

* feature: 팀 전체 피드 게시글 목록 응답 Dto 추가

* feature: 블로그 조회 메서드 추가

* refactor: 사용하지 않는 code 필드 제거 - ApiResponse

* feat: 팀피드 게시글 목록 조회 API 추가

* feat: 팀피드 게시글 목록 조회 비즈니스 로직 추가

* refactor: 전체 피드 게시글 목록 조회 비즈니스 로직 메서드명 수정

- 읽는다는 행위가 잘 드러나도록 read로 수정

* feature: 팀피드 게시글 조회 서비스 단위테스트코드 추가

* feature: Refresh Token 재발급과 Rotation 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>
Co-authored-by: koreaioi <koreaioi@gachon.ac.kr>

* feature: 로고이미지, 깃허브주소, 이메일 필드 추가 (#91)

* feature: #22 공용 모달 컴포넌트 구현 (#35)

* feature: 공용 모달의 접근성과 표시 동작 기반 마련

* feature: 단일 확인 동작을 제공하는 알림 모달 구성

* feature: 위험도와 처리 상태를 반영하는 확인 모달 구성

* feature: 다양한 콘텐츠 구성을 수용하는 범용 모달 제공

* chore: 프론트엔드 pnpm workspace 패키지 범위 명시

* refactor: 모달 Props 계약의 컴포넌트별 소유권 정리

* design: 모달 모서리 곡률을 서비스 스타일에 맞게 조정

* design: 모달 닫기 버튼의 클릭 영역과 배치 조정

* design: 모달 기본 액션 버튼의 높이와 최소 너비 통일

* fix: 모달 표시 중 배경 페이지 스크롤 차단

* design: 모달 백드랍 색상을 중립적인 톤으로 조정

* fix: 모달 pending 중 모든 액션과 종료 동작 차단

* refactor: 모달 처리 상태 계약 통일

* design: 버튼 포커스 링 여백 제거

* design: 버튼 포커스 표현을 아웃라인으로 통일

* feature: #36 공용 파일 인풋 컴포넌트 구현 (#75)

* feature: 파일 업로더 컴포넌트 구현

* feature: 이미지 업로더 컴포넌트 구현

* refactor(FileUploader): 불필요한 props 제거

* feat: change 핸들러 인터페이스 추가

* fix: 파일 업로더에 키보드 접근이 가능하도록 수정

* feature: 이미지 파일 검증 로직 추가

* [Feature] #89 팀 생성 로직 구현 (#95)

* feature: 팀 블로그 생성 도메인 모델 추가

* feature: 팀 블로그 생성 서비스 구현

* feature: 팀 블로그 생성 API 제공

* feature: 팀 블로그 URL 정보 생성 요청 반영

* refactor: @requiredargsconstructor 사용하도록 변경

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #88 나의 팀 목록 요약 API (#96)

* feature: 나의 팀 리스트 조회 메서드 추가

* feature: MyCologResponse 추가

* feature: 나의 팀 목록 조회 비즈니스 로직 추가

* feature: 나의 팀 목록 조회 API 추가

* feature: 나의 팀 목록 조회 단위테스트 추가

* feature: BlogController에 ApiSpec 명세 적용

* hofix: 생성자 중복 삭제 (#101)

* [Feature] 팀 멤버 초대 API 구현 (#98)

* feature: 팀 멤버 초대 API 구현

* fix: CologService 오류 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* fix: Clock 필드 주입 삭제 (#104)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 멤버 초대용 유저 정보 조회 제공 (#106)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #103 사용자 닉네임 슬러그 유효성 검사 구현 (#109)

* feat: 닉네임, 슬러그로 조회 메서드 추가

* feat: 닉네임, 슬러그 중복 예외 추가

* feat: 닉네임, 슬러그 중복검사 비즈니스 로직 추가

* feat: 닉네임, 슬러그 중복검사 API 구현

* feat: 닉네임, 슬러그 중복검사 테스트 코드 작성

* feature: 팀 상세 조회 API 구현 (#111)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 팀 프로필 조회 API 구현 (#113)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #110 colog 전체 멤버 목록 API 구현 (#114)

* feat: 팀목록 조회 메서드 추가

* feat: 팀목록 조회 비즈니스 로직 추가

* feat: 팀목록 멤버 조회 API 추가

* feat: 팀목록 멤버 조회 테스트 코드 추가

* feature: 온보딩 완료 후 정식 인증 세션 발급 (#116)

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #117 글 작성 및 조회 권한 처리 구현 (#118)

* feature: 게시글 상세 조회 선택 인증 지원

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

* feature: 게시글 작성과 비공개 조회 권한 검증

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #99 S3 PresignedUrl 발급 (#119)

* build: aws sdk s3 의존성 추가

* refactor: 예외 응답 고도화

* refactor: Upload 도메인 예외 추가

* refactor: Upload 도메인 enum 추가

* feat: PresignedUrl 관련 Dto 추가

* feat: S3 관련 환경변수 추가

* feat: S3Config 추가

* feat: S3Properties 추가

* feat: PresignedUrl 발급 비즈니스 로직 추가

* feat: PresignedUrl 발급 API 추가

* refactor: Dockerfile 캐싱 적용

* feat: 등록 가능 contentType, type 예시 추가

* [Build] #123 개발서버 CI-CD 파이프라인 구축 (#124)

* build: 개발서버 CI-CD 파이프라인 구축

* build: 잘못된 Dockerfile 명시 수정

* refactor: Push 에서 deploy job이 동작하도록 수정

* feature: 프론트 연동을 위한 CORS 설정 추가 (#125)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #127 크로스 플랫폼 설정과 GHA 캐싱 적용 (#128)

* refactor: 크로스 플랫폼 설정과 gha 캐싱 적용

* refactor: 잘못된 Dockerfile 이름 수정

* refactor: GitActions Runner 환경 ARM64 네이티브 러너 적용

* feature: 전달헤더 설정 추가 (#132)

- Swagger에서 API 요청 시 발생하는 CORS 문제 해결을 위함

* [Refactor] #129 로그인 이후 개인 블로그 생성 흐름 복구 (#130)

* fix: 로그인 이후 개인 블로그 생성 흐름 복구

* refactor: 온보딩 완료 책임의 서비스 의존 제거

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: #92 사이드바 구현 (#108)

* feature(Button): fullWidth 추가

* chore: navy 스케일 컬러 토큰 추가

* feature: 사이드바 컴포넌트 구현

* feature: 사이드바 접힘/열림 인터랙션 구현

* feature: 사이드바 관련 페이지 레이아웃 세팅

* feature: Button 스타일의 Link 컴포넌트를 ButtonLink로 분리

* feature: user/colog 공통 아바타 컴포넌트 구현

* feature: 사이드바 내비게이션 버튼 컴포넌트 구현

* feature: 사이드바 푸터 컴포넌트 구현

* feature: 사이드바 헤더 컴포넌트 구현

* refactor: 사이드바 컴포넌트 재구성

* test: 라우트 기반 로그아웃 동작을 버튼 기반으로 변경

* fix(Sidebar): 인가 여부 기본값 제거

* refactor(with-sidebar-layout): 메인 영역에 시맨틱 태그 사용

* feature: 공용 Divider 컴포넌트 구현

* feature: 사이드바에 Divider 추가

* fix(Sidebar): 인가 기본값 제거

* refactor(SidebarLayout): main 태그 제거

* test: 하드코딩된 UI 값 제거

* [Feature] #40 블로그 글 작성 페이지 UI 구현 (#126)

* build: BlockNote 패키지 버전 고정

* build: Pretendard 로컬 폰트 기반 제공

* design: BlockNote 스타일의 Rilog 토큰 연결

* feature: 글 작성 에디터 공개 계약 제공

* feature: 한국어 BlockNote 편집기 제공

* feature: 에디터 로드 실패 복구 상태 제공

* feature: BlockNote 브라우저 전용 로딩 경계 제공

* feature: 게시글 문서 유효성 판별

* feature: 자동 확장 제목 입력 흐름 제공

* feature: 본문 오류와 에디터 접근성 연결

* feature: 본문 이미지 로컬 업로더 제공

* feature: 글 작성 페이지의 기본 편집 흐름 제공

* feature: 글 작성 발행 진입 액션 제공

* feature: 저장되지 않은 글의 이탈 보호 제공

* feature: 게시 설정 도메인 계약과 선택 항목 제공

* feature: 대표 이미지 우선순위와 기본 미리보기 제공

* design: 파일 선택 컨트롤의 포커스 표현 통일

* feature: 접근 가능한 게시 설정 모달 제공

* feature: 게시 설정 유지와 발행 전 검증 제공

* feature: 교체 가능한 mock 발행 계약과 상세 경로 제공

* feature: 발행 상태 전이와 성공 후 이동 제공

* design: 게시 설정 모달의 경계와 포커스 표현 정돈

대표 이미지와 게시 설정 영역을 동일 비율로 배치하고 여백을 넓혀 정보 밀도를 조정한다. 모달 가장자리의 컨트롤은 focus outline을 내부에 표시해 잘림 없이 일관된 키보드 탐색 피드백을 제공한다.

Rejected: 공용 Button의 전역 outline offset 변경 | 모달 밖 버튼의 기존 시각 계약까지 바뀜
Confidence: high
Scope-risk: moderate
Directive: 모달 가장자리의 기본 컨트롤은 내부 focus outline 계약을 유지할 것
Tested: ESLint, TypeScript typecheck, component tests 86개, 키보드 focus 브라우저 확인, git diff check

* fix: 한글 조합 중 제목 Enter 이동 방지

IME 조합 중 발생한 Enter 이벤트를 본문 이동으로 처리하지 않도록
composition 상태를 확인한다.

Confidence: high
Scope-risk: narrow
Tested: PostTitleField component tests

* fix: 확정된 이탈 이동의 history 경쟁 제거

guard entry 제거와 실제 이동을 동기적으로 처리해 history.back과
fallback timer 사이의 중복 이동 가능성을 제거한다.

Rejected: popstate와 fallback timer 유지 | 이동 시점에 따라 두 경로가 경쟁할 수 있음
Confidence: high
Scope-risk: moderate
Tested: PostWriteWorkspace component tests

* fix: 유효한 상세 경로 확인 후 발행 상태 정리

발행 결과의 상세 경로를 먼저 검증해 잘못된 postId가 반환되더라도
작성 상태와 이탈 보호가 유지되도록 한다.

Rejected: 상태 정리 후 경로 생성 | 경로 생성 실패 시 작성 상태를 복구할 수 없음
Confidence: high
Scope-risk: narrow
Tested: PostWriteWorkspace component tests

* fix: BlockNote 표 셀 본문 유효성 판별

일반 content뿐 아니라 tableContent의 rows와 cells를 재귀 탐색해
표 안에 작성된 텍스트도 유효한 본문으로 인정한다.

Confidence: high
Scope-risk: narrow
Tested: post-write validation unit tests

* design: BlockNote 키보드 포커스와 블록 선택 표시 복원

BlockNote의 투명한 ring 값을 공용 focus token에 연결하고 선택된
콘텐츠에 outline을 제공해 현재 조작 대상을 식별할 수 있게 한다.

Constraint: 제목 입력은 기존 무경계 표현 유지
Rejected: box-shadow ring 추가 | 기존 outline 포커스 계약과 시각 효과가 중복됨
Confidence: high
Scope-risk: narrow
Tested: CSS formatting, production build, TypeScript

* fix: 실제 발행 제목과 길이 검증 기준 통일

제목의 앞뒤 공백을 제거한 값을 빈 값과 최대 길이 검증에 함께
사용해 실제 발행되는 제목과 검증 기준을 일치시킨다.

Confidence: high
Scope-risk: narrow
Tested: post-write validation unit tests

* design: 대표 이미지 선택 후 제어 영역 정렬

좁은 모달 열 안에서 이미지 변경과 제거 제어가 줄바꿈되지 않도록
설명과 버튼 행을 분리하고 선택 상태의 버튼 규격을 통일한다.

Rejected: viewport breakpoint 기반 flex 유지 | 실제 열 너비와 무관하게 가로 배치가 활성화됨
Confidence: high
Scope-risk: narrow
Tested: component tests, ESLint, TypeScript, production build, browser visual verification

* feat: 본문 placeholder에 마크다운 단축 문법 안내 제공

* [Feature] #93 로그인 모달 구현 (#137)

* design(Modal): 모달 내 개행 허용 및 레이아웃 조정

* feature: 로그인 모달 구현

* feature: 사이드바 로그인 버튼에 로그인 모달 연결

* feature: 로그인 모달을 전역으로 관리할 수 있도록 Context 구현

* feature: 로그인 상태에 따라 로그인 모달과 기존 액션을 분기하는 공통 훅 구현

* refactor(GuestSidebarFooter): 공통 로그인 모달 로직 적용

* [Feature] #94 온보딩 페이지 구현 (#136)

* chore: 브레이크포인트 토큰 추가

* feature: aside 기반 레이아웃 컴포넌트 구현

* feature: 프로필/커버 이미지 프리뷰 컴포넌트 구현

* feature: 공용 단일 인풋 field 컴포넌트 구현

* feature: 회원가입 폼 구현

* feature: 회원가입 페이지 구현

* design(FileUploader): ring을 outline으로 변경

* refactor: auth 하위 features를 auth/ui로 이동

* refactor: signup을 auth에서 분리

* feature: 공용 체크박스 컴포넌트 구현

* feature: 온보딩 폼에 약관 동의 추가

* fix: 온보딩 컴포넌트 import 경로 수정

* design: 존재하는 aside 영역만 표시하도록 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #140 팀 설정 멤버관리 페이지 구현 (#142)

* feature: 코로그 멤버 모조 데이터 추가

* feature: 코로그 설정 탭 구현

* feature: 코로그 멤버 관리 멤버 행 구현

* feature: 멤버 관리 섹션 구현

* feature: 코로그 설정 내 탭 조합

* feature: 코로그 설정 페이지(멤버 관리) 구현

* design(MemberManagementSection): 우상단 버튼 간격 조정

* [Feature] #93 로그인 모달 구현 (#137)

* design(Modal): 모달 내 개행 허용 및 레이아웃 조정

* feature: 로그인 모달 구현

* feature: 사이드바 로그인 버튼에 로그인 모달 연결

* feature: 로그인 모달을 전역으로 관리할 수 있도록 Context 구현

* feature: 로그인 상태에 따라 로그인 모달과 기존 액션을 분기하는 공통 훅 구현

* refactor(GuestSidebarFooter): 공통 로그인 모달 로직 적용

* [Feature] #94 온보딩 페이지 구현 (#136)

* chore: 브레이크포인트 토큰 추가

* feature: aside 기반 레이아웃 컴포넌트 구현

* feature: 프로필/커버 이미지 프리뷰 컴포넌트 구현

* feature: 공용 단일 인풋 field 컴포넌트 구현

* feature: 회원가입 폼 구현

* feature: 회원가입 페이지 구현

* design(FileUploader): ring을 outline으로 변경

* refactor: auth 하위 features를 auth/ui로 이동

* refactor: signup을 auth에서 분리

* feature: 공용 체크박스 컴포넌트 구현

* feature: 온보딩 폼에 약관 동의 추가

* fix: 온보딩 컴포넌트 import 경로 수정

* design: 존재하는 aside 영역만 표시하도록 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* fix: 아바타가 이미지 소스를 받을 수 있도록 수정

* feature: 멤버 초대 모조 데이터 추가

* feature: 멤버 초대 모달 내 멤버 행 컴포넌트 구현

* feature: 멤버 초대 모달 구현

* feature: 멤버 초대 모달 연결

* design: 멤버 초대 모달 내 스크롤 영역 조정

* refactor: 저장되지 않은 변경 가드 로직을 공통으로 분리

* feature: 멤버 수정 중 페이지 이탈 시 확인 모달 연결

* refactor: 코로그 설정 내 모든 저장되지 않은 변경을 일괄 처리할 수 있도록 개선

* fix(RootLayout): 사용자 정보 캐시 초기화 구독 컴포넌트 import 위치 수정

* feature: 코로그 설정 페이지에 셸 레이아웃 적용

* design: 멤버 목록 표 bg 및 border 설정 변경

* test: 누락된 코로그 설정 페이지 테스트 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #146 팀 생성 페이지 구현 (#147)

* fix: left 요소가 없을 때에도 gap이 적용되는 문제 해결

* chore: 팀 커버 이미지 플레이스홀더 에셋 추가

* feature: 팀 생성 폼 구현

* feature: 팀 생성 페이지 구현

* style: 불필요한 공백 제거

* feature: 팀 생성 버튼을 링크로 변경

* test: 팀 생성 페이지 통합 테스트 추가

* fix: 팀 생성 페이지에서 취소 시 이전 페이지로 리다이렉트하도록 변경

* chore: tailwind 속성 오타 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #81 피드 페이지 UI와 무한 스크롤 구현 (#143)

* feature: 피드 게시글 표시 모델과 날짜 포맷터 정의

* feature: 피드 카드와 이미지 fallback UI 구현

* feature: 목 데이터 기반 피드 페이지 조회 상태 구성

* feature: 피드 무한 스크롤과 요청 상태 UI 구현

* feature: 피드 위젯을 조립해 feeds 페이지 구현

* feature: 루트 진입 경로를 피드로 연결

* feature: 피드 진입 시 콘텐츠로 자연스럽게 이동

* refactor: 피드 Colog 식별자 명명 통일

* refactor: 피드 작성자 프로필 표현을 UserAvatar로 통일

* [Chore] #120 SVGR 기반 아이콘 사용 환경 설정 (#149)

* build: SVG 아이콘의 컴포넌트 사용 환경 제공

Next.js의 Turbopack과 Webpack, Vitest가 동일한 SVG import 계약을 사용하도록 구성한다.

Constraint: 개발 서버와 프로덕션 빌드 양쪽에서 SVG 컴포넌트 import가 동작해야 함
Rejected: SVG 전용 React 래퍼 유지 | 아이콘마다 반복되는 수동 마크업과 컴포넌트가 필요함
Confidence: high
Scope-risk: moderate
Directive: SVG를 URL로 사용할 때는 ?url import를 명시적으로 사용
Tested: pnpm check, Turbopack production build, Webpack production build, frozen lockfile install

* refactor: 사이드바 아이콘 표현 방식 통일

문자 기반 임시 아이콘을 제거하고 currentColor를 사용하는 SVG 컴포넌트로 교체한다.

Constraint: 기존 사이드바의 크기와 디자인 토큰을 유지해야 함
Rejected: 범용 아이콘 레지스트리 추가 | 현재 사용 범위에 비해 추상화 비용이 큼
Confidence: high
Scope-risk: narrow
Tested: pnpm check, 사이드바 component test, visual verification

* style: 기존 코드의 불필요한 빈 줄 정리

검증 도구가 요구하는 포맷을 맞추기 위해 동작에 영향을 주지 않는 공백만 정리한다.

Scope-risk: narrow
Tested: pnpm check

* [Feature] #144 게시글 상세 뷰 구현 (#148)

* feature: BlockNote 게시글 콘텐츠의 서버 렌더링 기반 마련

게시글 상세 화면은 작성 시 저장한 BlockNote 블록을 동일한 스키마로 받아 서버에서 HTML로 변환한다. 렌더러와 도메인 계약, 필요한 패키지 및 Next 외부 패키지 설정을 한 변경 단위로 묶었다.

Constraint: 실제 게시글 API 연동은 후속 작업으로 분리한다
Rejected: 클라이언트 에디터로 읽기 화면을 렌더링 | 읽기 전용 화면에 불필요한 클라이언트 경계를 만든다
Directive: API 연동 시 content 필드는 BlockNote Block 배열 계약을 유지해야 한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: develop 기준 기존 포맷 및 인증 import 오류로 전체 pnpm check 미실행

* feature: 게시글 상세 정보와 본문의 도메인 표현 구성

게시글 제목과 작성자, 발행일, 대표 이미지, CoLog 요약 및 본문 HTML 출력을 게시글 도메인 UI로 분리했다. 각 컴포넌트는 화면 조립이나 목차 행동을 알지 않고 게시글 데이터 표현에만 집중한다.

Constraint: 실제 게시글 데이터 조회는 후속 API 작업에서 연결한다
Rejected: 상세 위젯 한 파일에 모든 마크업 배치 | 도메인 표현과 화면 조립의 변경 이유가 섞인다
Directive: 상세 도메인 UI에는 목차 상태나 route 조회 책임을 추가하지 않는다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: develop 기준 기존 포맷 및 인증 import 오류로 전체 pnpm check 미실행

* feature: 게시글 구조에 맞춘 목차 탐색 흐름 제공

Swagger 계약을 대신하는 상세 목 데이터와 BlockNote h1부터 h3까지의 heading 추출, 현재 위치 추적 및 부드러운 앵커 이동을 하나의 상세 탐색 기능으로 구성했다.

Constraint: 실제 게시글 API 연결 전까지 Swagger 계약 기반 목 데이터를 사용한다
Rejected: 렌더링된 HTML을 다시 파싱해 목차 생성 | 원본 BlockNote 구조와 ID 정보를 중복 해석한다
Directive: API 연동 후에도 목차 입력은 렌더링 HTML이 아니라 BlockNote Block 배열을 사용한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: 실제 API 응답 및 브라우저 E2E는 후속 조립 커밋에서 검증

* feature: 게시글 상세 화면의 공개 경로 연결

게시글 도메인 UI와 목차 기능을 읽기 화면으로 조립하고 /posts/[postId] 경로에서 목 데이터를 제공한다. 존재하지 않는 게시글에는 피드 복귀가 가능한 404 화면을 제공하며 BlockNote 본문 스타일을 route 범위에서 적용한다.

Constraint: 실제 상세 API 연결 전까지 route는 동기 목 데이터 조회를 사용한다
Rejected: page 컴포넌트에 상세 마크업 직접 구현 | route와 화면 조립 책임이 결합된다
Directive: API 연동 시 page의 데이터 조회만 교체하고 PostDetail 조립 계약을 유지한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: 게시글 상세 Playwright 시나리오는 후속 테스트 작업에서 검증

* fix: develop 병합에서 누락된 BlockNote 서버 외부화 설정 복구

* chore: 각 태그 별 개행 간격 보정

* chore: 각 태그 별 개행 간격 보정 (헤딩 태그 유동적인 개행 간격 설정)

* feature: 전역에서 접근 가능한 공통 푸터 제공 (#69)

브랜드·정책·연락처 정보를 모든 페이지에서 일관되게 제공하도록 정적 Footer를 루트 레이아웃에 연결한다. 재사용 가능한 브랜드와 contact SVG는 public 자산으로 관리하고, 좁은 화면과 키보드 탐색을 회귀 테스트로 보호한다.

Constraint: 실제 정책 페이지와 연락 채널 URL은 후속 작업에서 연결
Rejected: 인라인 SVG 유지 | 다른 화면에서 동일 자산을 재사용하기 어려움
Confidence: high
Scope-risk: moderate
Directive: 실제 채널이 확정되면 Footer의 mock URL만 교체
Tested: format, lint, typecheck, unit 10개, component 11개, build, home E2E 3개

* [Feature] #139 팀 설정 프로필 페이지 구현 (#150)

* refactor: 코로그 요약과 프로필 타입을 단일 정보 모델로 통합

* feature: 코로그 프로필 설정값 검증과 정규화 정책 추가

* refactor: GitHub 로그인 아이콘을 공용 SVG 자산으로 통합

* feature: 코로그 프로필 이미지와 정보 입력 UI 구현

* feature: 팀 설정에 프로필 저장과 이탈 방지 흐름 연결

* test: 팀 프로필 설정의 저장과 이탈 방지 흐름 검증

* fix: 게시글의 긴 제목이 카드 내부에서 줄바꿈되도록 수정

* [Feature] #141 팀 설정 위험 영역 페이지 구현 (#151)

* feature: 팀 설정에서 영구 삭제 전 위험과 결과를 확인

* refactor: 팀 설정 기능을 동등한 섹션 계층으로 정렬

* feature: 클릭 가능한 공통 요소에 포인터 커서 제공

* refactor: SVG 아이콘을 소유 영역으로 이동해 컴포넌트 사용 방식 통일

* refactor: 워크스페이스에서 프로필 저장 상태 책임 분리

* refactor: 활성 설정 탭만 렌더링해 이탈 상태 관리 단순화

* [Feature] #145 팀 홈 페이지 구현 (#153)

* feature(PageShell): header가 전체 크기를 차지하는 레이아웃 추가

* chore: 깃허브/메일/링크 아이콘을 shared로 이동

* chore: 미트볼 아이콘 추가

* chore: 코로그 홈 mock 데이터 추가

* feature: 코로그 홈 히어로 컴포넌트 구현

* feature: 코로그 홈 멤버 목록 컴포넌트 구현

* design: 히어로 상단 더보기 버튼 반응형 위치 조정

* feature: 코로그 홈 게시글 목록 컴포넌트 구현

* test: 코로그 홈 내 컴포넌트 테스트 추가

* feature: 코로그 홈 페이지 구현

* design: 코로그 홈 반응형 추가

* design: 코로그 설명 및 코로그 게시글 캡션 폰트 사이즈 조정

* chore: 코로그 홈 페이지 진입 로직 주석 추가

* design: 코로그 홈 히어로 깃허브/메일 아이콘 사이 간격 조정

* refactor: 기존 도메인 model을 사용하도록 수정

* design: 코로그 소개 글 max-width 설정

* design(PageShell): main 섹션이 항상 중앙 배치되도록 수정

* design(CologMemberList): 유저 아바타 크기 조정

* [Refactor] #134 User Entity VO 고도화 (#158)

* feature: Email VO 추가

* feature: Nickname VO 추가

* feature: Slug VO 추가

* refactor: UserEntity VO 포장 적용

* refactor: Email은 VO이므로 null에 대한 방어 로직 적용

* refactor: Test Code Builder 수정

* feat: slug는 소문자로 저장한다는 정책 반영

* [Feature] #135 운영 서버 ci/cd 배포 파이프라인 추가 (#152)

* ci: 운영 서버 배포 파이프라인 추가

* ci: 운영 이미지 태그의 버전 변수 관리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 공개 팀 프로필 조회 경로 통합 (#165)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Chore] #155 공통 레이아웃 및 피드 UI 정리 (#157)

* feature: 브라우저 탭 파비콘 적용

* refactor: 루트 피드 리다이렉트를 설정으로 이전

* style: 게시글 상세 헤딩 하단 여백 확대

* refactor: 공통 Shell 합성 구조로 페이지 레이아웃 정리

* style: 게시글 피드 카드 가독성 조정

* chore: 게시글 상세 mock data 수정

* chore: tailwind css 속성값에 맞게 변경

* chore: sidebar/footer shell 제거

* chore: footer가 있는 페이지의 하단 여백을 공용 layout으로 추출

* [Feature] #159 게시글 상세조회 전용 단일 API 추가 (#163)

* feat: slug로 Blog 조회 메서드 추가

* feat: 특정 Post 조회시 연관관계를 함께 조회하는 메서드 추가

* feat: 특정 블로그의 전체 게시글 수 count 조회 메서드 추가

* feature: 해당 블로그의 팀원수를 count하는 집계 메서드 추가

* feature: 게시물 읽기 검증 및 소속 판단 로직 구현

- 테스트 코드추가

* feature: 게시글 소속에 따른 유동적인 응답을 제공하는 Dto 추가

* feature: 블로그의 특정 게시물을 상세 조회하는 통합 API 구현

* refactor: 기존 게시글 상세 조회 API를 V2로 마이그레이션

* feature: rilog, colog에 따른 응답 형식 변환을 Swagger 명세로 작성

* refactor: Controller 네이밍 & 어노테이션 순서 수정

* refactor: Colog 소속은 getColog를 사용하도록 변경

* refactor: 기존 PostDetailResponse
dV2를 PostDetailResponse로 네이밍 이전

* refactor: 도메인 용어를 affiliation에서 owner로 변경

* feature: 마지막 개행 추가

* feature: PostDetailResponse에 잘못된 블로그가 저장되지 않도록 방어하는 테스트 코드 추가

* refactor: jsonPath 수정

* [Feature] #156 팀 생성 페이지 로직 추가 (#160)

* feature: 팀 생성 구조 및 플로우를 팀 프로필 설정과 통일

* refactor: 코로그 생성 및 프로필 수정 공통 폼을 도메인 레이어로 분리

* chore: are로 시작하던 변수명을 is로 수정

* fix(CologCreateForm): 병합 충돌 과정에서 망가진 코드 복구

* fix(CologHomeHero): 테스트 용으로 남아있던 프로필 소개 repeat 제거

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>
Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Refactor] #172 affiliation에서 owner로 수정 (#173)

* [Feature] #161 모바일 반응형 대응 (#162)

* feature: 모바일용 하단 내비게이션바 추가

* design: 모바일 뷰에서도 게시글 상세 본문 텍스트를 16px로 통일

* design: 에디터 및 게시글 상세 list 요소 상하에 여백 추가

* feature: 모바일에서 발행 버튼을 하단으로 이동

* design: 푸터 모바일 반응형 추가

* refactor: 코로그 게시글에서도 PostFeedImage를 사용하도록 수정

* design: 코로그 홈 게시글 리스트 제목 폰트 사이즈 조정

* feature: 모바일용 date format 추가

* feature: 코로그 게시글 목록 닉네임에 truncate 추가

* design(CologPostList): 닉네임 우측 여백 제거

* design(Footer): 모바일 뷰에서 약관 제거

* feature: 모바일 뷰에서 하단 내비게이션바 대신 상단 헤더 사용

* design: 모바일 헤더 프로필에 border 추가

* fix: 사이드바 ui에서 로그아웃이 위로 옮겨짐 현상의 스파이 적출

* fix: footer 좌측에 여백이 중복으로 적용되던 문제 수정

* chore: format-published-date-mobile 파일을 기존 파일에 병합 및 모바일 여부를 인자로 받을 수 있도록 리팩토링

---------

Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Feature] #170 온보딩 폼 로직 연결 (#174)

* feature: 온보딩 폼 로직 추가

* chore(get-service-url-label): 네이밍 규칙에 맞지 않는 파일명 수정

* test(BlockNoteEditor): placeholder 관련 테스트 수정

* chore: navigate 라우터에 replace('/') 속성 추가

* feature: 온보딩 입력 유효성 검사 로직 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>
Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Refactor] #166 공개 블로그 게시글 목록 조회 제공 (#169)

* feature: 공개 블로그 게시글 목록 조회 제공

* fix: 공개 블로그 경로의 골뱅이 표기 복원

* fix: 공개 블로그 조회의 삭제 블로그 제외

공개 블로그 게시글 목록 조회에서 삭제된 블로그를 제외하도록 slug 조회 계약을 변경하고 공개 프로필 조회 진입점을 BlogController와 BlogService로 이동한다.

Tested: backend ./gradlew test

* refactor: 게시글 피드의 블로그 응답 이름 통일

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Fix] #171 코로그 설정 페이지 중첩 스크롤 문제 해결 (#175)

* feature: 코로그 프로필 설정 중첩 스크롤 제거

* refactor: 섹션이 page shell을 관리하도록 변경

* [Refactor] #167 라우트 경로 정리 (#178)

* refactor: App Router 페이지를 통일된 URL 구조로 재배치

* refactor: 내부 링크를 @slug 기반 라우트 계약으로 통일

* refactor: 코로그 설정 탭을 URL query와 동기화

* [Feature] #176 전체 피드 게시물 목록 조회 api 함수 구현 (#181)

* docs(frontend/AGENTS): api 아키텍처 관련 에이전트 지침 추가

* feature: 전체 피드 목록 조회 api 함수 구현

* config(next.config): mock 데이터 수용을 위해 remotePattern 전체 허용

* refactor: ssr prefetch에도 대응할 수 있도록 option/prefetch/query를 모아 관리하는 구조로 개편

* feature: 전체 피드 목록 조회 api 연동

* refactor: src/api 구조 개선

* chore: read-full-feed-posts.md task 파일 삭제

* chore: refactor-query-mutation task 파일 삭제

* refactor: 함수명은 축약하지 않은 상태로 복구

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* fix: 라우터 슬러그에 undefined 되던 버그 수정 (#185)

* [Refactor] #177 blogid를 slug로 통일 (#180)

* refactor: 멤버초대 검증 로직을 BlogMember 내부로 응집화

* refactor: cologId 대신 slug로 통일

* refactor: cologId 대신 slug로 멤버 초대 API 수정

* refactor: 게시글 발행 시 blogId 대신 slug를 사용하도록 통일

* refactor: BlogMember는 blogId로 조회하도록 개선

* refactor: 탈퇴된 Blog는 조회하지 않도록 JPA 쿼리 메서드에 반영

* [Feature]#186 게시글 상세 조회 api 구현 (#188)

* refactor: 피드 API 모듈을 shared 영역으로 이동

* feature: 게시글 상세 조회 API 연동

* refactor: 응답 필드명과 게시글 소유자 구조 통일 (#182)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #191 게시글 응답의 작성자 이름 필드명 통일 (#193)

* refactor: 게시글 응답의 작성자 이름 필드명 통일

* test: 전체 피드의 팀 소유자 응답 계약 보강

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Fix]  #189 피드 응답 필드명/소유자 구조 통일 반영 (#190)

* feature: 바뀐 백엔드 응답 형식에 맞게 반영

* fix: 블로그 상세 조회 API 타입 통일 및 author 필드명 호환성 처리

* [Feature] #187 공통 예외처리 로직 구현 (#194)

* chore: 에러 코드 상수화

* style: import문 정렬 수정

* chore: 서버 에러 응답 타입 정의

* feature: 서버 에러 정규화 로직 구현

* test: 테스트 내 401 에러 응답 공통 모듈로 분리

* feature: 블록노트 content 타입을 더 구체적으로 정의

* feature: 에러 정규화 로직을 가진 apiRequest/apiClient 구현 및 적용

* feature: 에러 정규화 로직을 가진 apiRequest/apiClient 구현 및 적용

* fix: 누락된 토큰 재발급 실패 이벤트 발행 로직 연결

* refactor: ky instance 생성 함수명 및 파일명 변경

* fix: requires auth 관련 로직 제거

* refactor: 오류 분류 세분화

* feature: Tanstack Query 전역 재시도 정책 설정

* feature: 폼 필드 에러 추출 함수 구현

* test: 요청 재시도 관련 테스트 추가

* refactor: 응답 필드명과 게시글 소유자 구조 통일 (#182)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* fix: kind/category 혼용되는 용어를 type/kind로 정리

* fix: 백엔드 Author 속성 코드 롤백

* fix: 백엔드 Author 속성 코드 롤백

---------

Co-authored-by: 진리로 <riro12@naver.com>

* [Refactor] #192 Blog Entity의 String slug를 Slug VO로 적용 (#195)

* refactor: Blog Entity의 String slug를 Slug VO로 적용

* refactor: Slug를 Blog 패키지로 이동한다.

* refactor: slug로 Blog 조회 이후는 id를 사용하도록 개선

* fix: Feed 조회 시, Slug VO도입으로 인한 JPQL 파싱 문제 해결 (#199)

* chore: backend-prod 라벨 추가 (#202)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #196 프론트엔드 모델 구조 리팩터링 (#203)

* chore: VSCode 작업 환경 설정 업데이트

* refactor: 도메인 계층 모델 구조 단일화 및 통합

* refactor: 코로그 관련 피처 model 및 lib 책임 분리

* refactor: 게시글 상세 피처 구조 개선 및 ID 매핑 수정

* refactor: 게시글 피드 피처 model 및 lib 책임 분리

* refactor: 게시글 작성 피처 model 및 lib 책임 분리

* refactor: 회원가입 피처 model 및 lib 책임 분리

* refactor: 게시글 피드 카드 및 관련 UI 컴포넌트를 post-feed 피처로 이전

* [Chore] #197 프론트엔드 배포 세팅 (#200)

* chore: pm2 스크립트 추가

* chore: CD 배포 파이프라인 구축 및 self-hosted 러너 연동

* chore: 워크플로우 수동 테스트 수단 추가

* chore: 워크플로우 수동 실행 시 배포 스크립트까지 실행되도록 수정

* chore: 임시로 PR 업데이트 시에도 배포 스크립트가 돌아가도록 설정

* chore: TARGET_DIR 경로 수정

* chore: NVM_DIR 경로 수정

* chore: node 설치 스크립트 추가

* chore: 환경변수 동적 할당 방식으로 변경

* chore: 환경변수를 절대경로로 변경

* chore: 전역 설치된 pnpm 및 pm2를 사용하도록 스크립트 수정

* fix: nvm 로드하는 코드 추가

* fix: nvm 파일 경로 확인되는지 디버깅

* fix: node와 pnpm 조합으로 변경

* fix: ssh 접속 환경과 동기화하는 코드 추가

* chore: NVM 경로를 환경변수 기반으로 변경

* chore: corepack 기반으로 pnpm 실행하도록 수정

* chore: 디버깅 코드 추가

* fix: nvm 자체 설치 로직 추가

* fix: pm2 자동 종료 정책 예외 처리

* chore: 초기 배포 스크립트로 복구

* chore: npm 경로 설정

* chore: env secret 이름 변경

* fix: 배포 환경 무한 재렌더 문제 해결

* chore: 요청 응답 공통 로깅 추가

* fix: 남아있는 배포 환경 무한 재렌더 문제 해결

* chore: 배포 스크립트를 프로덕션으로 전환

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #205 파일 업로드 api 구현 (#206)

* feat: 파일 업로드를 위한 Presigned URL API 및 클라이언트 구현

* refactor: Content-Type 방어 로직 추가 및 Presigned 네이밍 일관성 정렬

* refactor: S3 업로드 시 kyInstance 재활용 및 외부 URL 인증 토큰 주입 방어

* refactor: 토큰 만료 응답 판별 로직 캡슐화 및 타입 안정성 개선

---------

Co-authored-by: 송아영 <azerosong@gmail.com>

* [Feature] #207 getpublicprofile api 프론트엔드 연동 (#208)

* feature: 공개 블로그 프로필 조회 API 및 타입 정의

공개 블로그 프로필 정보를 조회하는 백엔드 엔드포인트(/v1/blogs/@{slug}) 호출 함수와 응답 인터페이스를 추가한다.

Tested: readBlogPublicProfile 단위 테스트 통과

* feature: 공개 블로그 프로필 React Query 훅 및 옵션 추가

공개 블로그 프로필 조회를 위한 query key, query options, useQuery 훅 및 prefetch 함수를 추가한다.

Tested: vitest 단위 테스트 및 타입 검사 통과

* feature: 블로그 홈 프로필 정보 API 연동

기존의 목 데이터를 제거하고 실제 getPublicProfile API를 호출하여 블로그 홈의 헤더 프로필 정보를 렌더링한다.
응답 데이터를 화면 컴포넌트 규격에 맞게 변환하는 매핑 유틸 함수를 추가한다.

Tested: mapCologProfileResponse 단위 테스트 통과

* [Feature] #204 서비스 통합테스트 유틸 ServiceSupport 추가 (#220)

* build: 테스트 DB h2 의존성 추가

* feature: 테스트 격리를 위한 DatabaseCleaner 추가

* feature: DatabaseCleanerConfiguration 설정 추가

* feature: 서비스 통합테스트 유틸 ServiceSupport 추가

* feature: application-test.yaml 추가

* chore: 사용하지 않는 주석 제거

* feature: Slug, Nickname 중복검사 서비스 통합테스트 작성

* refactor: 개행 두번을 하나로 삭제

* refactor: 잘못된 서비스 호출 오류 수정

* [Feature] #210 로그아웃 API 제공 (#216)

* feature: 로그아웃 API 제공

* refactor: Refresh Token 쿠키 주입 방식 정리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: @LoingUserId, @LoginUserSulg 어노테이션 스웨거 무시 설정 추가 (#222)

* [Feature] #217 내 블로그 목록 조회 api 연동 (#223)

* feature: 내 블로그 목록 요약 조회 api 함수 구현

* test: 테스트용 QueryClient 구현

* feature: 사이드바 팀 내비게이션에 내 팀 목록 요약 조회 api 연동

* [Feature] #225 토큰 기반 유저정보 조회 API 추가 (#228)

* refactor: 패키지 유지 용도의 .gitkeep 삭제

* feature: 유저 정보 조회 비즈니스 로직 추가 (by UserId)

* feature: 토큰 기반 유저 정보 조회 API 추가

* refactor: 닉네임, 슬러그 중복 검사 코드 위치 수정

* test: 유저 정보 조회 서비스통합테스트 코드 추가

* feature: 누락된 UserApiSpec 추가

* [Build] #231 deploy job 셀프호스트 라벨 추가 (#232)

* [Feature] #227 GitHub OAuth 프론트 콜백 흐름 제공 (#229)

* feature: GitHub OAuth 프론트 콜백 흐름 제공

* feature: 내부 경로 검증 추가

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #211 코로그 홈 게시글 피드 조회 api 연동 (#226)

* feature: 공개 블로그 게시글 목록 조회 API 및 쿼리 구현

* feature: 코로그 홈 게시글 목록 API 연동 및 무한 스크롤 적용

* [Refactor] #211 colog-home 위젯 내부 UI를 features 계층으로 분리

- colog-home 위젯의 CologHomeHero, CologPostList를 위젯의 Public UI(조합 레이어)로 격상
- 기존 colog-home/ui에 혼재되어 있던 기능별 표현 로직을 features 하위(colog-profile, colog-members, colog-post-feed)로 추출
- CologPostList에 스켈레톤 UI(CologPostFeedSkeleton) 적용 및 관련 훅 이동
- page.tsx 내의 불필요한 데이터 fetch 및 매퍼 로직을 제거하고 각 위젯/기능이 스스로 데이터를 책임지도록 개선

* [Feature] #219 멤버 추가 시 유저 정보 조회 api 연동 (#230)

* feature: 슬러그 기반 유저 정보 조회 api 함수 구현

* feature: 멤버 초대 모달 유저 정보 조회 api 함수 연동

* refactor: 멤버 초대 시 유저 조회 로직을 mutation으로 리팩터링

* [Feature] #224 토큰 기반 유저 정보 조회 api 연동 (#234)

* style: 불필요한 공백 제거

* feature: 토큰 기반 유저 정보 조회 api 함수 구현

* feature: 유저 관련 쿼리에 인가 쿼리 키 추가

* feature: 마스터토큰 기반 임시 token provider 구현

* feature: 전역 로그인 상태를 context로 관리

* feature: 전역 인가 상태를 기반으로 분기 로직 수정

* feature: 로그아웃/토큰 만료 시 인증 상태 초기화 로직 추가

* feature: 토큰이 없는 경우 토큰 기반 api가 호출되지 않도록 방어

* feature: map 변환 함수 추가

* [Feature] #213 팀 블로그 생성 api 연동 (#235)

* refactor(colog): 이메일 필드 완전 제거 및 잔재 정리

* [Feature] #213 팀 블로그 생성 API 및 타입 추가

* [Feature] #213 팀 블로그 생성 useMutation 훅 추가

* [Feature] #213 팀 블로그 생성 폼 실제 API 연동 및 모의 데이터 제거

* [Test] #213 팀 블로그 생성 폼 연동 테스트 업데이트

* [Hotfix] #236 멤버 모의 데이터 누락 복구 (#237)

* [Feature] #209 깃허브 소셜 로그인 구현 (#238)

* feature: 깃허브 소셜 로그인 구현

* refactor: auth api 경로를 shared 하위로 이동

* feature: 소셜 로그인 뒤 헤더로부터 토큰을 추출하는 로직 추가

* [Feature] #240 환경변수 추가 설정 (#243)

* refactor: RefreshToken SameSite Option 환경변수로 분리

* feature: AWS_S3_DIRECTORY application.yaml에 환경변수 추가

* [Featur…
Wlsflfh added a commit that referenced this pull request Aug 24, 2026
* chore: 저장소 공통 제외 규칙 설정 (#6)

* docs: 프로젝트 하네스 기본 기준 정리 (#8)

* chore: 파트별 변경의 리뷰 요청 자동화 (#12)

* [Chore] #9 프론트엔드 초기 세팅 (#10)

* chore: 프론트엔드 공통 실행·검증 환경 구성

* docs: 프론트엔드 개발 및 협업 기준 문서화

* chore: 미사용 코드와 빈 줄 검사 강화

* docs: 작업 범위별 브랜치 명명 기준 통일 (#17)

* [Chore] #14 프론트엔드 디자인 토큰 구성 (#18)

* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검

* [Chore] #15 ky config/client 설정 (#23)

* chore: config 폴더 제거

* chore: api client 테스트를 위한 의존성 설치

* feature: 토큰 재발급 로직을 포함하는 api client 모듈 구현

* feature: 토큰 재발급 실패 시 유저 데이터 초기화를 위한 구독발행 모델 구축

* style: import 순서 정렬

* chore: vitest config 내 alias 대상 상대경로 수정

* refactor: 토큰 재발급 실패 시 초기화 필요한 쿼리의 키를 그루핑

* feature: 토큰 재발급 실패 시 쿼리 초기화를 트리거하는 훅 컴포넌트 구현

* feature: QueryProvider 구현 및 적용

* chore(apiClient): tokenProvider 관련 TODO 추가

* chore(playwright.config): 대상 디렉터리 경로 수정

* chore: .env.example 파일 추가

* docs: 작업 범위별 브랜치 명명 기준 통일 (#17)

* [Chore] #14 프론트엔드 디자인 토큰 구성 (#18)

* design: 공통 타이포그래피 토큰 정의

* design: 색상과 버튼 상태 토큰 정의

* design: 전역 스타일의 의미 기반 토큰 연결

* chore: Tailwind CSS 편집기 진단 설정 공유

* design: 버튼 토큰의 유틸리티 연동

버튼의 상태·색상·크기 토큰을 Tailwind theme namespace로 옮겨 공용 컴포넌트에서 이름 있는 유틸리티로 조합할 수 있게 한다.

Constraint: Tailwind CSS v4 theme namespace를 통해 유틸리티를 생성해야 한다
Rejected: :root 버튼 변수 유지 | 컴포넌트에서 일관된 유틸리티 조합 불가
Confidence: high
Scope-risk: narrow
Directive: 버튼 상태와 foreground 토큰은 Button 컴포넌트 variant 조합에서 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 Button 컴포넌트의 키보드 상호작용

* design: focus ring 토큰의 의미 명확화

키보드 focus에 사용하는 색상임을 이름에 드러내고 Tailwind ring 유틸리티와 동일한 의미로 연결한다. 버튼 토큰 변경으로 참조가 사라진 radius mapping도 함께 제거한다.

Constraint: 모든 인터랙션 요소가 공통 focus 색상을 사용해야 한다
Rejected: --focus 이름 유지 | 색상 용도와 적용 대상이 모호함
Confidence: high
Scope-risk: narrow
Directive: 신규 interactive component는 버튼 전용 별칭 대신 ring-focus-ring을 사용한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 실제 브라우저 keyboard focus 시각 점검

* design: 숫자형 타이포그래피 스케일 정리

의미가 겹치는 본문·라벨 토큰을 크기 중심의 숫자 스케일로 통합해 역할별 행간과 자간을 컴포넌트에서 조합할 수 있게 한다.

Constraint: 현재 Figma에서 확인된 14px, 16px, 20px, 64px 위계를 유지해야 한다
Rejected: 역할별 글자 크기 토큰 유지 | 같은 크기의 중복 선언과 확장 기준이 불명확함
Confidence: high
Scope-risk: narrow
Directive: 새 글자 크기는 실제 디자인 사용처가 확인될 때만 숫자 스케일에 추가한다
Tested: Prettier, ESLint, TypeScript, Vitest, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 미구현 화면에서의 시각적 위계 검토

* design: 역할 기반 타이포그래피 토큰 체계 확장

기존 숫자형 글자 크기 토큰을 역할 기반의 caption, label, body, title, heading, display 체계로 재구성해 화면 코드가 의도를 드러내는 유틸리티를 사용할 수 있게 한다.

Constraint: Tailwind CSS v4 text namespace와 숫자형 단계 명명 규칙을 유지해야 한다
Rejected: 기존 숫자형 scale 유지 | 동일한 크기의 역할과 사용 맥락을 표현할 수 없음
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 타이포그래피는 기존 역할을 재사용하고, 실제 사용처가 확인될 때만 단계를 추가한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 구현 예정 화면에서의 시각적 위계 점검

* design: 홈 화면에 의미 기반 타이포그래피 적용

홈 화면의 기본 Tailwind 글자 크기를 역할 기반 토큰으로 바꿔 디자인 시스템이 정의한 행간과 자간을 일관되게 적용한다.

Constraint: 페이지 제목과 본문은 앞선 타이포그래피 토큰 커밋을 소비해야 한다
Rejected: text-4xl과 text-base 유지 | 화면마다 기본 scale과 의미 기반 토큰이 혼재함
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: 신규 화면은 기본 Tailwind font-size 대신 의미 기반 text 토큰을 우선 사용한다
Tested: Prettier, Next.js build, Tailwind 유틸리티 생성 확인
Not-tested: 브라우저별 실제 렌더링의 시각적 위계 점검

* chore(createApiClient): 토큰 재발급 분기 처리 관련 TODO 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #20 공용 버튼 컴포넌트 추가 (#21)

* feature: 서비스 전역 버튼 인터페이스 통일

* refactor: Button 타입과 크기별 스타일을 정리

Button에서만 사용하는 props 타입을 컴포넌트 파일로 옮기고 public entry의 타입 export를 제거했다.
버튼 크기별 모서리 반경도 sm/md와 lg의 위계를 드러내도록 조정했다.

Constraint: Button 타입의 외부 소비처가 없음
Rejected: 별도 타입 파일 유지 | 단일 소비처를 위한 파일 경계가 불필요함
Confidence: high
Scope-risk: narrow
Directive: 외부 타입 소비처가 생기면 필요한 타입만 public entry로 다시 공개할 것
Tested: pnpm check (format, lint, typecheck, component tests, build)
Not-tested: E2E 브라우저 흐름

* refactor: Button 전용 토큰의 소유 위치 정리

Button만 소비하는 시맨틱 토큰을 컴포넌트 폴더로 이동하고, 전역 스타일 진입점에서 등록하도록 import 경로를 분리했다.

Constraint: Tailwind 유틸리티 생성을 위해 @theme 토큰은 전역 CSS에서 import되어야 함
Rejected: foundations 토큰 폴더 유지 | Button 컴포넌트와 토큰의 소유 관계가 분산됨
Confidence: high
Scope-risk: narrow
Directive: 다른 공용 컴포넌트 전용 토큰도 소비처가 하나면 해당 컴포넌트와 함께 관리할 것
Tested: pnpm check (format, lint, typecheck, component tests, build)
Not-tested: E2E 브라우저 흐름

* [Chore] #19 전역예외처리핸들러 초기세팅 (#24)

* chore: domain 패키지 구조 유지 (#19)

* feat: InvalidParam 추가 (#19)

- 유효하지 않은 Param을 전달하기 위함.

* feat: ErrorDetail 추가 (#19)

* feat: RilogBusinessException 추가 (#19)

- 어플리케이션 최상위 커스텀 예외

* feat: ErrorInformation 추가 (#19)

- 커스텀 예외 생성자 시그니처를 Interface로 단축

* feat: GlobalExceptionInformation 추가 (#19)

* feat: GlobalExceptionHandler 추가 (#19)

- 전역 예외처리 핸들러로 한 곳에서 예외처리 관리

* docs: exception-handling.md 추가 (#19)

- 비즈니스 예외를 일관된 API 오류 응답으로 변환하는 방법을 설명

* refactor: 메서드 네이밍 수정 (#19)

* refactor: 자바 기본 예외는 초기세팅에 포함하지 않음. (#19)

* refactor: 클래스 선언 직후, 괄호 닫기 전 개행 추가 (#19)

* [Chore] #27 BaseEntity 초기세팅 (#28)

* build: Spring Data Jpa 라이브러리 추가 (#27)

* feat: BaseEntity 추가 (#27)

* feat: JpaAuditingConfig 추가 (#27)

- JpaAuditing 설정 허용

* feat: Spring Data 관련 예외처리 등록 (#27)

* docs: BaseEntity 사용 가이드.md 추가  (#27)

* chore: 프론트엔드 타입과 모듈 경계 규칙 통일 (#29)

객체 계약은 interface를 기본으로 사용하고 모듈 경계 import만 절대 경로를 사용하도록 기존 코드와 하네스를 함께 정리한다.

Constraint: 같은 모듈 내부 상대 경로는 허용
Rejected: 모듈별 barrel 유지 | 현재 공개 API 규모 대비 관리 비용과 runtime 혼합 위험이 큼
Directive: barrel 재도입은 명시적인 public API 필요가 확인된 뒤 별도 이슈 또는 ADR로 결정
Tested: Node 24.19.0에서 pnpm check 및 Playwright E2E 통과

* [Feature] #31 로그인 사용자 식별자 초기 구현 (#32)

* feat: @LoginUserId 추가 (#31)

* feat: @LoginUserSlug 추가 (#31)

* feat: 임시 LoginUserIdArgumentResolver 추가 (#31)

- 작업 병목을 막기 위한 임시 ArgumentResolver

* feat: 임시 LoginUserSlugArgumentResolver 추가 (#31)

- 작업 병목을 막기 위한 임시 ArgumentResolver

* [Feature] #30 users 테이블 구현 (#33)

* chore: service, repository 패키지 구조 추가

* refactor: HealthController 패키지 위치 변경

* refactor: HealthController 패키지 구조 변경에 의한 수정

* feature: User 테이블 구현

* feature: OnboardingStatus 구현

* test: UserTest 구현

* refactor: Onboarding 입력 값 추가

* test: Onboarding 입력 값 추가에 의한 테스트 케이스 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #34 1차 MVP Entity 초기 구현 (#39)

* refactor: 잘못된 패키지 구조 형식 제거 (#34)

* feature: test 패키지 gitignore 추가 (#34)

* refactor: User 패키지로 이동 (#34)

* refactor: HealthCheckController 패키지 이동 (#34)

* feature: user entity에 UNIQUE 제약 추가 (#34)

* feature: blog entity 추가 (#34)

* feature: post entity 추가 (#34)

* feature: BlogMember entity 추가 (#34)

* feature: local.env gitignore 추가 (#34)

* refactor: BlogMember Entity 잘못된 @table name 속성 수정  (#34)

* feature: application profile별 분리  (#34)

* refactor: author를 user로 변경 (#34)

* [Feature] #42 Swagger 추가 (#44)

* build: swagger 의존성 추가 (#42)

* build: dev, local 환경에 swagger 접속 허용 (#42)

* feature: OpenApiConfig 추가 (#42)

* [Feature] #47 예외 응답 형식 변경 (#48)

* refactor: GlobalExceptionInformation getErrorCode 응답 형식 변경

* docs: 예외 Enum 사용 방식 변경으로 docs 반영

* [Feature] #49 GitHub oauth 로그인 요청 및 callback 구현 (#56)

* refactor: 인증 보조 타입의 도메인 패키지 이동

* refactor: 인증 보조 타입의 패키지 선언 정리

* feature: GitHub OAuth 로그인 요청과 callback 검증 추가

* fix: 온보딩 slug 최초 저장과 재변경 방지

* docs: 아키텍쳐 구조 설명 추가

* fix: 파라미터 버그 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #45 게시글 발행 기능 구현 (#59)

* feature: Blog Entity에 owner 추가

* feature: Post Builder 패턴 적용

* refactor: 잘못 사용된 어노테이션 수정

- LoginUserId -> LoginUserSlug

* refactor: BlogType을 도메인 용어로 수정 COLOG, RILOG

* feat: Colog인지 확인하는 도메인 로직 추가

* feat: Blog 도메인 예외 추가

* Merge branch 'develop' of https://github.com/woowacourse-teams/2026-rilog into be/feature/#45-게시글-발행-기능-구현

# Conflicts:
#	backend/src/main/java/kr/rilog/domain/auth/resolver/LoginUserSlugArgumentResolver.java

* feat: 사용자를 찾을 수 없는 예외 에러 코드 추가

* feat: UserRepository 추가

* feat: BlogRepository 추가

- 개인사용자의 블로그를 조회하는 메서드 추가

* refactor: default 생성자 문제 해결 @Autowired 적용

* feat: PostRepository 추가

* feat: PostPublishRequest 추가

* feat: PostPublishResponse 추가

* feat: PostDetail 추가

* feat: PostSaveCommand 추가

* feat: PostPublishResult 추가

* refactor: default 생성자 문제 해결

* feat: PostService 추가 및 게시글 작성 구현

- 이미지 처리는 다음 이슈에 구현

* feat: PostController 추가 및 게시글 작성 API 구현

- 이미지 처리는 다음 이슈에 구현

* feat: NoResourceException 전역 예외 처리 추가

* feat: Post 게시글 작성 단위 테스트 추가

* refactor: .gradle-codex gitignore에 추가

* refactor: NoResourceFoundException 발생 시 잘못된 예외 코드 수정

* feature: Blog 소유자인지 판단하는 도메인 로직 추가

* feature: 게시글 작성 시, 다른 개인 블로그에 글을 작성할 수 있는 엣지케이스 제거 및 테스트 코드 작성

* [Feature] #57 GitHub access token 교환 및 사용자 정보 조회 구현 (#58)

* fix: GitHub 로그인 시작 생성자 주입 대상 명확화

* feature: GitHub Access Token 교환과 사용자 조회 추가

* refactor: 소셜 로그인 provider 경계 분리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #60 GitHub 로그인 사용자 생성과 온보딩 대기 처리 (#61)

* feature: GitHub 로그인 사용자 생성과 온보딩 대기 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

* refactor: OAuth 로그인 사용자 조회 흐름과 테스트 정리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

* fix: 생성자 충돌로 인한 정적 팩토리 메서드로 변경

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #62 전체 게시글 수 조회 API 구현 (#63)

* feature: 전체 게시글 수 조회 메서드 추가

* feature: TotalPostsCountResponse 추가

* feature: 전체 게시글 수 API 구현

* [Feature] #64 특정 게시글 상세 조회 API 구현 (#66)

* feat: hibernate Jackson 버전을 Spring Boot 4.0.x의 기본 Jackson 버전으로 명시

* feat: Post와 Author Fetch Join 메서드 추가

* feat: Post 도메인 예외 추가

* feat: 비공개 게시글 읽기 검증 로직 추가

* feat: 게시글 상세 조회 ResponseDto 추가

* feat: 게시글 상세 조회 비즈니스 로직 추가

* feat: 게시글 상세 조회 API 추가

* refactor: 잘못된 import 경로 수정

* refactor: 메서드명 readPosts에서 readPost로 변경

* refactor: Post에서 사용하지 않는 logoUrl 삭제

* fix: 메서드 시그니처 수정 누락 반영 (#71)

- logoUrl 메서드 시그니처 삭제

* feature: 자체 Access Token 발급과 검증 구현 (#67)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #68 Bearer 인증 인터셉터 구현 (#74)

* feature: Bearer 인증 인터셉터 구현

* refactor: 인증 선언과 사용자 주입 책임 분리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 역할 기반 인가 처리 구현 (#77)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feataure: 공용 텍스트 인풋 컴포넌트 구현 (#38)

* chore: placeholder 컬러 토큰 추가

* feature: 인풋 text 컴포넌트 구현

* chore: 범용 spacing 토큰 추가

* feature(Input): 아이콘/주소 prefix 등을 위해 인풋 좌측 슬롯 구현

* feature: 텍스트 영역 컴포넌트 구현

* style: css prettier 포맷 통일

* feature: left 컴포넌트를 클릭해도 input에 focus 되는 기능 추가

* feature(Textarea): 포커스 시 아웃라인 색상 지정

* test(Textarea): uncontrolled 방식의 테스트 제거

* [Feature] #72 전체 피드 게시글 목록 조회 (#79)

* feature: 전체 피드 게시글 목록 조회 메서드 구현

- 데이터 양이 많은 content 생략을 위해 Projection 사용.
- 정렬순은 하드코딩, 추후 확장성 고민해야함.

* feature: 전체피드 게시글 목록 Response 추가

- Inner Record를 사용

* feature: 전체피드 게시글 목록 조회 비즈니스 로직 추가

* feature: 전체피드 게시글 목록 조회 API 추가

* feature: 전체피드 게시글 목록 조회 API 추가

* feature: 전체피드 게시글 목록 조회 API Swagger 명세 추가

* feature: FeedService 단위 테스트 추가

* feature: 요청에 필요한 파라미터 누락 예외 상세하게 처리

* refactor: 잘못된 import 경로 수정

* [Refactor] #80 공통 응답 형식 적용 (#82)

* refactor: 공통 응답 ApiResponse 적용

- 소셜 로그인 컨트롤러는 미적용

* feature: ApiResponse 응답 적용

* refactor: 공통 응답 ApiResponse 적용

- 소셜 로그인 컨트롤러는 미적용

* feat: .gradle-user-home/ .gitignore 추가

* feature: 자체 로그인 토큰 흐름 제공 (#85)

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #84 Colog 피드에서 게시글 목록 조회 (#87)

* refactor: 전체피드 게시글 목록 조회 API에 ApiResponse 적용

* feature: 팀 피드 전체 게시글 목록 조회 메서드 추가

* feature: 팀 전체 피드 게시글 목록 응답 Dto 추가

* feature: 블로그 조회 메서드 추가

* refactor: 사용하지 않는 code 필드 제거 - ApiResponse

* feat: 팀피드 게시글 목록 조회 API 추가

* feat: 팀피드 게시글 목록 조회 비즈니스 로직 추가

* refactor: 전체 피드 게시글 목록 조회 비즈니스 로직 메서드명 수정

- 읽는다는 행위가 잘 드러나도록 read로 수정

* feature: 팀피드 게시글 조회 서비스 단위테스트코드 추가

* [Feature] #83 Refresh Token 재발급과 Rotation 처리 (#86)

* feature: Refresh Token 재발급과 Rotation 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

* [Feature] #84 Colog 피드에서 게시글 목록 조회 (#87)

* refactor: 전체피드 게시글 목록 조회 API에 ApiResponse 적용

* feature: 팀 피드 전체 게시글 목록 조회 메서드 추가

* feature: 팀 전체 피드 게시글 목록 응답 Dto 추가

* feature: 블로그 조회 메서드 추가

* refactor: 사용하지 않는 code 필드 제거 - ApiResponse

* feat: 팀피드 게시글 목록 조회 API 추가

* feat: 팀피드 게시글 목록 조회 비즈니스 로직 추가

* refactor: 전체 피드 게시글 목록 조회 비즈니스 로직 메서드명 수정

- 읽는다는 행위가 잘 드러나도록 read로 수정

* feature: 팀피드 게시글 조회 서비스 단위테스트코드 추가

* feature: Refresh Token 재발급과 Rotation 처리

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>
Co-authored-by: koreaioi <koreaioi@gachon.ac.kr>

* feature: 로고이미지, 깃허브주소, 이메일 필드 추가 (#91)

* feature: #22 공용 모달 컴포넌트 구현 (#35)

* feature: 공용 모달의 접근성과 표시 동작 기반 마련

* feature: 단일 확인 동작을 제공하는 알림 모달 구성

* feature: 위험도와 처리 상태를 반영하는 확인 모달 구성

* feature: 다양한 콘텐츠 구성을 수용하는 범용 모달 제공

* chore: 프론트엔드 pnpm workspace 패키지 범위 명시

* refactor: 모달 Props 계약의 컴포넌트별 소유권 정리

* design: 모달 모서리 곡률을 서비스 스타일에 맞게 조정

* design: 모달 닫기 버튼의 클릭 영역과 배치 조정

* design: 모달 기본 액션 버튼의 높이와 최소 너비 통일

* fix: 모달 표시 중 배경 페이지 스크롤 차단

* design: 모달 백드랍 색상을 중립적인 톤으로 조정

* fix: 모달 pending 중 모든 액션과 종료 동작 차단

* refactor: 모달 처리 상태 계약 통일

* design: 버튼 포커스 링 여백 제거

* design: 버튼 포커스 표현을 아웃라인으로 통일

* feature: #36 공용 파일 인풋 컴포넌트 구현 (#75)

* feature: 파일 업로더 컴포넌트 구현

* feature: 이미지 업로더 컴포넌트 구현

* refactor(FileUploader): 불필요한 props 제거

* feat: change 핸들러 인터페이스 추가

* fix: 파일 업로더에 키보드 접근이 가능하도록 수정

* feature: 이미지 파일 검증 로직 추가

* [Feature] #89 팀 생성 로직 구현 (#95)

* feature: 팀 블로그 생성 도메인 모델 추가

* feature: 팀 블로그 생성 서비스 구현

* feature: 팀 블로그 생성 API 제공

* feature: 팀 블로그 URL 정보 생성 요청 반영

* refactor: @requiredargsconstructor 사용하도록 변경

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #88 나의 팀 목록 요약 API (#96)

* feature: 나의 팀 리스트 조회 메서드 추가

* feature: MyCologResponse 추가

* feature: 나의 팀 목록 조회 비즈니스 로직 추가

* feature: 나의 팀 목록 조회 API 추가

* feature: 나의 팀 목록 조회 단위테스트 추가

* feature: BlogController에 ApiSpec 명세 적용

* hofix: 생성자 중복 삭제 (#101)

* [Feature] 팀 멤버 초대 API 구현 (#98)

* feature: 팀 멤버 초대 API 구현

* fix: CologService 오류 수정

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* fix: Clock 필드 주입 삭제 (#104)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 멤버 초대용 유저 정보 조회 제공 (#106)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #103 사용자 닉네임 슬러그 유효성 검사 구현 (#109)

* feat: 닉네임, 슬러그로 조회 메서드 추가

* feat: 닉네임, 슬러그 중복 예외 추가

* feat: 닉네임, 슬러그 중복검사 비즈니스 로직 추가

* feat: 닉네임, 슬러그 중복검사 API 구현

* feat: 닉네임, 슬러그 중복검사 테스트 코드 작성

* feature: 팀 상세 조회 API 구현 (#111)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 팀 프로필 조회 API 구현 (#113)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #110 colog 전체 멤버 목록 API 구현 (#114)

* feat: 팀목록 조회 메서드 추가

* feat: 팀목록 조회 비즈니스 로직 추가

* feat: 팀목록 멤버 조회 API 추가

* feat: 팀목록 멤버 조회 테스트 코드 추가

* feature: 온보딩 완료 후 정식 인증 세션 발급 (#116)

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #117 글 작성 및 조회 권한 처리 구현 (#118)

* feature: 게시글 상세 조회 선택 인증 지원

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

* feature: 게시글 작성과 비공개 조회 권한 검증

Tested: JAVA_HOME=/Users/jinriro/Library/Java/JavaVirtualMachines/ms-21.0.10/Contents/Home ./gradlew test

Tested: git diff --check

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #99 S3 PresignedUrl 발급 (#119)

* build: aws sdk s3 의존성 추가

* refactor: 예외 응답 고도화

* refactor: Upload 도메인 예외 추가

* refactor: Upload 도메인 enum 추가

* feat: PresignedUrl 관련 Dto 추가

* feat: S3 관련 환경변수 추가

* feat: S3Config 추가

* feat: S3Properties 추가

* feat: PresignedUrl 발급 비즈니스 로직 추가

* feat: PresignedUrl 발급 API 추가

* refactor: Dockerfile 캐싱 적용

* feat: 등록 가능 contentType, type 예시 추가

* [Build] #123 개발서버 CI-CD 파이프라인 구축 (#124)

* build: 개발서버 CI-CD 파이프라인 구축

* build: 잘못된 Dockerfile 명시 수정

* refactor: Push 에서 deploy job이 동작하도록 수정

* feature: 프론트 연동을 위한 CORS 설정 추가 (#125)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #127 크로스 플랫폼 설정과 GHA 캐싱 적용 (#128)

* refactor: 크로스 플랫폼 설정과 gha 캐싱 적용

* refactor: 잘못된 Dockerfile 이름 수정

* refactor: GitActions Runner 환경 ARM64 네이티브 러너 적용

* feature: 전달헤더 설정 추가 (#132)

- Swagger에서 API 요청 시 발생하는 CORS 문제 해결을 위함

* [Refactor] #129 로그인 이후 개인 블로그 생성 흐름 복구 (#130)

* fix: 로그인 이후 개인 블로그 생성 흐름 복구

* refactor: 온보딩 완료 책임의 서비스 의존 제거

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: #92 사이드바 구현 (#108)

* feature(Button): fullWidth 추가

* chore: navy 스케일 컬러 토큰 추가

* feature: 사이드바 컴포넌트 구현

* feature: 사이드바 접힘/열림 인터랙션 구현

* feature: 사이드바 관련 페이지 레이아웃 세팅

* feature: Button 스타일의 Link 컴포넌트를 ButtonLink로 분리

* feature: user/colog 공통 아바타 컴포넌트 구현

* feature: 사이드바 내비게이션 버튼 컴포넌트 구현

* feature: 사이드바 푸터 컴포넌트 구현

* feature: 사이드바 헤더 컴포넌트 구현

* refactor: 사이드바 컴포넌트 재구성

* test: 라우트 기반 로그아웃 동작을 버튼 기반으로 변경

* fix(Sidebar): 인가 여부 기본값 제거

* refactor(with-sidebar-layout): 메인 영역에 시맨틱 태그 사용

* feature: 공용 Divider 컴포넌트 구현

* feature: 사이드바에 Divider 추가

* fix(Sidebar): 인가 기본값 제거

* refactor(SidebarLayout): main 태그 제거

* test: 하드코딩된 UI 값 제거

* [Feature] #40 블로그 글 작성 페이지 UI 구현 (#126)

* build: BlockNote 패키지 버전 고정

* build: Pretendard 로컬 폰트 기반 제공

* design: BlockNote 스타일의 Rilog 토큰 연결

* feature: 글 작성 에디터 공개 계약 제공

* feature: 한국어 BlockNote 편집기 제공

* feature: 에디터 로드 실패 복구 상태 제공

* feature: BlockNote 브라우저 전용 로딩 경계 제공

* feature: 게시글 문서 유효성 판별

* feature: 자동 확장 제목 입력 흐름 제공

* feature: 본문 오류와 에디터 접근성 연결

* feature: 본문 이미지 로컬 업로더 제공

* feature: 글 작성 페이지의 기본 편집 흐름 제공

* feature: 글 작성 발행 진입 액션 제공

* feature: 저장되지 않은 글의 이탈 보호 제공

* feature: 게시 설정 도메인 계약과 선택 항목 제공

* feature: 대표 이미지 우선순위와 기본 미리보기 제공

* design: 파일 선택 컨트롤의 포커스 표현 통일

* feature: 접근 가능한 게시 설정 모달 제공

* feature: 게시 설정 유지와 발행 전 검증 제공

* feature: 교체 가능한 mock 발행 계약과 상세 경로 제공

* feature: 발행 상태 전이와 성공 후 이동 제공

* design: 게시 설정 모달의 경계와 포커스 표현 정돈

대표 이미지와 게시 설정 영역을 동일 비율로 배치하고 여백을 넓혀 정보 밀도를 조정한다. 모달 가장자리의 컨트롤은 focus outline을 내부에 표시해 잘림 없이 일관된 키보드 탐색 피드백을 제공한다.

Rejected: 공용 Button의 전역 outline offset 변경 | 모달 밖 버튼의 기존 시각 계약까지 바뀜
Confidence: high
Scope-risk: moderate
Directive: 모달 가장자리의 기본 컨트롤은 내부 focus outline 계약을 유지할 것
Tested: ESLint, TypeScript typecheck, component tests 86개, 키보드 focus 브라우저 확인, git diff check

* fix: 한글 조합 중 제목 Enter 이동 방지

IME 조합 중 발생한 Enter 이벤트를 본문 이동으로 처리하지 않도록
composition 상태를 확인한다.

Confidence: high
Scope-risk: narrow
Tested: PostTitleField component tests

* fix: 확정된 이탈 이동의 history 경쟁 제거

guard entry 제거와 실제 이동을 동기적으로 처리해 history.back과
fallback timer 사이의 중복 이동 가능성을 제거한다.

Rejected: popstate와 fallback timer 유지 | 이동 시점에 따라 두 경로가 경쟁할 수 있음
Confidence: high
Scope-risk: moderate
Tested: PostWriteWorkspace component tests

* fix: 유효한 상세 경로 확인 후 발행 상태 정리

발행 결과의 상세 경로를 먼저 검증해 잘못된 postId가 반환되더라도
작성 상태와 이탈 보호가 유지되도록 한다.

Rejected: 상태 정리 후 경로 생성 | 경로 생성 실패 시 작성 상태를 복구할 수 없음
Confidence: high
Scope-risk: narrow
Tested: PostWriteWorkspace component tests

* fix: BlockNote 표 셀 본문 유효성 판별

일반 content뿐 아니라 tableContent의 rows와 cells를 재귀 탐색해
표 안에 작성된 텍스트도 유효한 본문으로 인정한다.

Confidence: high
Scope-risk: narrow
Tested: post-write validation unit tests

* design: BlockNote 키보드 포커스와 블록 선택 표시 복원

BlockNote의 투명한 ring 값을 공용 focus token에 연결하고 선택된
콘텐츠에 outline을 제공해 현재 조작 대상을 식별할 수 있게 한다.

Constraint: 제목 입력은 기존 무경계 표현 유지
Rejected: box-shadow ring 추가 | 기존 outline 포커스 계약과 시각 효과가 중복됨
Confidence: high
Scope-risk: narrow
Tested: CSS formatting, production build, TypeScript

* fix: 실제 발행 제목과 길이 검증 기준 통일

제목의 앞뒤 공백을 제거한 값을 빈 값과 최대 길이 검증에 함께
사용해 실제 발행되는 제목과 검증 기준을 일치시킨다.

Confidence: high
Scope-risk: narrow
Tested: post-write validation unit tests

* design: 대표 이미지 선택 후 제어 영역 정렬

좁은 모달 열 안에서 이미지 변경과 제거 제어가 줄바꿈되지 않도록
설명과 버튼 행을 분리하고 선택 상태의 버튼 규격을 통일한다.

Rejected: viewport breakpoint 기반 flex 유지 | 실제 열 너비와 무관하게 가로 배치가 활성화됨
Confidence: high
Scope-risk: narrow
Tested: component tests, ESLint, TypeScript, production build, browser visual verification

* feat: 본문 placeholder에 마크다운 단축 문법 안내 제공

* [Feature] #93 로그인 모달 구현 (#137)

* design(Modal): 모달 내 개행 허용 및 레이아웃 조정

* feature: 로그인 모달 구현

* feature: 사이드바 로그인 버튼에 로그인 모달 연결

* feature: 로그인 모달을 전역으로 관리할 수 있도록 Context 구현

* feature: 로그인 상태에 따라 로그인 모달과 기존 액션을 분기하는 공통 훅 구현

* refactor(GuestSidebarFooter): 공통 로그인 모달 로직 적용

* [Feature] #94 온보딩 페이지 구현 (#136)

* chore: 브레이크포인트 토큰 추가

* feature: aside 기반 레이아웃 컴포넌트 구현

* feature: 프로필/커버 이미지 프리뷰 컴포넌트 구현

* feature: 공용 단일 인풋 field 컴포넌트 구현

* feature: 회원가입 폼 구현

* feature: 회원가입 페이지 구현

* design(FileUploader): ring을 outline으로 변경

* refactor: auth 하위 features를 auth/ui로 이동

* refactor: signup을 auth에서 분리

* feature: 공용 체크박스 컴포넌트 구현

* feature: 온보딩 폼에 약관 동의 추가

* fix: 온보딩 컴포넌트 import 경로 수정

* design: 존재하는 aside 영역만 표시하도록 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #140 팀 설정 멤버관리 페이지 구현 (#142)

* feature: 코로그 멤버 모조 데이터 추가

* feature: 코로그 설정 탭 구현

* feature: 코로그 멤버 관리 멤버 행 구현

* feature: 멤버 관리 섹션 구현

* feature: 코로그 설정 내 탭 조합

* feature: 코로그 설정 페이지(멤버 관리) 구현

* design(MemberManagementSection): 우상단 버튼 간격 조정

* [Feature] #93 로그인 모달 구현 (#137)

* design(Modal): 모달 내 개행 허용 및 레이아웃 조정

* feature: 로그인 모달 구현

* feature: 사이드바 로그인 버튼에 로그인 모달 연결

* feature: 로그인 모달을 전역으로 관리할 수 있도록 Context 구현

* feature: 로그인 상태에 따라 로그인 모달과 기존 액션을 분기하는 공통 훅 구현

* refactor(GuestSidebarFooter): 공통 로그인 모달 로직 적용

* [Feature] #94 온보딩 페이지 구현 (#136)

* chore: 브레이크포인트 토큰 추가

* feature: aside 기반 레이아웃 컴포넌트 구현

* feature: 프로필/커버 이미지 프리뷰 컴포넌트 구현

* feature: 공용 단일 인풋 field 컴포넌트 구현

* feature: 회원가입 폼 구현

* feature: 회원가입 페이지 구현

* design(FileUploader): ring을 outline으로 변경

* refactor: auth 하위 features를 auth/ui로 이동

* refactor: signup을 auth에서 분리

* feature: 공용 체크박스 컴포넌트 구현

* feature: 온보딩 폼에 약관 동의 추가

* fix: 온보딩 컴포넌트 import 경로 수정

* design: 존재하는 aside 영역만 표시하도록 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* fix: 아바타가 이미지 소스를 받을 수 있도록 수정

* feature: 멤버 초대 모조 데이터 추가

* feature: 멤버 초대 모달 내 멤버 행 컴포넌트 구현

* feature: 멤버 초대 모달 구현

* feature: 멤버 초대 모달 연결

* design: 멤버 초대 모달 내 스크롤 영역 조정

* refactor: 저장되지 않은 변경 가드 로직을 공통으로 분리

* feature: 멤버 수정 중 페이지 이탈 시 확인 모달 연결

* refactor: 코로그 설정 내 모든 저장되지 않은 변경을 일괄 처리할 수 있도록 개선

* fix(RootLayout): 사용자 정보 캐시 초기화 구독 컴포넌트 import 위치 수정

* feature: 코로그 설정 페이지에 셸 레이아웃 적용

* design: 멤버 목록 표 bg 및 border 설정 변경

* test: 누락된 코로그 설정 페이지 테스트 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #146 팀 생성 페이지 구현 (#147)

* fix: left 요소가 없을 때에도 gap이 적용되는 문제 해결

* chore: 팀 커버 이미지 플레이스홀더 에셋 추가

* feature: 팀 생성 폼 구현

* feature: 팀 생성 페이지 구현

* style: 불필요한 공백 제거

* feature: 팀 생성 버튼을 링크로 변경

* test: 팀 생성 페이지 통합 테스트 추가

* fix: 팀 생성 페이지에서 취소 시 이전 페이지로 리다이렉트하도록 변경

* chore: tailwind 속성 오타 수정

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #81 피드 페이지 UI와 무한 스크롤 구현 (#143)

* feature: 피드 게시글 표시 모델과 날짜 포맷터 정의

* feature: 피드 카드와 이미지 fallback UI 구현

* feature: 목 데이터 기반 피드 페이지 조회 상태 구성

* feature: 피드 무한 스크롤과 요청 상태 UI 구현

* feature: 피드 위젯을 조립해 feeds 페이지 구현

* feature: 루트 진입 경로를 피드로 연결

* feature: 피드 진입 시 콘텐츠로 자연스럽게 이동

* refactor: 피드 Colog 식별자 명명 통일

* refactor: 피드 작성자 프로필 표현을 UserAvatar로 통일

* [Chore] #120 SVGR 기반 아이콘 사용 환경 설정 (#149)

* build: SVG 아이콘의 컴포넌트 사용 환경 제공

Next.js의 Turbopack과 Webpack, Vitest가 동일한 SVG import 계약을 사용하도록 구성한다.

Constraint: 개발 서버와 프로덕션 빌드 양쪽에서 SVG 컴포넌트 import가 동작해야 함
Rejected: SVG 전용 React 래퍼 유지 | 아이콘마다 반복되는 수동 마크업과 컴포넌트가 필요함
Confidence: high
Scope-risk: moderate
Directive: SVG를 URL로 사용할 때는 ?url import를 명시적으로 사용
Tested: pnpm check, Turbopack production build, Webpack production build, frozen lockfile install

* refactor: 사이드바 아이콘 표현 방식 통일

문자 기반 임시 아이콘을 제거하고 currentColor를 사용하는 SVG 컴포넌트로 교체한다.

Constraint: 기존 사이드바의 크기와 디자인 토큰을 유지해야 함
Rejected: 범용 아이콘 레지스트리 추가 | 현재 사용 범위에 비해 추상화 비용이 큼
Confidence: high
Scope-risk: narrow
Tested: pnpm check, 사이드바 component test, visual verification

* style: 기존 코드의 불필요한 빈 줄 정리

검증 도구가 요구하는 포맷을 맞추기 위해 동작에 영향을 주지 않는 공백만 정리한다.

Scope-risk: narrow
Tested: pnpm check

* [Feature] #144 게시글 상세 뷰 구현 (#148)

* feature: BlockNote 게시글 콘텐츠의 서버 렌더링 기반 마련

게시글 상세 화면은 작성 시 저장한 BlockNote 블록을 동일한 스키마로 받아 서버에서 HTML로 변환한다. 렌더러와 도메인 계약, 필요한 패키지 및 Next 외부 패키지 설정을 한 변경 단위로 묶었다.

Constraint: 실제 게시글 API 연동은 후속 작업으로 분리한다
Rejected: 클라이언트 에디터로 읽기 화면을 렌더링 | 읽기 전용 화면에 불필요한 클라이언트 경계를 만든다
Directive: API 연동 시 content 필드는 BlockNote Block 배열 계약을 유지해야 한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: develop 기준 기존 포맷 및 인증 import 오류로 전체 pnpm check 미실행

* feature: 게시글 상세 정보와 본문의 도메인 표현 구성

게시글 제목과 작성자, 발행일, 대표 이미지, CoLog 요약 및 본문 HTML 출력을 게시글 도메인 UI로 분리했다. 각 컴포넌트는 화면 조립이나 목차 행동을 알지 않고 게시글 데이터 표현에만 집중한다.

Constraint: 실제 게시글 데이터 조회는 후속 API 작업에서 연결한다
Rejected: 상세 위젯 한 파일에 모든 마크업 배치 | 도메인 표현과 화면 조립의 변경 이유가 섞인다
Directive: 상세 도메인 UI에는 목차 상태나 route 조회 책임을 추가하지 않는다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: develop 기준 기존 포맷 및 인증 import 오류로 전체 pnpm check 미실행

* feature: 게시글 구조에 맞춘 목차 탐색 흐름 제공

Swagger 계약을 대신하는 상세 목 데이터와 BlockNote h1부터 h3까지의 heading 추출, 현재 위치 추적 및 부드러운 앵커 이동을 하나의 상세 탐색 기능으로 구성했다.

Constraint: 실제 게시글 API 연결 전까지 Swagger 계약 기반 목 데이터를 사용한다
Rejected: 렌더링된 HTML을 다시 파싱해 목차 생성 | 원본 BlockNote 구조와 ID 정보를 중복 해석한다
Directive: API 연동 후에도 목차 입력은 렌더링 HTML이 아니라 BlockNote Block 배열을 사용한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: 실제 API 응답 및 브라우저 E2E는 후속 조립 커밋에서 검증

* feature: 게시글 상세 화면의 공개 경로 연결

게시글 도메인 UI와 목차 기능을 읽기 화면으로 조립하고 /posts/[postId] 경로에서 목 데이터를 제공한다. 존재하지 않는 게시글에는 피드 복귀가 가능한 404 화면을 제공하며 BlockNote 본문 스타일을 route 범위에서 적용한다.

Constraint: 실제 상세 API 연결 전까지 route는 동기 목 데이터 조회를 사용한다
Rejected: page 컴포넌트에 상세 마크업 직접 구현 | route와 화면 조립 책임이 결합된다
Directive: API 연동 시 page의 데이터 조회만 교체하고 PostDetail 조립 계약을 유지한다
Tested: 대상 파일 Prettier 및 ESLint, staged diff check
Not-tested: 게시글 상세 Playwright 시나리오는 후속 테스트 작업에서 검증

* fix: develop 병합에서 누락된 BlockNote 서버 외부화 설정 복구

* chore: 각 태그 별 개행 간격 보정

* chore: 각 태그 별 개행 간격 보정 (헤딩 태그 유동적인 개행 간격 설정)

* feature: 전역에서 접근 가능한 공통 푸터 제공 (#69)

브랜드·정책·연락처 정보를 모든 페이지에서 일관되게 제공하도록 정적 Footer를 루트 레이아웃에 연결한다. 재사용 가능한 브랜드와 contact SVG는 public 자산으로 관리하고, 좁은 화면과 키보드 탐색을 회귀 테스트로 보호한다.

Constraint: 실제 정책 페이지와 연락 채널 URL은 후속 작업에서 연결
Rejected: 인라인 SVG 유지 | 다른 화면에서 동일 자산을 재사용하기 어려움
Confidence: high
Scope-risk: moderate
Directive: 실제 채널이 확정되면 Footer의 mock URL만 교체
Tested: format, lint, typecheck, unit 10개, component 11개, build, home E2E 3개

* [Feature] #139 팀 설정 프로필 페이지 구현 (#150)

* refactor: 코로그 요약과 프로필 타입을 단일 정보 모델로 통합

* feature: 코로그 프로필 설정값 검증과 정규화 정책 추가

* refactor: GitHub 로그인 아이콘을 공용 SVG 자산으로 통합

* feature: 코로그 프로필 이미지와 정보 입력 UI 구현

* feature: 팀 설정에 프로필 저장과 이탈 방지 흐름 연결

* test: 팀 프로필 설정의 저장과 이탈 방지 흐름 검증

* fix: 게시글의 긴 제목이 카드 내부에서 줄바꿈되도록 수정

* [Feature] #141 팀 설정 위험 영역 페이지 구현 (#151)

* feature: 팀 설정에서 영구 삭제 전 위험과 결과를 확인

* refactor: 팀 설정 기능을 동등한 섹션 계층으로 정렬

* feature: 클릭 가능한 공통 요소에 포인터 커서 제공

* refactor: SVG 아이콘을 소유 영역으로 이동해 컴포넌트 사용 방식 통일

* refactor: 워크스페이스에서 프로필 저장 상태 책임 분리

* refactor: 활성 설정 탭만 렌더링해 이탈 상태 관리 단순화

* [Feature] #145 팀 홈 페이지 구현 (#153)

* feature(PageShell): header가 전체 크기를 차지하는 레이아웃 추가

* chore: 깃허브/메일/링크 아이콘을 shared로 이동

* chore: 미트볼 아이콘 추가

* chore: 코로그 홈 mock 데이터 추가

* feature: 코로그 홈 히어로 컴포넌트 구현

* feature: 코로그 홈 멤버 목록 컴포넌트 구현

* design: 히어로 상단 더보기 버튼 반응형 위치 조정

* feature: 코로그 홈 게시글 목록 컴포넌트 구현

* test: 코로그 홈 내 컴포넌트 테스트 추가

* feature: 코로그 홈 페이지 구현

* design: 코로그 홈 반응형 추가

* design: 코로그 설명 및 코로그 게시글 캡션 폰트 사이즈 조정

* chore: 코로그 홈 페이지 진입 로직 주석 추가

* design: 코로그 홈 히어로 깃허브/메일 아이콘 사이 간격 조정

* refactor: 기존 도메인 model을 사용하도록 수정

* design: 코로그 소개 글 max-width 설정

* design(PageShell): main 섹션이 항상 중앙 배치되도록 수정

* design(CologMemberList): 유저 아바타 크기 조정

* [Refactor] #134 User Entity VO 고도화 (#158)

* feature: Email VO 추가

* feature: Nickname VO 추가

* feature: Slug VO 추가

* refactor: UserEntity VO 포장 적용

* refactor: Email은 VO이므로 null에 대한 방어 로직 적용

* refactor: Test Code Builder 수정

* feat: slug는 소문자로 저장한다는 정책 반영

* [Feature] #135 운영 서버 ci/cd 배포 파이프라인 추가 (#152)

* ci: 운영 서버 배포 파이프라인 추가

* ci: 운영 이미지 태그의 버전 변수 관리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: 공개 팀 프로필 조회 경로 통합 (#165)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Chore] #155 공통 레이아웃 및 피드 UI 정리 (#157)

* feature: 브라우저 탭 파비콘 적용

* refactor: 루트 피드 리다이렉트를 설정으로 이전

* style: 게시글 상세 헤딩 하단 여백 확대

* refactor: 공통 Shell 합성 구조로 페이지 레이아웃 정리

* style: 게시글 피드 카드 가독성 조정

* chore: 게시글 상세 mock data 수정

* chore: tailwind css 속성값에 맞게 변경

* chore: sidebar/footer shell 제거

* chore: footer가 있는 페이지의 하단 여백을 공용 layout으로 추출

* [Feature] #159 게시글 상세조회 전용 단일 API 추가 (#163)

* feat: slug로 Blog 조회 메서드 추가

* feat: 특정 Post 조회시 연관관계를 함께 조회하는 메서드 추가

* feat: 특정 블로그의 전체 게시글 수 count 조회 메서드 추가

* feature: 해당 블로그의 팀원수를 count하는 집계 메서드 추가

* feature: 게시물 읽기 검증 및 소속 판단 로직 구현

- 테스트 코드추가

* feature: 게시글 소속에 따른 유동적인 응답을 제공하는 Dto 추가

* feature: 블로그의 특정 게시물을 상세 조회하는 통합 API 구현

* refactor: 기존 게시글 상세 조회 API를 V2로 마이그레이션

* feature: rilog, colog에 따른 응답 형식 변환을 Swagger 명세로 작성

* refactor: Controller 네이밍 & 어노테이션 순서 수정

* refactor: Colog 소속은 getColog를 사용하도록 변경

* refactor: 기존 PostDetailResponse
dV2를 PostDetailResponse로 네이밍 이전

* refactor: 도메인 용어를 affiliation에서 owner로 변경

* feature: 마지막 개행 추가

* feature: PostDetailResponse에 잘못된 블로그가 저장되지 않도록 방어하는 테스트 코드 추가

* refactor: jsonPath 수정

* [Feature] #156 팀 생성 페이지 로직 추가 (#160)

* feature: 팀 생성 구조 및 플로우를 팀 프로필 설정과 통일

* refactor: 코로그 생성 및 프로필 수정 공통 폼을 도메인 레이어로 분리

* chore: are로 시작하던 변수명을 is로 수정

* fix(CologCreateForm): 병합 충돌 과정에서 망가진 코드 복구

* fix(CologHomeHero): 테스트 용으로 남아있던 프로필 소개 repeat 제거

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>
Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Refactor] #172 affiliation에서 owner로 수정 (#173)

* [Feature] #161 모바일 반응형 대응 (#162)

* feature: 모바일용 하단 내비게이션바 추가

* design: 모바일 뷰에서도 게시글 상세 본문 텍스트를 16px로 통일

* design: 에디터 및 게시글 상세 list 요소 상하에 여백 추가

* feature: 모바일에서 발행 버튼을 하단으로 이동

* design: 푸터 모바일 반응형 추가

* refactor: 코로그 게시글에서도 PostFeedImage를 사용하도록 수정

* design: 코로그 홈 게시글 리스트 제목 폰트 사이즈 조정

* feature: 모바일용 date format 추가

* feature: 코로그 게시글 목록 닉네임에 truncate 추가

* design(CologPostList): 닉네임 우측 여백 제거

* design(Footer): 모바일 뷰에서 약관 제거

* feature: 모바일 뷰에서 하단 내비게이션바 대신 상단 헤더 사용

* design: 모바일 헤더 프로필에 border 추가

* fix: 사이드바 ui에서 로그아웃이 위로 옮겨짐 현상의 스파이 적출

* fix: footer 좌측에 여백이 중복으로 적용되던 문제 수정

* chore: format-published-date-mobile 파일을 기존 파일에 병합 및 모바일 여부를 인자로 받을 수 있도록 리팩토링

---------

Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Feature] #170 온보딩 폼 로직 연결 (#174)

* feature: 온보딩 폼 로직 추가

* chore(get-service-url-label): 네이밍 규칙에 맞지 않는 파일명 수정

* test(BlockNoteEditor): placeholder 관련 테스트 수정

* chore: navigate 라우터에 replace('/') 속성 추가

* feature: 온보딩 입력 유효성 검사 로직 추가

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>
Co-authored-by: JetProc <soonjae8297@gmail.com>

* [Refactor] #166 공개 블로그 게시글 목록 조회 제공 (#169)

* feature: 공개 블로그 게시글 목록 조회 제공

* fix: 공개 블로그 경로의 골뱅이 표기 복원

* fix: 공개 블로그 조회의 삭제 블로그 제외

공개 블로그 게시글 목록 조회에서 삭제된 블로그를 제외하도록 slug 조회 계약을 변경하고 공개 프로필 조회 진입점을 BlogController와 BlogService로 이동한다.

Tested: backend ./gradlew test

* refactor: 게시글 피드의 블로그 응답 이름 통일

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Fix] #171 코로그 설정 페이지 중첩 스크롤 문제 해결 (#175)

* feature: 코로그 프로필 설정 중첩 스크롤 제거

* refactor: 섹션이 page shell을 관리하도록 변경

* [Refactor] #167 라우트 경로 정리 (#178)

* refactor: App Router 페이지를 통일된 URL 구조로 재배치

* refactor: 내부 링크를 @slug 기반 라우트 계약으로 통일

* refactor: 코로그 설정 탭을 URL query와 동기화

* [Feature] #176 전체 피드 게시물 목록 조회 api 함수 구현 (#181)

* docs(frontend/AGENTS): api 아키텍처 관련 에이전트 지침 추가

* feature: 전체 피드 목록 조회 api 함수 구현

* config(next.config): mock 데이터 수용을 위해 remotePattern 전체 허용

* refactor: ssr prefetch에도 대응할 수 있도록 option/prefetch/query를 모아 관리하는 구조로 개편

* feature: 전체 피드 목록 조회 api 연동

* refactor: src/api 구조 개선

* chore: read-full-feed-posts.md task 파일 삭제

* chore: refactor-query-mutation task 파일 삭제

* refactor: 함수명은 축약하지 않은 상태로 복구

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* fix: 라우터 슬러그에 undefined 되던 버그 수정 (#185)

* [Refactor] #177 blogid를 slug로 통일 (#180)

* refactor: 멤버초대 검증 로직을 BlogMember 내부로 응집화

* refactor: cologId 대신 slug로 통일

* refactor: cologId 대신 slug로 멤버 초대 API 수정

* refactor: 게시글 발행 시 blogId 대신 slug를 사용하도록 통일

* refactor: BlogMember는 blogId로 조회하도록 개선

* refactor: 탈퇴된 Blog는 조회하지 않도록 JPA 쿼리 메서드에 반영

* [Feature]#186 게시글 상세 조회 api 구현 (#188)

* refactor: 피드 API 모듈을 shared 영역으로 이동

* feature: 게시글 상세 조회 API 연동

* refactor: 응답 필드명과 게시글 소유자 구조 통일 (#182)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #191 게시글 응답의 작성자 이름 필드명 통일 (#193)

* refactor: 게시글 응답의 작성자 이름 필드명 통일

* test: 전체 피드의 팀 소유자 응답 계약 보강

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Fix]  #189 피드 응답 필드명/소유자 구조 통일 반영 (#190)

* feature: 바뀐 백엔드 응답 형식에 맞게 반영

* fix: 블로그 상세 조회 API 타입 통일 및 author 필드명 호환성 처리

* [Feature] #187 공통 예외처리 로직 구현 (#194)

* chore: 에러 코드 상수화

* style: import문 정렬 수정

* chore: 서버 에러 응답 타입 정의

* feature: 서버 에러 정규화 로직 구현

* test: 테스트 내 401 에러 응답 공통 모듈로 분리

* feature: 블록노트 content 타입을 더 구체적으로 정의

* feature: 에러 정규화 로직을 가진 apiRequest/apiClient 구현 및 적용

* feature: 에러 정규화 로직을 가진 apiRequest/apiClient 구현 및 적용

* fix: 누락된 토큰 재발급 실패 이벤트 발행 로직 연결

* refactor: ky instance 생성 함수명 및 파일명 변경

* fix: requires auth 관련 로직 제거

* refactor: 오류 분류 세분화

* feature: Tanstack Query 전역 재시도 정책 설정

* feature: 폼 필드 에러 추출 함수 구현

* test: 요청 재시도 관련 테스트 추가

* refactor: 응답 필드명과 게시글 소유자 구조 통일 (#182)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* fix: kind/category 혼용되는 용어를 type/kind로 정리

* fix: 백엔드 Author 속성 코드 롤백

* fix: 백엔드 Author 속성 코드 롤백

---------

Co-authored-by: 진리로 <riro12@naver.com>

* [Refactor] #192 Blog Entity의 String slug를 Slug VO로 적용 (#195)

* refactor: Blog Entity의 String slug를 Slug VO로 적용

* refactor: Slug를 Blog 패키지로 이동한다.

* refactor: slug로 Blog 조회 이후는 id를 사용하도록 개선

* fix: Feed 조회 시, Slug VO도입으로 인한 JPQL 파싱 문제 해결 (#199)

* chore: backend-prod 라벨 추가 (#202)

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Refactor] #196 프론트엔드 모델 구조 리팩터링 (#203)

* chore: VSCode 작업 환경 설정 업데이트

* refactor: 도메인 계층 모델 구조 단일화 및 통합

* refactor: 코로그 관련 피처 model 및 lib 책임 분리

* refactor: 게시글 상세 피처 구조 개선 및 ID 매핑 수정

* refactor: 게시글 피드 피처 model 및 lib 책임 분리

* refactor: 게시글 작성 피처 model 및 lib 책임 분리

* refactor: 회원가입 피처 model 및 lib 책임 분리

* refactor: 게시글 피드 카드 및 관련 UI 컴포넌트를 post-feed 피처로 이전

* [Chore] #197 프론트엔드 배포 세팅 (#200)

* chore: pm2 스크립트 추가

* chore: CD 배포 파이프라인 구축 및 self-hosted 러너 연동

* chore: 워크플로우 수동 테스트 수단 추가

* chore: 워크플로우 수동 실행 시 배포 스크립트까지 실행되도록 수정

* chore: 임시로 PR 업데이트 시에도 배포 스크립트가 돌아가도록 설정

* chore: TARGET_DIR 경로 수정

* chore: NVM_DIR 경로 수정

* chore: node 설치 스크립트 추가

* chore: 환경변수 동적 할당 방식으로 변경

* chore: 환경변수를 절대경로로 변경

* chore: 전역 설치된 pnpm 및 pm2를 사용하도록 스크립트 수정

* fix: nvm 로드하는 코드 추가

* fix: nvm 파일 경로 확인되는지 디버깅

* fix: node와 pnpm 조합으로 변경

* fix: ssh 접속 환경과 동기화하는 코드 추가

* chore: NVM 경로를 환경변수 기반으로 변경

* chore: corepack 기반으로 pnpm 실행하도록 수정

* chore: 디버깅 코드 추가

* fix: nvm 자체 설치 로직 추가

* fix: pm2 자동 종료 정책 예외 처리

* chore: 초기 배포 스크립트로 복구

* chore: npm 경로 설정

* chore: env secret 이름 변경

* fix: 배포 환경 무한 재렌더 문제 해결

* chore: 요청 응답 공통 로깅 추가

* fix: 남아있는 배포 환경 무한 재렌더 문제 해결

* chore: 배포 스크립트를 프로덕션으로 전환

---------

Co-authored-by: JetProc <46674347+JetProc@users.noreply.github.com>

* [Feature] #205 파일 업로드 api 구현 (#206)

* feat: 파일 업로드를 위한 Presigned URL API 및 클라이언트 구현

* refactor: Content-Type 방어 로직 추가 및 Presigned 네이밍 일관성 정렬

* refactor: S3 업로드 시 kyInstance 재활용 및 외부 URL 인증 토큰 주입 방어

* refactor: 토큰 만료 응답 판별 로직 캡슐화 및 타입 안정성 개선

---------

Co-authored-by: 송아영 <azerosong@gmail.com>

* [Feature] #207 getpublicprofile api 프론트엔드 연동 (#208)

* feature: 공개 블로그 프로필 조회 API 및 타입 정의

공개 블로그 프로필 정보를 조회하는 백엔드 엔드포인트(/v1/blogs/@{slug}) 호출 함수와 응답 인터페이스를 추가한다.

Tested: readBlogPublicProfile 단위 테스트 통과

* feature: 공개 블로그 프로필 React Query 훅 및 옵션 추가

공개 블로그 프로필 조회를 위한 query key, query options, useQuery 훅 및 prefetch 함수를 추가한다.

Tested: vitest 단위 테스트 및 타입 검사 통과

* feature: 블로그 홈 프로필 정보 API 연동

기존의 목 데이터를 제거하고 실제 getPublicProfile API를 호출하여 블로그 홈의 헤더 프로필 정보를 렌더링한다.
응답 데이터를 화면 컴포넌트 규격에 맞게 변환하는 매핑 유틸 함수를 추가한다.

Tested: mapCologProfileResponse 단위 테스트 통과

* [Feature] #204 서비스 통합테스트 유틸 ServiceSupport 추가 (#220)

* build: 테스트 DB h2 의존성 추가

* feature: 테스트 격리를 위한 DatabaseCleaner 추가

* feature: DatabaseCleanerConfiguration 설정 추가

* feature: 서비스 통합테스트 유틸 ServiceSupport 추가

* feature: application-test.yaml 추가

* chore: 사용하지 않는 주석 제거

* feature: Slug, Nickname 중복검사 서비스 통합테스트 작성

* refactor: 개행 두번을 하나로 삭제

* refactor: 잘못된 서비스 호출 오류 수정

* [Feature] #210 로그아웃 API 제공 (#216)

* feature: 로그아웃 API 제공

* refactor: Refresh Token 쿠키 주입 방식 정리

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* feature: @LoingUserId, @LoginUserSulg 어노테이션 스웨거 무시 설정 추가 (#222)

* [Feature] #217 내 블로그 목록 조회 api 연동 (#223)

* feature: 내 블로그 목록 요약 조회 api 함수 구현

* test: 테스트용 QueryClient 구현

* feature: 사이드바 팀 내비게이션에 내 팀 목록 요약 조회 api 연동

* [Feature] #225 토큰 기반 유저정보 조회 API 추가 (#228)

* refactor: 패키지 유지 용도의 .gitkeep 삭제

* feature: 유저 정보 조회 비즈니스 로직 추가 (by UserId)

* feature: 토큰 기반 유저 정보 조회 API 추가

* refactor: 닉네임, 슬러그 중복 검사 코드 위치 수정

* test: 유저 정보 조회 서비스통합테스트 코드 추가

* feature: 누락된 UserApiSpec 추가

* [Build] #231 deploy job 셀프호스트 라벨 추가 (#232)

* [Feature] #227 GitHub OAuth 프론트 콜백 흐름 제공 (#229)

* feature: GitHub OAuth 프론트 콜백 흐름 제공

* feature: 내부 경로 검증 추가

---------

Co-authored-by: Jinriro <riro12.hanyang.ac.kr>

* [Feature] #211 코로그 홈 게시글 피드 조회 api 연동 (#226)

* feature: 공개 블로그 게시글 목록 조회 API 및 쿼리 구현

* feature: 코로그 홈 게시글 목록 API 연동 및 무한 스크롤 적용

* [Refactor] #211 colog-home 위젯 내부 UI를 features 계층으로 분리

- colog-home 위젯의 CologHomeHero, CologPostList를 위젯의 Public UI(조합 레이어)로 격상
- 기존 colog-home/ui에 혼재되어 있던 기능별 표현 로직을 features 하위(colog-profile, colog-members, colog-post-feed)로 추출
- CologPostList에 스켈레톤 UI(CologPostFeedSkeleton) 적용 및 관련 훅 이동
- page.tsx 내의 불필요한 데이터 fetch 및 매퍼 로직을 제거하고 각 위젯/기능이 스스로 데이터를 책임지도록 개선

* [Feature] #219 멤버 추가 시 유저 정보 조회 api 연동 (#230)

* feature: 슬러그 기반 유저 정보 조회 api 함수 구현

* feature: 멤버 초대 모달 유저 정보 조회 api 함수 연동

* refactor: 멤버 초대 시 유저 조회 로직을 mutation으로 리팩터링

* [Feature] #224 토큰 기반 유저 정보 조회 api 연동 (#234)

* style: 불필요한 공백 제거

* feature: 토큰 기반 유저 정보 조회 api 함수 구현

* feature: 유저 관련 쿼리에 인가 쿼리 키 추가

* feature: 마스터토큰 기반 임시 token provider 구현

* feature: 전역 로그인 상태를 context로 관리

* feature: 전역 인가 상태를 기반으로 분기 로직 수정

* feature: 로그아웃/토큰 만료 시 인증 상태 초기화 로직 추가

* feature: 토큰이 없는 경우 토큰 기반 api가 호출되지 않도록 방어

* feature: map 변환 함수 추가

* [Feature] #213 팀 블로그 생성 api 연동 (#235)

* refactor(colog): 이메일 필드 완전 제거 및 잔재 정리

* [Feature] #213 팀 블로그 생성 API 및 타입 추가

* [Feature] #213 팀 블로그 생성 useMutation 훅 추가

* [Feature] #213 팀 블로그 생성 폼 실제 API 연동 및 모의 데이터 제거

* [Test] #213 팀 블로그 생성 폼 연동 테스트 업데이트

* [Hotfix] #236 멤버 모의 데이터 누락 복구 (#237)

* [Feature] #209 깃허브 소셜 로그인 구현 (#238)

* feature: 깃허브 소셜 로그인 구현

* refactor: auth api 경로를 shared 하위로 이동

* feature: 소셜 로그인 뒤 헤더로부터 토큰을 추출하는 로직 추가

* [Feature] #240 환경변수 추가 설정 (#243)

* refactor: RefreshToken SameSite Option 환경변수로 분리

* feature: AWS_S3_DIRECTORY application.yaml에 환경변수 추가

* [Feature] #215 …
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore 빌드, 설정, 의존성, 개발 환경 등 보조 작업을 수행합니다. frontend 프론트엔드 관련 작업입니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[chore] ky config/client 설정

2 participants