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 (
<>
+