diff --git a/src/app/university/[id]/InfoSection.tsx b/src/app/university/[id]/_ui/UniversityDetail/_ui/InfoSection.tsx similarity index 100% rename from src/app/university/[id]/InfoSection.tsx rename to src/app/university/[id]/_ui/UniversityDetail/_ui/InfoSection.tsx diff --git a/src/app/university/[id]/LanguageSection.tsx b/src/app/university/[id]/_ui/UniversityDetail/_ui/LanguageSection.tsx similarity index 100% rename from src/app/university/[id]/LanguageSection.tsx rename to src/app/university/[id]/_ui/UniversityDetail/_ui/LanguageSection.tsx diff --git a/src/app/university/[id]/MapSection.tsx b/src/app/university/[id]/_ui/UniversityDetail/_ui/MapSection.tsx similarity index 100% rename from src/app/university/[id]/MapSection.tsx rename to src/app/university/[id]/_ui/UniversityDetail/_ui/MapSection.tsx diff --git a/src/app/university/[id]/TitleSection.tsx b/src/app/university/[id]/_ui/UniversityDetail/_ui/TitleSection.tsx similarity index 90% rename from src/app/university/[id]/TitleSection.tsx rename to src/app/university/[id]/_ui/UniversityDetail/_ui/TitleSection.tsx index c7bcdaef..c28bd19f 100644 --- a/src/app/university/[id]/TitleSection.tsx +++ b/src/app/university/[id]/_ui/UniversityDetail/_ui/TitleSection.tsx @@ -13,7 +13,7 @@ const TitleSection = ({ logoUrl, title, subTitle }: TitleSectionProps) => { 대학 로고
{title} - {subTitle} + {subTitle}
diff --git a/src/app/university/[id]/UniversityBtns.tsx b/src/app/university/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx similarity index 100% rename from src/app/university/[id]/UniversityBtns.tsx rename to src/app/university/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx diff --git a/src/app/university/[id]/UniversityDetail.tsx b/src/app/university/[id]/_ui/UniversityDetail/index.tsx similarity index 75% rename from src/app/university/[id]/UniversityDetail.tsx rename to src/app/university/[id]/_ui/UniversityDetail/index.tsx index 84db0ac1..af77a6ef 100644 --- a/src/app/university/[id]/UniversityDetail.tsx +++ b/src/app/university/[id]/_ui/UniversityDetail/index.tsx @@ -4,11 +4,11 @@ import { convertImageUrl } from "@/utils/fileUtils"; import LinkifyText from "@/components/ui/LinkifyText"; -import InfoSection from "./InfoSection"; -import LanguageSection from "./LanguageSection"; -import MapSection from "./MapSection"; -import TitleSection from "./TitleSection"; -import UniversityBtns from "./UniversityBtns"; +import InfoSection from "../InfoSection"; +import LanguageSection from "../LanguageSection"; +import MapSection from "../MapSection"; +import TitleSection from "../TitleSection"; +import UniversityBtns from "../UniversityBtns"; import { University } from "@/types/university"; @@ -35,11 +35,9 @@ const UniversityDetail = ({ university, koreanName }: UniversityDetailProps) => /> {/* TODO: totalDispatchCount 추가시 연동, 나라에 국기 추가 */}
- {}0회 파견 - {university.country} - - 모집 {university.studentCapacity}명 - + {}0회 파견 + {university.country} + 모집 {university.studentCapacity}명
/>
-
전공상세
-
+
전공상세
+
{university?.detailsForMajor}
-
영어강의 리스트
+
영어강의 리스트
- + {university?.detailsForEnglishCourse}
diff --git a/src/app/university/[id]/page.tsx b/src/app/university/[id]/page.tsx index 5ae9c940..30a26293 100644 --- a/src/app/university/[id]/page.tsx +++ b/src/app/university/[id]/page.tsx @@ -1,12 +1,12 @@ -import { Metadata, ResolvingMetadata } from "next"; +import { Metadata } from "next"; import { notFound } from "next/navigation"; import TopDetailNavigation from "@/components/layout/TopDetailNavigation"; -import UniversityDetail from "./UniversityDetail"; +import UniversityDetail from "./_ui/UniversityDetail"; -import { getUniversityDetail } from "@/api/university/server/getUniversityDetail"; import { getAllUniversities } from "@/api/university/server/getSearchUniversitiesByText"; +import { getUniversityDetail } from "@/api/university/server/getUniversityDetail"; export const revalidate = false; @@ -22,10 +22,7 @@ type MetadataProps = { params: Promise<{ id: string }>; }; -export async function generateMetadata( - { params }: MetadataProps, - _parent: ResolvingMetadata, -): Promise { +export async function generateMetadata({ params }: MetadataProps): Promise { const { id } = await params; const universityData = await getUniversityDetail(Number(id)); @@ -41,8 +38,51 @@ export async function generateMetadata( ? `${universityData.koreanName}(${universityData.term})` : universityData.koreanName; + const baseUrl = process.env.NEXT_PUBLIC_WEB_URL || "https://solid-connection.com"; + const pageUrl = `${baseUrl}/university/${id}`; + const imageUrl = universityData.backgroundImageUrl + ? universityData.backgroundImageUrl.startsWith("http") + ? universityData.backgroundImageUrl + : `${baseUrl}${universityData.backgroundImageUrl}` + : `${baseUrl}/images/article-thumb.png`; + + // [나라] 교환학생 키워드 생성 + const countryExchangeKeyword = `${universityData.country} 교환학생`; + + // Description 생성: 대학교 이름과 [나라] 교환학생 키워드 포함 + const description = `${convertedKoreanName}(${universityData.englishName}) ${countryExchangeKeyword} 프로그램. 모집인원 ${universityData.studentCapacity}명. 솔리드커넥션에서 ${convertedKoreanName} ${countryExchangeKeyword} 지원 정보 확인.`; + + // Title 생성: 대학교 이름과 [나라] 교환학생 키워드 포함 (검색 최적화) + const title = `${convertedKoreanName} - ${countryExchangeKeyword} 정보 | 솔리드커넥션`; + return { - title: convertedKoreanName, + title, + description, + openGraph: { + title, + description, + url: pageUrl, + siteName: "솔리드커넥션", + images: [ + { + url: imageUrl, + width: 1200, + height: 630, + alt: `${convertedKoreanName} 대학 이미지`, + }, + ], + locale: "ko_KR", + type: "website", + }, + twitter: { + card: "summary_large_image", + title, + description, + images: [imageUrl], + }, + alternates: { + canonical: pageUrl, + }, }; } @@ -64,8 +104,38 @@ const CollegeDetailPage = async ({ params }: CollegeDetailPageProps) => { ? `${universityData.koreanName}(${universityData.term})` : universityData.koreanName; + const baseUrl = process.env.NEXT_PUBLIC_WEB_URL || "https://solid-connection.com"; + const pageUrl = `${baseUrl}/university/${collegeId}`; + + // [나라] 교환학생 키워드 생성 + const countryExchangeKeyword = `${universityData.country} 교환학생`; + + // Structured Data (JSON-LD) for SEO - 검색 엔진이 대학 정보를 더 잘 이해하도록 + const structuredData: { + "@context": string; + "@type": string; + name: string; + alternateName?: string; + url: string; + description: string; + image: string; + } = { + "@context": "https://schema.org", + "@type": "EducationalOrganization", + name: convertedKoreanName, + alternateName: universityData.englishName, + url: pageUrl, + description: `${convertedKoreanName}(${universityData.englishName}) ${countryExchangeKeyword} 프로그램 정보`, + image: universityData.backgroundImageUrl + ? universityData.backgroundImageUrl.startsWith("http") + ? universityData.backgroundImageUrl + : `${baseUrl}${universityData.backgroundImageUrl}` + : `${baseUrl}/images/article-thumb.png`, + }; + return ( <> +