Skip to content

Commit d6a82e8

Browse files
authored
fix: 홈대학 명칭 매칭 보강 및 대학 상세 미존재 폴백 처리 (#452)
1 parent 753a9ce commit d6a82e8

6 files changed

Lines changed: 55 additions & 14 deletions

File tree

apps/web/src/apis/universities/getSearchFilter.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useQuery } from "@tanstack/react-query";
22
import type { AxiosError } from "axios";
33
import { useMemo } from "react";
4+
import { isMatchedHomeUniversityName } from "@/constants/university";
45
import type { CountryCode, HomeUniversityName, LanguageTestType, ListUniversity } from "@/types/university";
56
import { QueryKeys } from "../queryKeys";
67
import { type SearchFilterResponse, universitiesApi } from "./api";
@@ -53,7 +54,9 @@ const useGetUniversitySearchByFilter = (
5354
// homeUniversityName으로 필터링
5455
const filteredData = useMemo(() => {
5556
if (!query.data || !homeUniversityName) return query.data;
56-
return query.data.filter((university) => university.homeUniversityName === homeUniversityName);
57+
return query.data.filter((university) =>
58+
isMatchedHomeUniversityName(university.homeUniversityName, homeUniversityName),
59+
);
5760
}, [query.data, homeUniversityName]);
5861

5962
return {

apps/web/src/apis/universities/getSearchText.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useQuery } from "@tanstack/react-query";
22

33
import type { AxiosError } from "axios";
44
import { useMemo } from "react";
5+
import { isMatchedHomeUniversityName } from "@/constants/university";
56
import type { HomeUniversityName, ListUniversity } from "@/types/university";
67
import { QueryKeys } from "../queryKeys";
78
import { type SearchTextResponse, universitiesApi } from "./api";
@@ -44,7 +45,9 @@ const useUniversitySearch = (searchValue: string, homeUniversityName?: HomeUnive
4445

4546
// homeUniversityName 필터링
4647
if (homeUniversityName) {
47-
filtered = filtered.filter((university) => university.homeUniversityName === homeUniversityName);
48+
filtered = filtered.filter((university) =>
49+
isMatchedHomeUniversityName(university.homeUniversityName, homeUniversityName),
50+
);
4851
}
4952

5053
// 검색어 필터링

apps/web/src/app/university/[homeUniversity]/[id]/_ui/UniversityDetailPreparingFallback.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@ import { IconSolidConnectionSmallLogo } from "@/public/svgs/my";
44

55
interface UniversityDetailPreparingFallbackProps {
66
backHref: string;
7+
title?: string;
8+
description?: string;
79
}
810

9-
const UniversityDetailPreparingFallback = ({ backHref }: UniversityDetailPreparingFallbackProps) => {
11+
const UniversityDetailPreparingFallback = ({
12+
backHref,
13+
title = "대학 정보를 준비중입니다.",
14+
description = "아직 데이터가 준비되지 않았어요. 잠시 후 다시 확인해주세요.",
15+
}: UniversityDetailPreparingFallbackProps) => {
1016
return (
1117
<div
1218
className="flex min-h-[calc(100vh-56px)] flex-col items-center justify-center px-5 pb-24 pt-20 text-center"
@@ -15,8 +21,8 @@ const UniversityDetailPreparingFallback = ({ backHref }: UniversityDetailPrepari
1521
aria-atomic="true"
1622
>
1723
<IconSolidConnectionSmallLogo />
18-
<p className="mt-3 text-k-700 typo-sb-9">대학 정보를 준비중입니다.</p>
19-
<p className="mt-1 text-k-400 typo-regular-3">아직 데이터가 준비되지 않았어요. 잠시 후 다시 확인해주세요.</p>
24+
<p className="mt-3 text-k-700 typo-sb-9">{title}</p>
25+
<p className="mt-1 text-k-400 typo-regular-3">{description}</p>
2026
<Link
2127
href={backHref}
2228
className="mt-5 rounded-full border border-k-200 bg-k-0 px-5 py-2 text-k-700 typo-sb-11 transition-colors hover:bg-k-50"

apps/web/src/app/university/[homeUniversity]/[id]/page.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { notFound } from "next/navigation";
33

44
import { getAllUniversities, getUniversityDetail, getUniversityDetailWithStatus } from "@/apis/universities/server";
55
import TopDetailNavigation from "@/components/layout/TopDetailNavigation";
6-
import { getHomeUniversityBySlug, HOME_UNIVERSITY_SLUGS } from "@/constants/university";
6+
import { getHomeUniversityBySlug, HOME_UNIVERSITY_SLUGS, isMatchedHomeUniversityName } from "@/constants/university";
77
import type { HomeUniversitySlug } from "@/types/university";
88

99
// UniversityDetail 컴포넌트
@@ -24,7 +24,9 @@ export async function generateStaticParams() {
2424
if (!homeUniversityInfo) continue;
2525

2626
// 해당 홈대학에 속하는 대학들만 필터링
27-
const filteredUniversities = universities.filter((uni) => uni.homeUniversityName === homeUniversityInfo.name);
27+
const filteredUniversities = universities.filter((uni) =>
28+
isMatchedHomeUniversityName(uni.homeUniversityName, homeUniversityInfo.name),
29+
);
2830

2931
for (const university of filteredUniversities) {
3032
params.push({
@@ -125,14 +127,18 @@ const CollegeDetailPage = async ({ params }: PageProps) => {
125127
const universityDetailResult = await getUniversityDetailWithStatus(collegeId);
126128

127129
if (!universityDetailResult.ok) {
128-
if (universityDetailResult.status === 404) {
129-
notFound();
130-
}
130+
const isNotFoundError = universityDetailResult.status === 404;
131131

132132
return (
133133
<>
134134
<TopDetailNavigation title="파견 학교 상세" backHref={`/university/${homeUniversity}`} />
135-
<UniversityDetailPreparingFallback backHref={`/university/${homeUniversity}`} />
135+
<UniversityDetailPreparingFallback
136+
backHref={`/university/${homeUniversity}`}
137+
title={isNotFoundError ? "해당 대학 정보를 찾을 수 없어요." : undefined}
138+
description={
139+
isNotFoundError ? "요청하신 파견학교를 찾지 못했습니다. 목록에서 다른 학교를 선택해 주세요." : undefined
140+
}
141+
/>
136142
</>
137143
);
138144
}

apps/web/src/app/university/[homeUniversity]/page.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { notFound } from "next/navigation";
33

44
import { getSearchUniversitiesAllRegions } from "@/apis/universities/server";
55
import TopDetailNavigation from "@/components/layout/TopDetailNavigation";
6-
import { getHomeUniversityBySlug, HOME_UNIVERSITY_SLUGS } from "@/constants/university";
6+
import { getHomeUniversityBySlug, HOME_UNIVERSITY_SLUGS, isMatchedHomeUniversityName } from "@/constants/university";
77
import type { HomeUniversitySlug } from "@/types/university";
88

99
import UniversityListContent from "./_ui/UniversityListContent";
@@ -55,8 +55,8 @@ const UniversityListPage = async ({ params }: PageProps) => {
5555
const allUniversities = await getSearchUniversitiesAllRegions();
5656

5757
// homeUniversityName으로 프론트에서 필터링
58-
const filteredUniversities = allUniversities.filter(
59-
(university) => university.homeUniversityName === universityInfo.name,
58+
const filteredUniversities = allUniversities.filter((university) =>
59+
isMatchedHomeUniversityName(university.homeUniversityName, universityInfo.name),
6060
);
6161

6262
return (

apps/web/src/constants/university.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,29 @@ export const getHomeUniversityBySlug = (slug: string): HomeUniversityInfo | unde
7575
return HOME_UNIVERSITY_LIST.find((uni) => uni.slug === slug);
7676
};
7777

78+
export const normalizeHomeUniversityName = (value: string | null | undefined): HomeUniversity | undefined => {
79+
if (!value) {
80+
return undefined;
81+
}
82+
83+
const normalized = value.trim();
84+
const matchedUniversity = HOME_UNIVERSITY_LIST.find(
85+
(university) => university.name === normalized || university.shortName === normalized,
86+
);
87+
88+
return matchedUniversity?.name;
89+
};
90+
91+
export const isMatchedHomeUniversityName = (
92+
left: string | null | undefined,
93+
right: string | null | undefined,
94+
): boolean => {
95+
const normalizedLeft = normalizeHomeUniversityName(left);
96+
const normalizedRight = normalizeHomeUniversityName(right);
97+
98+
return normalizedLeft !== undefined && normalizedRight !== undefined && normalizedLeft === normalizedRight;
99+
};
100+
78101
/**
79102
* 유효한 홈 대학교 슬러그 목록
80103
*/

0 commit comments

Comments
 (0)