Skip to content

Refactor/#139 에러 메시지 라이팅 수정 및 SEO 초기세팅 - #142

Merged
optshj merged 10 commits into
devfrom
refactor/#139
Jul 31, 2026
Merged

optshj merged 10 commits into
devfrom
refactor/#139

Conversation

@optshj

@optshj optshj commented Jul 31, 2026 •

Copy link
Copy Markdown
Member

#️⃣연관된 이슈

📝작업 내용

에러메시지 라이팅 수정

  • 디자인에서 피드백 해준 에러메시지 라이팅을 수정했습니다.
  • 일부 메시지는 길어 토스트 에서 줄바꿈이 되도록 토스트 컴포넌트를 수정했습니다.
  • ErrorBoundary의 폴백으로 보이는 UI를 shared/error_fallback으로 공통 컴포넌트화 했습니다.

SEO 초기세팅

  • SEO 세팅을 위한 robot.ts, sitemap.ts, metadata.ts를 설정했습니다.
  • robot.ts에서는 /sitemap.xml과 / /login을 허용해두었습니다.
  • metadata.ts는 아직까진 브랜딩이 되지 않아 임의로 추가해두었습니다.

스크린샷 (선택)

💬리뷰 요구사항(선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

Summary by CodeRabbit

  • 새로운 기능

    • 검색엔진용 사이트맵과 크롤링 안내를 추가했습니다.
    • 사이트 제목·설명, 소셜 공유 정보, 구조화 데이터를 보강했습니다.
    • 여러 화면에서 공통 오류 안내 UI를 제공합니다.
  • 개선 사항

    • 오류 화면과 토스트 메시지를 더 명확하게 다듬고 줄바꿈을 지원합니다.
    • 프로필 이미지, PDF 업로드·생성, Notion 연결 등 실패 상황의 안내를 개선했습니다.
    • 입력 내용 유지 및 재시도 안내를 추가했습니다.
    • 프로젝트와 계정 관련 오류 화면의 표시 방식을 통일했습니다.

@optshj
optshj requested a review from leeleeleeleejun July 31, 2026 05:43
@optshj optshj self-assigned this Jul 31, 2026
@optshj optshj added the 🔨 Refactor 코드 리팩토링 label Jul 31, 2026
@optshj optshj linked an issue Jul 31, 2026 that may be closed by this pull request
1 task
@vercel

vercel Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
28th-web-team-1-fe Ready Ready Preview Jul 31, 2026 7:05am

@coderabbitai

coderabbitai Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0dc27c1a-e38f-4e06-9c6d-83beba3d0866

📥 Commits

Reviewing files that changed from the base of the PR and between 6c45b4d and ccba71f.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (2)
  • src/features/pdf_upload/ui/PdfUpload.tsx
  • src/shared/ui/error_fallback/ErrorFallback.tsx

Walkthrough

사이트의 robots, sitemap, 메타데이터와 GraphQL 스키마를 업데이트했습니다. 공통 ErrorFallback을 추가해 여러 오류 화면에 적용했습니다. 오류 토스트와 안내 문구를 한국어 및 줄바꿈 형식으로 정비했습니다.

Changes

사이트 노출 설정과 공개 계약

Layer / File(s) Summary
사이트 공개 설정과 메타데이터
app/robots.ts, app/sitemap.ts, middleware.ts, app/layout.tsx, src/app/layouts/*
robots, sitemap, viewport, Open Graph, Twitter 카드, JSON-LD를 추가했습니다. 공개 경로에 robots.txt와 sitemap.xml을 추가했습니다.
GraphQL 스키마 계약과 설명
schema.graphql
Credit, ConnectNotionRequest, Mutation.connectNotion, @defer, @experimental_disableErrorPropagation을 추가했습니다. 기존 스키마 설명을 보강했습니다.

공통 오류 폴백 적용

Layer / File(s) Summary
ErrorFallback 컴포넌트와 공개 export
src/shared/ui/error_fallback/*, src/shared/ui/index.ts
제목과 선택적 설명을 표시하는 ErrorFallback을 추가했습니다. Storybook 스토리와 export를 추가했습니다.
화면별 오류 폴백 교체
src/views/experiences/..., src/views/home/..., src/views/mypage/..., src/views/resume_create/..., src/views/resume_detail/..., src/views/resumes/..., src/entities/user/ui/UserProfile.tsx
여러 ErrorBoundary의 인라인 오류 UI를 ErrorFallback으로 교체했습니다. 경험 상세 콘텐츠에 ErrorBoundary를 추가했습니다.

사용자 안내 메시지 정비

Layer / File(s) Summary
오류 및 작업 안내 문구
app/global-error.tsx, src/entities/notion/..., src/features/..., src/shared/lib/auth-error.ts, src/views/...
인증, Notion, PDF, 경험, 프로필, 온보딩 및 전역 오류 메시지를 변경했습니다. 재시도, 입력 유지, 업로드 용량 안내를 추가했습니다.
Toast 줄바꿈 지원
src/shared/ui/toast/Toast.tsx
Toast 제목에서 줄바꿈을 표시하도록 whitespace-pre-line을 추가했습니다.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Page
  participant ErrorBoundary
  participant ErrorFallback
  Page->>ErrorBoundary: 콘텐츠 렌더링
  ErrorBoundary->>ErrorFallback: 오류 제목과 설명 전달
  ErrorFallback-->>Page: 공통 오류 화면 렌더링
Loading

Possibly related PRs

Suggested labels: ✨ Feature

Suggested reviewers: leeleeleeleejun

Poem

오류가 오면 토끼가 깡충,
공통 화면으로 모여요.
줄바꿈 안내를 따라
다시 시도해요, 폴짝!
사이트 길도 새로 열렸어요.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 에러 메시지 수정과 SEO 초기 설정이라는 변경사항의 주요 내용을 명확하게 요약합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ 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 refactor/#139

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: 5

🧹 Nitpick comments (1)
src/views/resume_edit/ui/edit/AiFeedbackDialog.tsx (1)

253-275: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

FieldSkeleton의 라벨 마크업이 Input/Textarea의 라벨 스타일과 중복됩니다.

Text variant={'label1'} weight={'semibold'} className={'truncate'} 조합은 Input.tsx, Textarea.tsx가 이미 자체적으로 렌더링하는 라벨과 동일한 스타일입니다. 필요하다면 공통 라벨 프리미티브를 추출해 재사용하는 방안을 고려하세요. 현재로서는 동작에 영향을 주지 않습니다.

🤖 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 `@src/views/resume_edit/ui/edit/AiFeedbackDialog.tsx` around lines 253 - 275,
Update FieldSkeleton to reuse the existing shared label primitive or
label-rendering pattern used by Input and Textarea instead of duplicating the
Text variant, weight, and className combination. Preserve the current label text
and skeleton layout behavior.
🤖 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 `@app/sitemap.ts`:
- Around line 8-15: Remove the lastModified: new Date() fields from the sitemap
entries, including the entries for the site root and /login, unless a reliable
actual content modification timestamp is available; keep the existing
changeFrequency, priority, and URL values unchanged.

In `@src/features/pdf_upload/ui/PdfUpload.tsx`:
- Line 43: Update the warning message in the PdfUpload component to replace the
incorrect Korean particle in “용량를” with “용량을”, leaving the rest of the message
and toast behavior unchanged.

In `@src/views/resume_edit/ui/edit/AiFeedbackDialog.tsx`:
- Around line 212-220: Update the title Input in AiFeedbackDialog’s title
rendering branch to enforce the API limit by adding a maximum length of 150
characters. Leave the existing value, change handler, and pending-state behavior
unchanged.
- Around line 106-123: The handleGenerate function must catch failures from
polish({ request, workspaceId }) and display a user-facing error with
toast.error. Keep the existing successful response handling and drafts update
unchanged, while ensuring the rejection is handled after the generation request.

In `@src/views/resume_edit/ui/ResumeEditPage.tsx`:
- Around line 144-160: ResumeEditPage의 공유 isPending을 ResumeToolbar의 isSaving으로
직접 전달하지 말고, 자동저장 saveDraft 실행 상태와 수동 저장·완료 작업 상태를 분리하세요. useIntervalAutosave에서
발생한 저장이 진행 중이어도 툴바의 임시저장·완료 버튼은 활성화하고, 수동 저장 또는 완료 작업 중일 때만 해당 버튼들을 비활성화하도록
handleDraftSave와 기존 handleSave 상태를 조정하세요.

---

Nitpick comments:
In `@src/views/resume_edit/ui/edit/AiFeedbackDialog.tsx`:
- Around line 253-275: Update FieldSkeleton to reuse the existing shared label
primitive or label-rendering pattern used by Input and Textarea instead of
duplicating the Text variant, weight, and className combination. Preserve the
current label text and skeleton layout behavior.
🪄 Autofix (Beta)

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: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d2fdde1b-b9f1-447d-9c6d-315439600158

📥 Commits

Reviewing files that changed from the base of the PR and between ffc17af and 6c45b4d.

📒 Files selected for processing (43)
  • app/global-error.tsx
  • app/layout.tsx
  • app/robots.ts
  • app/sitemap.ts
  • middleware.ts
  • schema.graphql
  • src/app/layouts/RootLayout.tsx
  • src/app/layouts/metadata.ts
  • src/entities/notion/model/notion.mutations.ts
  • src/entities/profile/api/profile.api.ts
  • src/entities/user/ui/UserProfile.tsx
  • src/features/authenticate/ui/WithdrawButton.tsx
  • src/features/notion_connect/hooks/useNotionReturn.ts
  • src/features/pdf_upload/ui/PdfUpload.tsx
  • src/features/resume_pdf_download/ui/ResumeDownloadButton.tsx
  • src/shared/lib/auth-error.ts
  • src/shared/lib/gql/gql.ts
  • src/shared/lib/gql/graphql.ts
  • src/shared/ui/error_fallback/ErrorFallback.stories.tsx
  • src/shared/ui/error_fallback/ErrorFallback.tsx
  • src/shared/ui/error_fallback/index.ts
  • src/shared/ui/index.ts
  • src/shared/ui/toast/Toast.tsx
  • src/views/experiences/ui/AddProjectManualView.tsx
  • src/views/experiences/ui/ExperiencesPage.tsx
  • src/views/experiences_detail/ui/ExperienceDetailPage.tsx
  • src/views/experiences_detail/ui/ExperienceDetailPanel.tsx
  • src/views/experiences_detail/ui/ExperienceList.tsx
  • src/views/home/ui/HomePage.tsx
  • src/views/mypage/hooks/useProfileSectionForm.ts
  • src/views/mypage/ui/MyAccountPage.tsx
  • src/views/mypage/ui/MyProfilePage.tsx
  • src/views/onboarding/ui/NotionProcessingStep.tsx
  • src/views/onboarding/ui/ResumeProcessingStep.tsx
  • src/views/resume_create/ui/ExperiencePickerDialog.tsx
  • src/views/resume_create/ui/ResumeCreatePage.tsx
  • src/views/resume_detail/ui/ResumeDetailPage.tsx
  • src/views/resume_edit/ui/ResumeEditPage.tsx
  • src/views/resume_edit/ui/edit/AiFeedbackDialog.tsx
  • src/views/resume_edit/ui/edit/CarrerSection.tsx
  • src/views/resume_edit/ui/edit/CoreSkillSection.tsx
  • src/views/resume_edit/ui/edit/ExperienceSection.tsx
  • src/views/resumes/ui/ResumesPage.tsx

Comment thread app/sitemap.ts
Comment on lines +8 to +15
lastModified: new Date(),
changeFrequency: 'yearly',
priority: 1
},
{
url: `${SITE_URL}/login`,
lastModified: new Date(),
changeFrequency: 'yearly',

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

실제 콘텐츠 수정 시각이 없으면 lastModified를 제거하세요.

new Date()는 sitemap 생성 시각을 각 페이지의 수정 시각으로 게시합니다. 배포 또는 재생성만으로 모든 URL이 변경된 것처럼 표시됩니다.

실제 수정 시각을 제공할 수 있을 때만 lastModified를 설정하세요.

수정 예시
   {
     url: SITE_URL,
-    lastModified: new Date(),
     changeFrequency: 'yearly',
     priority: 1
   },
   {
     url: `${SITE_URL}/login`,
-    lastModified: new Date(),
     changeFrequency: 'yearly',
     priority: 0.8
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
lastModified: new Date(),
changeFrequency: 'yearly',
priority: 1
},
{
url: `${SITE_URL}/login`,
lastModified: new Date(),
changeFrequency: 'yearly',
changeFrequency: 'yearly',
priority: 1
},
{
url: `${SITE_URL}/login`,
changeFrequency: 'yearly',
🤖 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 `@app/sitemap.ts` around lines 8 - 15, Remove the lastModified: new Date()
fields from the sitemap entries, including the entries for the site root and
/login, unless a reliable actual content modification timestamp is available;
keep the existing changeFrequency, priority, and URL values unchanged.

Comment thread src/features/pdf_upload/ui/PdfUpload.tsx Outdated
Comment on lines 106 to 123
const handleGenerate = async () => {
// 경험 세부내용을 다듬을 때 맥락으로 넘길 경험명 값(있으면).
amplitude.track(AMPLITUDE_EVENTS.AI_EDIT_STARTED, { edit_mode: EDIT_MODE_BY_STRUCTURE[structure] })
const titleTarget = targets.find((target) => target.kind === 'EXPERIENCE_TITLE')
const title = titleTarget ? drafts[titleTarget.name] : undefined

setIsGenerating(true)
try {
const entries = await Promise.all(
targets.map(async (target) => {
const request: PolishProfileTextRequest = {
kind: target.kind,
text: drafts[target.name] ?? '',
structure,
instruction: instruction || null,
jdId: jdId || null,
title: target.kind === 'EXPERIENCE_DESCRIPTION' ? (title ?? null) : null
}
const polished = await polish({ request, workspaceId })
return [target.name, polished] as const
})
)
setDrafts((prev) => ({ ...prev, ...Object.fromEntries(entries) }))
} finally {
setIsGenerating(false)

const request: PolishProfileTextRequest = {
kind,
description: drafts[description.name] ?? '',
structure,
instruction: instruction || null,
jdId: jdId || null,
title: title ? (drafts[title.name] ?? '') : null
}
const polished = await polish({ request, workspaceId })
setDrafts((prev) => ({
...prev,
[description.name]: polished.description,
...(title && polished.title !== null ? { [title.name]: polished.title } : {})
}))
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# usePolishProfileText 정의와 공용 mutation 에러 처리 패턴 확인
fd -e ts -e tsx . src/entities/profile | xargs rg -n -C6 'usePolishProfileText|onError'

Repository: YAPP-Github/28th-Web-Team-1-FE

Length of output: 2322


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== candidate files =="
fd -e ts -e tsx 'AiFeedbackDialog|ResumeEditPage|profile\.mutat|profile\.queries|polish' src || true

echo
echo "== AiFeedbackDialog relevant sections =="
fd -e tsx AiFeedbackDialog.tsx src | while read -r f; do
  echo "--- $f"
  wc -l "$f"
  sed -n '1,240p' "$f"
done

echo
echo "== profile mutations =="
fd -e ts profile.mutations.ts src | while read -r f; do
  echo "--- $f"
  wc -l "$f"
  sed -n '1,180p' "$f"
done

echo
echo "== related resume page handlers =="
fd -e tsx ResumeEditPage.tsx src | while read -r f; do
  echo "--- $f"
  wc -l "$f"
  rg -n -C 5 'generateCoreCompetency|toast\.error|polish|handleGenerate|handleApply|handleDraftSave' "$f" || true
done

echo
echo "== global/error toast patterns around usePolishProfileText usages =="
rg -n -C 4 'usePolishProfileText|from ["'\''].*profile["'\'']|onError|toast\.error|toast\.success' src/views src/entities src/shared src/lib 2>/dev/null || true

Repository: YAPP-Github/28th-Web-Team-1-FE

Length of output: 50388


handleGenerate 실패 시 사용자에게 에러 토스트를 표시하세요.

usePolishProfileText는 기본 onError 처리 없이 polishProfileText 호출 결과뿐 반환하고, polish({ request, workspaceId })는 성공한 결과만 drafts에 저장합니다. 요청이 실패하면 isPending만 다시 false가 되고 사용자에게는 아무 안내가 표시되지 않습니다. 생성 버튼에서 polish(...) 실패를 catch해 toast.error(...)로 안내하도록 수정하세요.

🤖 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 `@src/views/resume_edit/ui/edit/AiFeedbackDialog.tsx` around lines 106 - 123,
The handleGenerate function must catch failures from polish({ request,
workspaceId }) and display a user-facing error with toast.error. Keep the
existing successful response handling and drafts update unchanged, while
ensuring the rejection is handled after the generation request.

Comment on lines +212 to +220
{title && (
<Flex direction={'column'} gap={'2'}>
{isPending ? (
<FieldSkeleton label={title.label} />
) : (
<Input label={target.label} clearable={false} value={drafts[target.name] ?? ''} onChange={(event) => setDrafts((prev) => ({ ...prev, [target.name]: event.target.value }))} />
<Input label={title.label} clearable={false} value={drafts[title.name] ?? ''} onChange={(event) => setDrafts((prev) => ({ ...prev, [title.name]: event.target.value }))} />
)}
</Flex>
))}
)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

제목 입력 필드에 글자 수 제한이 없습니다.

description Textarea는 maxLength={500}으로 API 문서의 글자 수 제한을 강제합니다. 반면 title Input(Line 217)에는 maxLength가 없습니다. graphql.ts의 PolishProfileTextRequest.title 주석은 EXPERIENCE일 때 최대 150자로 명시합니다.

title Input에도 maxLength={150}을 추가해 일관성을 맞추세요.

🛠️ 제안 수정
-                  <Input label={title.label} clearable={false} value={drafts[title.name] ?? ''} onChange={(event) => setDrafts((prev) => ({ ...prev, [title.name]: event.target.value }))} />
+                  <Input
+                    label={title.label}
+                    clearable={false}
+                    maxLength={150}
+                    value={drafts[title.name] ?? ''}
+                    onChange={(event) => setDrafts((prev) => ({ ...prev, [title.name]: event.target.value }))}
+                  />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{title && (
<Flex direction={'column'} gap={'2'}>
{isPending ? (
<FieldSkeleton label={title.label} />
) : (
<Input label={target.label} clearable={false} value={drafts[target.name] ?? ''} onChange={(event) => setDrafts((prev) => ({ ...prev, [target.name]: event.target.value }))} />
<Input label={title.label} clearable={false} value={drafts[title.name] ?? ''} onChange={(event) => setDrafts((prev) => ({ ...prev, [title.name]: event.target.value }))} />
)}
</Flex>
))}
)}
{title && (
<Flex direction={'column'} gap={'2'}>
{isPending ? (
<FieldSkeleton label={title.label} />
) : (
<Input
label={title.label}
clearable={false}
maxLength={150}
value={drafts[title.name] ?? ''}
onChange={(event) => setDrafts((prev) => ({ ...prev, [title.name]: event.target.value }))}
/>
)}
</Flex>
)}
🤖 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 `@src/views/resume_edit/ui/edit/AiFeedbackDialog.tsx` around lines 212 - 220,
Update the title Input in AiFeedbackDialog’s title rendering branch to enforce
the API limit by adding a maximum length of 150 characters. Leave the existing
value, change handler, and pending-state behavior unchanged.

Comment thread src/views/resume_edit/ui/ResumeEditPage.tsx

@leeleeleeleejun leeleeleeleejun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

넵 작업 고생하셨습니다!
코드래빗이 오타 짚어줬네영

현재 에러 메시지들을 라이팅 수정했는데,
toast.success()처럼 성공 시 라이팅도 디자이너와 싱크를 맞춰야 하겠네여!

Comment thread app/robots.ts
Comment on lines +5 to +17
/**
* 로그인 이후에만 의미 있는 페이지가 대부분이라 전체를 비공개로 막되,
* 랜딩(/) · 로그인(/login)만 예외로 연다.
* '/$'는 '/'로 시작하는 모든 경로가 아니라 루트 경로 자체만 가리킨다(Disallow: /와의 충돌 방지).
*/
const robots = (): MetadataRoute.Robots => ({
rules: {
userAgent: '*',
allow: ['/$', '/login'],
disallow: '/'
},
sitemap: `${SITE_URL}/sitemap.xml`
})

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

👍🏻

return (
<html lang="ko" className={`${pretendard.className} ${pretendard.variable} ${elmsSans.variable} h-full antialiased`}>
<body className="flex h-full flex-col">
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(organizationJsonLd).replace(/</g, '\\u003c') }} />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

