Skip to content

Commit e666952

Browse files
manNomi한만욱
andauthored
Refactor/home (#206)
* fix : serverFetch 반환값이 더이상 error를 throw하지 않도록 수정했습니다 * refactor : home 페이지가 revalidate가 정상 작동하도록 수정했습니다 * refactor : 클라이언트 컴포넌트 분해했습니다 * refactor : home의 테일윈드 고정값 모두 수정했습니다 * refactor : 전체적인 홈페이지 개선했습니다 1. revalidate 작동하도록 isr로 수정했습니다 2. 컴포넌트 중 레거시 삭제 및 college -> university로 통일작업했습니다 3. 레거시 컴포넌트의 분리 및 테일윈드 값 PR 내용 반영하도록 했습니다 * refactor : 홈페이지의 추천 영역 react-query로 수정했습니다 * refactor : 레거시 삭제했습니다 * refactor : productuin 상태일때는 universities를 사용하도록 수정했습니다 * refactor : unoptimized 설정 삭제했습니다 * refactor : PR 내용 반영했습니다 --------- Co-authored-by: 한만욱 <manwook-han@hanman-ug-ui-MacBookPro.local>
1 parent 263e9ed commit e666952

File tree

40 files changed

+693
-748
lines changed

40 files changed

+693
-748
lines changed

next.config.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { withSentryConfig } from "@sentry/nextjs";
55
const nextConfig = {
66
swcMinify: true,
77
images: {
8-
unoptimized: true,
8+
// unoptimized: true,
99
domains: [
1010
"solid-connection.s3.ap-northeast-2.amazonaws.com",
1111
"solid-connection-uploaded.s3.ap-northeast-2.amazonaws.com",

package-lock.json

Lines changed: 55 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
"@radix-ui/react-select": "^2.1.6",
1818
"@react-google-maps/api": "^2.19.2",
1919
"@sentry/nextjs": "^7.107.0",
20+
"@tanstack/react-query": "^5.84.1",
21+
"@tanstack/react-query-devtools": "^5.84.1",
2022
"axios": "^1.6.7",
2123
"class-variance-authority": "^0.7.1",
2224
"clsx": "^2.1.1",

sentry.client.config.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ Sentry.init({
77

88
integrations: [
99
Sentry.browserTracingIntegration({
10-
tracePropagationTargets: ["localhost", /^https:\/\/(www\.)?solid\-connection\.com/],
10+
tracePropagationTargets: [
11+
"localhost",
12+
"solid-connection.com",
13+
"solid-connect-web",
14+
"solid-connect",
15+
/^https:\/\/(www\.)?solid[\-]?connection\.com/,
16+
],
1117
}),
1218
Sentry.replayIntegration({
1319
maskAllText: true,

src/api/university.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { axiosInstance, publicAxiosInstance } from "@/utils/axiosInstance";
44

55
import {
66
ListUniversity,
7-
RecommendedUniversitiesResponse,
87
RegionEnum,
98
University,
109
UniversityFavoriteResponse,
@@ -37,6 +36,3 @@ export const deleteUniversityFavoriteApi = (
3736
universityInfoForApplyId: number,
3837
): Promise<AxiosResponse<UniversityFavoriteResponse>> =>
3938
axiosInstance.delete(`/universities/${universityInfoForApplyId}/like`);
40-
41-
export const getRecommendedUniversitiesApi = (): Promise<AxiosResponse<RecommendedUniversitiesResponse>> =>
42-
axiosInstance.get("/universities/recommend");
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { axiosInstance, publicAxiosInstance } from "@/utils/axiosInstance";
2+
3+
import { RecommendedUniversityResponse } from "../type/response";
4+
5+
import { useQuery } from "@tanstack/react-query";
6+
7+
const getRecommendedUniversity = async ({
8+
queryKey,
9+
}: {
10+
queryKey: [string, boolean];
11+
}): Promise<RecommendedUniversityResponse> => {
12+
const endpoint = process.env.NODE_ENV === "development" ? "/univ-apply-infos/recommend" : "/universities/recommend";
13+
14+
const [, isLogin] = queryKey;
15+
const instance = isLogin ? axiosInstance : publicAxiosInstance;
16+
const res = await instance.get(endpoint);
17+
return res.data;
18+
};
19+
20+
const useGetRecommendedUniversity = (isLogin: boolean) =>
21+
useQuery({
22+
queryKey: ["recommended-university", isLogin],
23+
queryFn: getRecommendedUniversity,
24+
enabled: isLogin, // 쿼리는 로그인 상태일 때만 활성화
25+
staleTime: 1000 * 60 * 5,
26+
});
27+
28+
export default useGetRecommendedUniversity;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import serverFetch from "@/utils/serverFetchUtil";
2+
3+
import { RecommendedUniversityResponse } from "../type/response";
4+
5+
const getRecommendedUniversity = async () => {
6+
const endpoint = process.env.NODE_ENV === "development" ? "/univ-apply-infos/recommend" : "/universities/recommend";
7+
8+
const res = await serverFetch<RecommendedUniversityResponse>(endpoint, {
9+
isAuth: false, // 인증이 필요 없는 API로 설정
10+
});
11+
return res;
12+
};
13+
14+
export default getRecommendedUniversity;
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import serverFetch from "@/utils/serverFetchUtil";
2+
3+
import { SearchUniversityListResponse } from "../type/response";
4+
5+
import { AllRegionsUniversityList, RegionEnum, RegionEnumExtend } from "@/types/university";
6+
7+
/**
8+
* 검색 파라미터 정의
9+
*/
10+
interface SearchParams {
11+
region?: RegionEnum | null;
12+
keyword?: string;
13+
testType?: string;
14+
testScore?: string;
15+
}
16+
17+
/**
18+
* 단일 권역 또는 조건별 대학 검색 API
19+
* - 기본 경로: /univ-apply-infos/search
20+
* - 필요 시 query string 을 동적으로 붙인다.
21+
*/
22+
const getSearchUniversityList = async ({ region, keyword, testType, testScore }: SearchParams = {}) => {
23+
const endpoint = process.env.NODE_ENV === "development" ? "/univ-apply-infos/search" : "/universities/search";
24+
25+
const params = new URLSearchParams();
26+
27+
if (region) params.append("region", region);
28+
if (keyword) params.append("keyword", keyword);
29+
if (testType) params.append("testType", testType);
30+
if (testScore) params.append("testScore", testScore);
31+
32+
const url = params.size ? `${endpoint}?${params.toString()}` : endpoint;
33+
34+
return serverFetch<SearchUniversityListResponse>(url, { isAuth: false });
35+
};
36+
37+
/**
38+
* 전체·미주·유럽·아시아·중국 데이터를 병렬로 가져와
39+
* Record<RegionEnumExtend, ListUniversity[]> 형태로 반환한다.
40+
*/
41+
export async function getAllRegionsUniversityList(): Promise<AllRegionsUniversityList> {
42+
const regionOrder: (RegionEnum | null)[] = [
43+
null,
44+
RegionEnum.AMERICAS,
45+
RegionEnum.EUROPE,
46+
RegionEnum.ASIA,
47+
RegionEnum.CHINA,
48+
];
49+
50+
// ALL(전체)은 region 파라미터를 넘기지 않는다.
51+
const responses = await Promise.all(regionOrder.map((region) => getSearchUniversityList({ region })));
52+
53+
const regionEnumExtendedOrder: RegionEnumExtend[] = [
54+
RegionEnumExtend.ALL,
55+
RegionEnumExtend.AMERICAS,
56+
RegionEnumExtend.EUROPE,
57+
RegionEnumExtend.ASIA,
58+
RegionEnumExtend.CHINA,
59+
];
60+
61+
return regionEnumExtendedOrder.reduce((acc, key, idx) => {
62+
const response = responses[idx];
63+
acc[key] = response.ok ? response.data : [];
64+
return acc;
65+
}, {} as AllRegionsUniversityList);
66+
}
67+
68+
export default getSearchUniversityList;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { AllRegionsUniversityList, ListUniversity } from "@/types/university";
2+
3+
export type RecommendedUniversityResponse = { recommendedUniversities: ListUniversity[] };
4+
5+
export type SearchUniversityListResponse = ListUniversity[];
6+
7+
export type AllRegionsUniversityListResponse = AllRegionsUniversityList;

src/app/Home.tsx

Lines changed: 0 additions & 158 deletions
This file was deleted.

0 commit comments

Comments
 (0)