From a7bc0f1d93586cceff61a6f5e602cfab15dda3ba Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 19 Jan 2026 18:04:33 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20Award=20=EB=A0=8C=EB=8D=94=EB=A7=81?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20semesterTerm=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=A7=80=EC=9B=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - API 응답에서 semesterTerm 필드를 사용하지만 코드에서는 semester 필드만 체크하여 렌더링 실패 - formatSemesterLabel과 getAwardKey에서 semesterTerm과 semester 두 필드명 모두 지원하도록 수정 - null/undefined 안전성을 위해 옵셔널 체이닝 적용 - 모든 테스트 통과 확인 --- frontend/src/utils/awardHelpers.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/src/utils/awardHelpers.ts b/frontend/src/utils/awardHelpers.ts index 849f64ef..a005d891 100644 --- a/frontend/src/utils/awardHelpers.ts +++ b/frontend/src/utils/awardHelpers.ts @@ -1,13 +1,17 @@ import { Award, SemesterTerm } from '@/types/club'; export const formatSemesterLabel = (award: Award): string | null => { - if (award?.year && award?.semester) { + const semesterValue = (award as any)?.semesterTerm || award?.semester; + + if (award?.year && semesterValue) { const semesterLabel = - award.semester === SemesterTerm.FIRST ? '1학기' : '2학기'; + semesterValue === SemesterTerm.FIRST ? '1학기' : '2학기'; return `${award.year} ${semesterLabel}`; } return null; }; -export const getAwardKey = (award: Award, index: number): string => - `${award.year}-${award.semester}-${index}`; +export const getAwardKey = (award: Award, index: number): string => { + const semesterValue = (award as any)?.semesterTerm || award?.semester; + return `${award.year}-${semesterValue}-${index}`; +}; From d48c13bfda63ec9312b7294c9fcb55def814a229 Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 19 Jan 2026 18:10:16 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20semester=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/types/club.ts | 2 +- frontend/src/utils/awardHelpers.test.ts | 12 ++++++------ frontend/src/utils/awardHelpers.ts | 12 ++++-------- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/frontend/src/types/club.ts b/frontend/src/types/club.ts index 08d171de..0f32efbb 100644 --- a/frontend/src/types/club.ts +++ b/frontend/src/types/club.ts @@ -50,7 +50,7 @@ export type SemesterTermType = (typeof SemesterTerm)[keyof typeof SemesterTerm]; export interface Award { year: number; - semester: SemesterTermType; + semesterTerm: SemesterTermType; achievements: string[]; } diff --git a/frontend/src/utils/awardHelpers.test.ts b/frontend/src/utils/awardHelpers.test.ts index a62aa2f2..19b3fc1c 100644 --- a/frontend/src/utils/awardHelpers.test.ts +++ b/frontend/src/utils/awardHelpers.test.ts @@ -4,11 +4,11 @@ import { formatSemesterLabel, getAwardKey } from './awardHelpers'; describe('awardHelpers', () => { const createAward = ( year: number, - semester: SemesterTermType, + semesterTerm: SemesterTermType, achievements: string[] = [], ): Award => ({ year, - semester, + semesterTerm, achievements, }); @@ -28,14 +28,14 @@ describe('awardHelpers', () => { it('year가 없으면 null을 반환해야 한다', () => { const award: Partial = { - semester: SemesterTerm.FIRST, + semesterTerm: SemesterTerm.FIRST, achievements: [], }; expect(formatSemesterLabel(award as Award)).toBeNull(); }); - it('semester가 없으면 null을 반환해야 한다', () => { + it('semesterTerm이 없으면 null을 반환해야 한다', () => { const award: Partial = { year: 2024, achievements: [], @@ -44,7 +44,7 @@ describe('awardHelpers', () => { expect(formatSemesterLabel(award as Award)).toBeNull(); }); - it('year와 semester가 모두 없으면 null을 반환해야 한다', () => { + it('year와 semesterTerm이 모두 없으면 null을 반환해야 한다', () => { const award: Partial = { achievements: [], }; @@ -67,7 +67,7 @@ describe('awardHelpers', () => { }); describe('getAwardKey', () => { - it('year, semester, index를 조합한 고유 키를 생성해야 한다', () => { + it('year, semesterTerm, index를 조합한 고유 키를 생성해야 한다', () => { expect(getAwardKey(validAward2024First, 0)).toBe('2024-FIRST-0'); }); diff --git a/frontend/src/utils/awardHelpers.ts b/frontend/src/utils/awardHelpers.ts index a005d891..ebbc8ae1 100644 --- a/frontend/src/utils/awardHelpers.ts +++ b/frontend/src/utils/awardHelpers.ts @@ -1,17 +1,13 @@ import { Award, SemesterTerm } from '@/types/club'; export const formatSemesterLabel = (award: Award): string | null => { - const semesterValue = (award as any)?.semesterTerm || award?.semester; - - if (award?.year && semesterValue) { + if (award?.year && award?.semesterTerm) { const semesterLabel = - semesterValue === SemesterTerm.FIRST ? '1학기' : '2학기'; + award.semesterTerm === SemesterTerm.FIRST ? '1학기' : '2학기'; return `${award.year} ${semesterLabel}`; } return null; }; -export const getAwardKey = (award: Award, index: number): string => { - const semesterValue = (award as any)?.semesterTerm || award?.semester; - return `${award.year}-${semesterValue}-${index}`; -}; +export const getAwardKey = (award: Award, index: number): string => + `${award.year}-${award.semesterTerm}-${index}`; From 4d24934f26b64fcf2e2db13126e2843b926981a4 Mon Sep 17 00:00:00 2001 From: seongwon seo Date: Mon, 19 Jan 2026 18:14:06 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20Award=20=ED=95=84=EB=93=9C=EB=AA=85?= =?UTF-8?q?=20semester=20=E2=86=92=20semesterTerm=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AwardEditor.tsx의 모든 참조 수정 --- .../components/AwardEditor/AwardEditor.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx index 647490e0..57c89d9c 100644 --- a/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx +++ b/frontend/src/pages/AdminPage/tabs/ClubIntroEditTab/components/AwardEditor/AwardEditor.tsx @@ -13,13 +13,13 @@ interface AwardEditorProps { const START_YEAR = 2020; const getSemesterSortValue = (award: Award): number => { - const semesterValue = award.semester === SemesterTerm.FIRST ? 1 : 2; + const semesterValue = award.semesterTerm === SemesterTerm.FIRST ? 1 : 2; return award.year * 10 + semesterValue; }; const formatSemesterLabel = (award: Award): string => { const semesterLabel = - award.semester === SemesterTerm.FIRST ? '1학기' : '2학기'; + award.semesterTerm === SemesterTerm.FIRST ? '1학기' : '2학기'; return `${award.year} ${semesterLabel}`; }; @@ -58,13 +58,13 @@ const AwardEditor = ({ awards, onChange }: AwardEditorProps) => { ); const getAwardKey = (award: Award, index: number): string => - `${award.year}-${award.semester}-${index}`; + `${award.year}-${award.semesterTerm}-${index}`; const handleAddSemester = () => { const year = parseInt(selectedYear, 10); const isDuplicate = awards.some( - (award) => award.year === year && award.semester === selectedSemester, + (award) => award.year === year && award.semesterTerm === selectedSemester, ); if (isDuplicate) { alert('이미 추가된 학기입니다.'); @@ -73,7 +73,7 @@ const AwardEditor = ({ awards, onChange }: AwardEditorProps) => { const newAward: Award = { year, - semester: selectedSemester, + semesterTerm: selectedSemester, achievements: [''], }; @@ -221,7 +221,7 @@ const AwardEditor = ({ awards, onChange }: AwardEditorProps) => { const originalIndex = awards.findIndex( (originalAward, idx) => originalAward.year === award.year && - originalAward.semester === award.semester && + originalAward.semesterTerm === award.semesterTerm && originalAward.achievements === award.achievements, ); const awardKey = getAwardKey(award, originalIndex);