Project Name
Epiday (에피데이)
코드잇(주)에서 제공받은 기획안, 디자인 시안, 백엔드 서버 스웨거 문서를 기반으로 프론트엔드 개발 진행
(프론트엔드 개발 기여도 100%)



App Router를 사용하여 SSR와 CSR을 혼합해 페이지 렌더링과 네비게이션 최적화
정적 타입 시스템을 도입하여 코드의 가독성과 유지보수성 강화
사용자 인증 관리 및 보안성 강화
API 데이터 호출 및 캐싱, 상태 관리
전역 상태 관리 (모달과 토스트)
사용자 입력 검증 및 상태 관리 (로그인, 회원가입 및 Epiday 작성 폼)
유틸리티 기반의 CSS 프레임워크로 빠르고 효율적인 스타일링 구현
Next.js 페이지에 아이콘 추가
달력 컴포넌트
감정 차트 데이터 시각화
프로필 이미지 편집 (확대 및 위치 조정 가능)
프로젝트 배포 및 관리
export const queryKeys = {
epiday: {
allEpidays: ['epidays'],
epidays: (limit: number) => ['epidays', { limit }],
epidayForToday: (date: string) => ['epidays', 'today', { date }],
epidaysBySearchKeyword: (keyword: string) => ['epidays', 'search', { keyword }],
epidayDetails: (id: number) => ['epidays', 'detail', { id }],
myEpidays: ['epidays', 'my'],
},
emotionLog: {
allEmotionLogs: ['emotionLogs'],
emotionLogForToday: ['emotionLogs', 'today'],
emotionLogsForMonth: (year: number, month: number) => ['emotionLogs', 'month', { year, month }],
},
comment: {
allComments: ['comments'],
comments: (limit: number) => ['comments', { limit }],
commentsForEpiday: (epidayId: number) => ['comments', 'epiday', { epidayId }],
myComments: ['comments', 'my'],
},
};
const likeMutation = useMutation({
mutationFn: () => {
return isLiked ? deleteLike(session, id) : postLike(session, id);
},
onMutate: async () => {
await queryClient.cancelQueries({ queryKey: queryKeys.epiday.epidayDetails(id) });
const prevEpidayDetails = queryClient.getQueryData(queryKeys.epiday.epidayDetails(id));
queryClient.setQueryData(queryKeys.epiday.epidayDetails(id), (oldData: GetEpidayData) => ({
...oldData,
likeCount: oldData.isLiked ? oldData.likeCount - 1 : oldData.likeCount + 1,
isLiked: !oldData.isLiked,
}));
return { prevEpidayDetails };
},
onError: (error, _, context) => {
showToast({ message: error.message, type: 'error' });
queryClient.setQueryData(queryKeys.epiday.epidayDetails(id), context.prevEpidayDetails);
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: queryKeys.epiday.epidayDetails(id) });
},
});








