From 0b8fa639f324878c8e45df3423bb557de343c76f Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 10 Aug 2026 18:00:21 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[fix]=20=EC=98=88=EB=A7=A4=20=EC=9D=BC?= =?UTF-8?q?=EC=A0=95=20=EC=B9=B4=EB=93=9C=20=ED=98=B8=EB=B2=84=20=EC=8B=9C?= =?UTF-8?q?=20=EC=83=81=EB=8B=A8=20=EC=9E=98=EB=A6=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit .ticketingPanelList가 overflow-y:auto인데 padding-top이 없어 .ticketCard:hover의 translateY(-1px)+box-shadow가 스크롤 컨테이너 상단 경계에 잘리던 문제. padding으로 여유 공간을 만들고 동일한 크기의 음수 margin으로 바깥 레이아웃은 그대로 유지했다. Co-Authored-By: Claude Sonnet 5 --- src/pages/HomePage.module.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/HomePage.module.css b/src/pages/HomePage.module.css index b18a2b7..b5fd8c8 100644 --- a/src/pages/HomePage.module.css +++ b/src/pages/HomePage.module.css @@ -237,6 +237,8 @@ display: flex; flex-direction: column; gap: 0.75rem; + padding: 4px 0; + margin: -4px 0; overflow-y: auto; scrollbar-width: none; } From 9a140afbde654fc113e30dc68992978e14b06a59 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 10 Aug 2026 18:15:37 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[fix]=20=EC=83=81=EC=84=B8=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20OG=20URL=20=EB=8F=99=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 콘서트/아티스트/발매 상세 페이지를 공유해도 og:url 등이 항상 홈으로 고정 노출되던 문제(PR #141 self-review 지적)를 해소한다. react-helmet-async는 index.html의 정적 meta 태그를 덮어쓰지 못하고 별도로 추가만 해서 title 요소가 중복되는 문제가 있어(첫 title 우선 규칙 때문에 오히려 반영이 안 됨) 채택하지 않았다. 대신 기존 정적 meta 노드를 직접 갱신하고 언마운트 시 기본값으로 복원하는 usePageMeta 훅을 추가했다. SSR/프리렌더링이 없는 CSR 환경이라 JS를 실행하지 않는 카카오톡/ 페이스북 등 공유 미리보기 봇에는 여전히 반영되지 않는다. 브라우저 탭 제목과 JS를 렌더링하는 검색엔진(Googlebot 등) 대상 개선. Co-Authored-By: Claude Sonnet 5 --- src/hooks/usePageMeta.js | 32 ++++++++++++++++++++++++++++++++ src/pages/ArtistDetailPage.jsx | 13 ++++++++----- src/pages/ConcertDetailPage.jsx | 13 +++++++++---- src/pages/ReleaseDetailPage.jsx | 13 ++++++++----- 4 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 src/hooks/usePageMeta.js diff --git a/src/hooks/usePageMeta.js b/src/hooks/usePageMeta.js new file mode 100644 index 0000000..d8ae888 --- /dev/null +++ b/src/hooks/usePageMeta.js @@ -0,0 +1,32 @@ +import { useEffect } from 'react' + +const DEFAULT_TITLE = 'Coming - Jpop 아티스트 내한 공연 정보' +const DEFAULT_DESCRIPTION = 'Jpop 아티스트 내한 공연 정보를 한 곳에서 확인하세요. 공연 일정, 아티스트, 발매 소식을 통합 제공하는 Coming입니다.' +const DEFAULT_URL = 'https://comingg.com' +const DEFAULT_IMAGE = 'https://comingg.com/logo-transparent.png' + +function setMetaContent(property, content) { + document.querySelector(`meta[property="${property}"]`)?.setAttribute('content', content) +} + +// SSR/프리렌더링이 없는 CSR 환경이라 JS를 실행하지 않는 공유 미리보기 봇(카카오톡·페이스북 등)에는 +// 반영되지 않는다. 브라우저 탭 제목과 JS를 렌더링하는 검색엔진(Googlebot 등) 대상 개선용. +export default function usePageMeta({ title, description, path, image }) { + useEffect(() => { + if (!title) return + + document.title = title + setMetaContent('og:title', title) + setMetaContent('og:description', description || DEFAULT_DESCRIPTION) + setMetaContent('og:url', `https://comingg.com${path}`) + setMetaContent('og:image', image || DEFAULT_IMAGE) + + return () => { + document.title = DEFAULT_TITLE + setMetaContent('og:title', DEFAULT_TITLE) + setMetaContent('og:description', DEFAULT_DESCRIPTION) + setMetaContent('og:url', DEFAULT_URL) + setMetaContent('og:image', DEFAULT_IMAGE) + } + }, [title, description, path, image]) +} diff --git a/src/pages/ArtistDetailPage.jsx b/src/pages/ArtistDetailPage.jsx index d578014..3de49f2 100644 --- a/src/pages/ArtistDetailPage.jsx +++ b/src/pages/ArtistDetailPage.jsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react' +import { useState } from 'react' import { Link, useParams, useSearchParams } from 'react-router-dom' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' @@ -14,6 +14,7 @@ import SourceCredit from '@/components/ui/SourceCredit' import SpotifyIcon from '@/components/ui/SpotifyIcon' import XIcon from '@/components/ui/XIcon' import YouTubeIcon from '@/components/ui/YouTubeIcon' +import usePageMeta from '@/hooks/usePageMeta' import { getArtist, getArtistConcerts, getArtistReleases, followArtist, unfollowArtist } from '@/services/artistApi' import useAuthStore from '@/stores/authStore' import useLoginModalStore from '@/stores/loginModalStore' @@ -100,10 +101,12 @@ function ArtistDetailPage() { retry: false, }) - useEffect(() => { - if (artist?.name) document.title = `${artist.name} — Coming` - return () => { document.title = 'Coming' } - }, [artist?.name]) + usePageMeta({ + title: artist?.name ? `${artist.name} — Coming` : undefined, + description: artist?.name ? `${artist.name} 아티스트 프로필 및 내한 공연 정보` : undefined, + path: `/artists/${artistId}`, + image: artist?.imageUrl, + }) const { data: concertsData, isLoading: concertsLoading } = useQuery({ queryKey: ['artist-concerts', artistId, concertTab, concertPage], diff --git a/src/pages/ConcertDetailPage.jsx b/src/pages/ConcertDetailPage.jsx index 0dea09b..151944d 100644 --- a/src/pages/ConcertDetailPage.jsx +++ b/src/pages/ConcertDetailPage.jsx @@ -7,6 +7,7 @@ import BackButton from '@/components/ui/BackButton' import Badge from '@/components/ui/Badge' import EmptyState from '@/components/ui/EmptyState' import InquiryModal from '@/components/ui/InquiryModal' +import usePageMeta from '@/hooks/usePageMeta' import { getConcert, getConcertSetlist } from '@/services/concertApi' import { addToCalendar, removeFromCalendar } from '@/services/calendarApi' import useAuthStore from '@/stores/authStore' @@ -49,10 +50,14 @@ function ConcertDetailPage() { retry: false, }) - useEffect(() => { - if (concert?.title) document.title = `${concert.title} — Coming` - return () => { document.title = 'Coming' } - }, [concert?.title]) + usePageMeta({ + title: concert?.title ? `${concert.title} — Coming` : undefined, + description: concert + ? `${(concert.artists ?? []).map((a) => a.name).join(' · ')} · ${concert.venue} · ${formatDate(concert.startDate)}` + : undefined, + path: `/concerts/${concertId}`, + image: concert?.posterUrl, + }) const { data: setlistData } = useQuery({ queryKey: ['concert-setlist', concertId], diff --git a/src/pages/ReleaseDetailPage.jsx b/src/pages/ReleaseDetailPage.jsx index 81dd12a..0ee22f7 100644 --- a/src/pages/ReleaseDetailPage.jsx +++ b/src/pages/ReleaseDetailPage.jsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react' +import { useState } from 'react' import { Link, useParams, useNavigate, useLocation } from 'react-router-dom' import { useQuery } from '@tanstack/react-query' @@ -6,6 +6,7 @@ import ArtistAliasName from '@/components/artist/ArtistAliasName' import EmptyState from '@/components/ui/EmptyState' import SourceCredit from '@/components/ui/SourceCredit' import SpotifyIcon from '@/components/ui/SpotifyIcon' +import usePageMeta from '@/hooks/usePageMeta' import { getRelease } from '@/services/releaseApi' import { ROUTES } from '@/constants/routes' import { getArtistColor } from '@/utils/artistColor' @@ -36,10 +37,12 @@ function ReleaseDetailPage() { retry: false, }) - useEffect(() => { - if (release?.title) document.title = `${release.title} — Coming` - return () => { document.title = 'Coming' } - }, [release?.title]) + usePageMeta({ + title: release?.title ? `${release.title} — Coming` : undefined, + description: release?.title ? `${release.artistName} · ${release.title} 발매 정보` : undefined, + path: `/releases/${releaseId}`, + image: release?.coverUrl, + }) function handleBack() { locationKey !== 'default' ? navigate(-1) : navigate(ROUTES.RELEASES) From 74f1d4208db823c95db69ee422d83dc522e5556a Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 10 Aug 2026 18:17:40 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[ui]=20=EB=B8=8C=EB=9E=9C=EB=93=9C=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=20"Coming"=20=E2=86=92=20"=EC=BB=A4?= =?UTF-8?q?=EB=B0=8D"=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "coming"은 사전 단어라 검색 상위 노출이 사실상 불가능하지만 "커밍"은 브랜드성 한글 키워드라 경쟁이 적어 색인 시 상위 노출 가능성이 높다. index.html 메타 태그, 브라우저 탭 타이틀, 이용약관/개인정보처리방침, Footer, 회원가입 안내 문구를 "커밍"으로 전환했다. 좌측 상단 로고 워드마크(Logo.jsx)와 "COMING" 배지/탭(내한 예정 아티스트를 뜻하는 도메인 라벨이지 브랜드명이 아님)은 변경 대상에서 제외했다. Co-Authored-By: Claude Sonnet 5 --- index.html | 14 +++++++------- src/components/layout/Footer.jsx | 2 +- src/constants/policy.js | 6 +++--- src/hooks/usePageMeta.js | 4 ++-- src/hooks/usePageTitle.js | 2 +- src/pages/ArtistDetailPage.jsx | 2 +- src/pages/ArtistsPage.jsx | 2 +- src/pages/CalendarPage.jsx | 2 +- src/pages/ConcertDetailPage.jsx | 2 +- src/pages/ConcertsPage.jsx | 2 +- src/pages/MyPage.jsx | 4 ++-- src/pages/ReleaseDetailPage.jsx | 2 +- src/pages/ReleasesPage.jsx | 2 +- src/pages/SignupPage.jsx | 6 +++--- 14 files changed, 26 insertions(+), 26 deletions(-) diff --git a/index.html b/index.html index 4ba0701..54e6511 100644 --- a/index.html +++ b/index.html @@ -4,18 +4,18 @@ - Coming - Jpop 아티스트 내한 공연 정보 - + 커밍 - Jpop 아티스트 내한 공연 정보 + - - - + + + - - + + 서비스 이용약관 개인정보처리방침 diff --git a/src/constants/policy.js b/src/constants/policy.js index bffff13..4080a54 100644 --- a/src/constants/policy.js +++ b/src/constants/policy.js @@ -1,10 +1,10 @@ export const TERMS_CONTENT = `시행일: 2026년 7월 1일 제1조 (목적) -이 약관은 Coming(이하 "서비스")의 이용과 관련하여 운영자와 이용자 간의 권리, 의무 및 책임 사항을 규정함을 목적으로 합니다. +이 약관은 커밍(이하 "서비스")의 이용과 관련하여 운영자와 이용자 간의 권리, 의무 및 책임 사항을 규정함을 목적으로 합니다. 제2조 (정의) -1. "서비스"란 운영자가 제공하는 Jpop 아티스트 내한 공연 정보 통합 웹 플랫폼 Coming 및 관련 제반 서비스를 의미합니다. +1. "서비스"란 운영자가 제공하는 Jpop 아티스트 내한 공연 정보 통합 웹 플랫폼 커밍 및 관련 제반 서비스를 의미합니다. 2. "이용자"란 이 약관에 동의하고 서비스를 이용하는 자를 말합니다. 3. "회원"이란 소셜 로그인을 통해 가입하여 서비스를 이용하는 자를 말합니다. @@ -54,7 +54,7 @@ export const TERMS_CONTENT = `시행일: 2026년 7월 1일 export const PRIVACY_CONTENT = `시행일: 2026년 7월 1일 -Coming(이하 "서비스")은 개인정보보호법 제30조에 따라 이용자의 개인정보를 보호하고 관련 고충을 신속하게 처리하기 위해 다음과 같이 개인정보처리방침을 수립·공개합니다. +커밍(이하 "서비스")은 개인정보보호법 제30조에 따라 이용자의 개인정보를 보호하고 관련 고충을 신속하게 처리하기 위해 다음과 같이 개인정보처리방침을 수립·공개합니다. 제1조 (수집하는 개인정보 항목 및 수집 방법) diff --git a/src/hooks/usePageMeta.js b/src/hooks/usePageMeta.js index d8ae888..a2202db 100644 --- a/src/hooks/usePageMeta.js +++ b/src/hooks/usePageMeta.js @@ -1,7 +1,7 @@ import { useEffect } from 'react' -const DEFAULT_TITLE = 'Coming - Jpop 아티스트 내한 공연 정보' -const DEFAULT_DESCRIPTION = 'Jpop 아티스트 내한 공연 정보를 한 곳에서 확인하세요. 공연 일정, 아티스트, 발매 소식을 통합 제공하는 Coming입니다.' +const DEFAULT_TITLE = '커밍 - Jpop 아티스트 내한 공연 정보' +const DEFAULT_DESCRIPTION = 'Jpop 아티스트 내한 공연 정보를 한 곳에서 확인하세요. 공연 일정, 아티스트, 발매 소식을 통합 제공하는 커밍입니다.' const DEFAULT_URL = 'https://comingg.com' const DEFAULT_IMAGE = 'https://comingg.com/logo-transparent.png' diff --git a/src/hooks/usePageTitle.js b/src/hooks/usePageTitle.js index 8ef1f2a..a5ccbeb 100644 --- a/src/hooks/usePageTitle.js +++ b/src/hooks/usePageTitle.js @@ -3,6 +3,6 @@ import { useEffect } from 'react' export default function usePageTitle(title) { useEffect(() => { document.title = title - return () => { document.title = 'Coming' } + return () => { document.title = '커밍' } }, [title]) } diff --git a/src/pages/ArtistDetailPage.jsx b/src/pages/ArtistDetailPage.jsx index 3de49f2..a42b882 100644 --- a/src/pages/ArtistDetailPage.jsx +++ b/src/pages/ArtistDetailPage.jsx @@ -102,7 +102,7 @@ function ArtistDetailPage() { }) usePageMeta({ - title: artist?.name ? `${artist.name} — Coming` : undefined, + title: artist?.name ? `${artist.name} — 커밍` : undefined, description: artist?.name ? `${artist.name} 아티스트 프로필 및 내한 공연 정보` : undefined, path: `/artists/${artistId}`, image: artist?.imageUrl, diff --git a/src/pages/ArtistsPage.jsx b/src/pages/ArtistsPage.jsx index 2c7547b..f649a67 100644 --- a/src/pages/ArtistsPage.jsx +++ b/src/pages/ArtistsPage.jsx @@ -29,7 +29,7 @@ function ArtistsPage() { const openLoginModal = useLoginModalStore((s) => s.open) const effectiveFollowedOnly = followedOnly && !!user - usePageTitle('아티스트 — Coming') + usePageTitle('아티스트 — 커밍') useEffect(() => { if (inputValue === urlQueryRef.current) return diff --git a/src/pages/CalendarPage.jsx b/src/pages/CalendarPage.jsx index f3fb344..10d6ca6 100644 --- a/src/pages/CalendarPage.jsx +++ b/src/pages/CalendarPage.jsx @@ -36,7 +36,7 @@ function CalendarPage() { const [selectedDate, setSelectedDate] = useState(null) const [viewMode, setViewMode] = useState('all') // 'all' | 'my' - usePageTitle('캘린더 — Coming') + usePageTitle('캘린더 — 커밍') const user = useAuthStore((s) => s.user) const isLoggedIn = !!user diff --git a/src/pages/ConcertDetailPage.jsx b/src/pages/ConcertDetailPage.jsx index 151944d..a25c181 100644 --- a/src/pages/ConcertDetailPage.jsx +++ b/src/pages/ConcertDetailPage.jsx @@ -51,7 +51,7 @@ function ConcertDetailPage() { }) usePageMeta({ - title: concert?.title ? `${concert.title} — Coming` : undefined, + title: concert?.title ? `${concert.title} — 커밍` : undefined, description: concert ? `${(concert.artists ?? []).map((a) => a.name).join(' · ')} · ${concert.venue} · ${formatDate(concert.startDate)}` : undefined, diff --git a/src/pages/ConcertsPage.jsx b/src/pages/ConcertsPage.jsx index 283a40e..e343339 100644 --- a/src/pages/ConcertsPage.jsx +++ b/src/pages/ConcertsPage.jsx @@ -43,7 +43,7 @@ function ConcertsPage() { const openLoginModal = useLoginModalStore((s) => s.open) const effectiveFollowedOnly = followedOnly && !!user - usePageTitle('공연 — Coming') + usePageTitle('공연 — 커밍') useEffect(() => { if (inputValue === urlQueryRef.current) return diff --git a/src/pages/MyPage.jsx b/src/pages/MyPage.jsx index 453cb4b..8f65347 100644 --- a/src/pages/MyPage.jsx +++ b/src/pages/MyPage.jsx @@ -360,8 +360,8 @@ function MyPage() { const [inquiryPage, setInquiryPage] = useState(1) useEffect(() => { - document.title = '마이페이지 — Coming' - return () => { document.title = 'Coming' } + document.title = '마이페이지 — 커밍' + return () => { document.title = '커밍' } }, []) const { data: user } = useQuery({ diff --git a/src/pages/ReleaseDetailPage.jsx b/src/pages/ReleaseDetailPage.jsx index 0ee22f7..c8e60c2 100644 --- a/src/pages/ReleaseDetailPage.jsx +++ b/src/pages/ReleaseDetailPage.jsx @@ -38,7 +38,7 @@ function ReleaseDetailPage() { }) usePageMeta({ - title: release?.title ? `${release.title} — Coming` : undefined, + title: release?.title ? `${release.title} — 커밍` : undefined, description: release?.title ? `${release.artistName} · ${release.title} 발매 정보` : undefined, path: `/releases/${releaseId}`, image: release?.coverUrl, diff --git a/src/pages/ReleasesPage.jsx b/src/pages/ReleasesPage.jsx index 368382a..ecb0a3d 100644 --- a/src/pages/ReleasesPage.jsx +++ b/src/pages/ReleasesPage.jsx @@ -34,7 +34,7 @@ function ReleasesPage() { const openLoginModal = useLoginModalStore((s) => s.open) const effectiveFollowedOnly = followedOnly && !!user - usePageTitle('음악 — Coming') + usePageTitle('음악 — 커밍') useEffect(() => { if (inputValue === urlQueryRef.current) return diff --git a/src/pages/SignupPage.jsx b/src/pages/SignupPage.jsx index 4bd155b..58a0f77 100644 --- a/src/pages/SignupPage.jsx +++ b/src/pages/SignupPage.jsx @@ -82,8 +82,8 @@ function SignupPage() { const nicknameTimer = useRef(null) useEffect(() => { - document.title = '회원가입 — Coming' - return () => { document.title = 'Coming' } + document.title = '회원가입 — 커밍' + return () => { document.title = '커밍' } }, []) function handleAllAgreed(checked) { @@ -199,7 +199,7 @@ function SignupPage() {

회원가입

-

Coming을 이용하려면 아래 정보를 입력해주세요.

+

커밍을 이용하려면 아래 정보를 입력해주세요.

{/* 닉네임 */} From b8ef758567d13604b4a54dac791a036bda2302e4 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 10 Aug 2026 18:18:40 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[feat]=20=ED=99=88=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20Organization/WebSite=20=EA=B5=AC=EC=A1=B0=ED=99=94?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 모든 라우트에서 렌더링되는 schema.org/WebSite JSON-LD를 추가해 구글이 "커밍" 브랜드 키워드 검색 시 사이트 정체성을 명확히 인식하도록 한다. name/alternateName으로 "커밍"/"Coming" 둘 다 매핑했다. Co-Authored-By: Claude Sonnet 5 --- src/App.jsx | 4 ++++ src/utils/structuredData.js | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/App.jsx b/src/App.jsx index 3b985f2..1e4160f 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -4,6 +4,7 @@ import { Analytics } from '@vercel/analytics/react' import { SpeedInsights } from '@vercel/speed-insights/react' import useAuthStore, { SESSION_HINT } from '@/stores/authStore' +import { buildWebsiteJsonLd, toSafeJsonLd } from '@/utils/structuredData' import AdminLayout from '@/components/layout/AdminLayout' import AdminRoute from '@/components/layout/AdminRoute' import Layout from '@/components/layout/Layout' @@ -46,6 +47,8 @@ function App() { }, [clearUser]) return ( + <> + @@ -87,6 +90,7 @@ function App() { + ) } diff --git a/src/utils/structuredData.js b/src/utils/structuredData.js index 950a63b..0d8974f 100644 --- a/src/utils/structuredData.js +++ b/src/utils/structuredData.js @@ -41,6 +41,18 @@ export function buildConcertEventJsonLd(concert) { } } +// 사이트 전역용 schema.org/WebSite 구조화 데이터. 브랜드 키워드("커밍") 검색 시 사이트 정체성 인식용. +export function buildWebsiteJsonLd() { + return { + '@context': 'https://schema.org', + '@type': 'WebSite', + name: '커밍', + alternateName: 'Coming', + url: 'https://comingg.com', + description: 'Jpop 아티스트 내한 공연 정보를 한 곳에서 확인하세요. 공연 일정, 아티스트, 발매 소식을 통합 제공하는 커밍입니다.', + } +} + // script 태그 조기 종료() 인젝션 방지 export function toSafeJsonLd(data) { return JSON.stringify(data).replace(/ Date: Mon, 10 Aug 2026 18:18:58 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[chore]=20sitemap.xml=20=ED=95=98=EB=93=9C?= =?UTF-8?q?=EC=BD=94=EB=94=A9=EB=90=9C=20lastmod=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #141 self-review 지적사항. 빌드 시점 자동 생성 인프라가 없는 상태에서 고정 날짜를 유지하면 시간이 지날수록 실제 갱신 시점과 어긋나 오히려 신뢰도를 떨어뜨린다. lastmod는 sitemap 스펙상 선택 필드라 제거했다. Co-Authored-By: Claude Sonnet 5 --- public/sitemap.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/public/sitemap.xml b/public/sitemap.xml index f69b901..bb8ed44 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,43 +2,36 @@ https://comingg.com/ - 2026-08-10 daily 1.0 https://comingg.com/artists - 2026-08-10 daily 0.8 https://comingg.com/concerts - 2026-08-10 daily 0.8 https://comingg.com/releases - 2026-08-10 daily 0.7 https://comingg.com/calendar - 2026-08-10 weekly 0.6 https://comingg.com/terms - 2026-08-10 yearly 0.2 https://comingg.com/privacy - 2026-08-10 yearly 0.2 From 62b9360b0c7326cbb709c1789882661e7bbf6e6b Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Tue, 11 Aug 2026 18:26:27 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[fix]=20=EB=B8=8C=EB=9D=BC=EC=9A=B0?= =?UTF-8?q?=EC=A0=80=20=ED=83=AD=20=EC=A0=9C=EB=AA=A9=EC=9D=84=20"?= =?UTF-8?q?=EC=BB=A4=EB=B0=8D"=EC=9C=BC=EB=A1=9C=20=EC=B6=95=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - index.html 을 "커밍 - Jpop 아티스트 내한 공연 정보"에서 "커밍"으로 변경 - usePageMeta document.title 복원 기본값도 동일하게 축소 - og:title 복원 기본값은 DEFAULT_OG_TITLE로 분리해 기존 키워드 문구 유지 (공유 미리보기·SEO 영향 최소화) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --- index.html | 2 +- src/hooks/usePageMeta.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index 54e6511..5a6e257 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>커밍 - Jpop 아티스트 내한 공연 정보 + 커밍 diff --git a/src/hooks/usePageMeta.js b/src/hooks/usePageMeta.js index a2202db..b1ce8bd 100644 --- a/src/hooks/usePageMeta.js +++ b/src/hooks/usePageMeta.js @@ -1,6 +1,7 @@ import { useEffect } from 'react' -const DEFAULT_TITLE = '커밍 - Jpop 아티스트 내한 공연 정보' +const DEFAULT_TITLE = '커밍' +const DEFAULT_OG_TITLE = '커밍 - Jpop 아티스트 내한 공연 정보' const DEFAULT_DESCRIPTION = 'Jpop 아티스트 내한 공연 정보를 한 곳에서 확인하세요. 공연 일정, 아티스트, 발매 소식을 통합 제공하는 커밍입니다.' const DEFAULT_URL = 'https://comingg.com' const DEFAULT_IMAGE = 'https://comingg.com/logo-transparent.png' @@ -23,7 +24,7 @@ export default function usePageMeta({ title, description, path, image }) { return () => { document.title = DEFAULT_TITLE - setMetaContent('og:title', DEFAULT_TITLE) + setMetaContent('og:title', DEFAULT_OG_TITLE) setMetaContent('og:description', DEFAULT_DESCRIPTION) setMetaContent('og:url', DEFAULT_URL) setMetaContent('og:image', DEFAULT_IMAGE)