해당 코드의 역할이 무엇이가요??

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

해당 부분은 josn-ld인데,
JSON 형식을 기반으로 데이터를 정형화하여, 검색엔진과 AI가 콘텐츠의 의미를 명확히 파악할 수 있도록 돕습니다.
이를 통해 SEO 및 AEO 향상에 기여합니다.

시맨틱태그 등으로 하는 것과 별개로 검색엔진이 사이트를 이해하는데 도움이 됩니다.

@optshj

optshj commented Jul 31, 2026

Copy link
Copy Markdown
Member Author

넵 작업 고생하셨습니다! 코드래빗이 오타 짚어줬네영

현재 에러 메시지들을 라이팅 수정했는데, toast.success()처럼 성공 시 라이팅도 디자이너와 싱크를 맞춰야 하겠네여!

성공도 같이 작성해서 피드백 요청했는데, 성공 메시지는 별도로 수정 반영 사항이 없어서 현행 유지하기로 했습니다!

@github-actions

Copy link
Copy Markdown

@optshj
optshj merged commit 73558b0 into dev Jul 31, 2026
4 of 5 checks passed

This branch was successfully deployed

1 active deployment
Preview — ccba71f1 Deployed Jul 31, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔨 Refactor 코드 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Refactor] 에러 메시지 라이팅 수정

2 participants