diff --git a/README.md b/README.md new file mode 100644 index 000000000..85f336b25 --- /dev/null +++ b/README.md @@ -0,0 +1,172 @@ +![Image](https://github.com/user-attachments/assets/c187ba17-cd04-442c-92e4-4a9ca3579af0) + +
+ +## ๐Ÿฃ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ + +**์„ฑ์žฅํ˜• ์ทจ์—… ์ค€๋น„ ์„œ๋น„์Šค, Chick Mate** +

+Chick Mate์˜ ๋Œ€ํ‘œ ์บ๋ฆญํ„ฐ ์นฐ์นฐ์ด์™€ ํ•จ๊ป˜ AI ๋ฉด์ ‘๊ด€์„ ํ†ตํ•ด ๋ฉด์ ‘์„ ์—ฐ์Šตํ•˜๋Š” ์„ฑ์žฅํ˜• ๋ฉด์ ‘ ์ค€๋น„ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. +๋ฉด์ ‘์„ ์ค€๋น„ํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๋Š” ์ทจ์—…ยท์ด์ง ์ค€๋น„์ƒ์ด ๊ฐ์ž์— ๋งž๋Š” ์—ญ๋Ÿ‰์„ ํ‚ค์šธ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. + +> - **์ž‘์—… ๊ธฐ๊ฐ„** : 2025. 03. 20 ~ 2025. 04. 30 +> - **๋ฐฐํฌ ์ฃผ์†Œ** : www.chickmate.site + +## ๐Ÿฅ ํ”„๋กœ์ ํŠธ ๋ฉค๋ฒ„ ์†Œ๊ฐœ + + + + + + + + + + + + + + + + + + + + + + +
+ + choichangyeon
+ choichangyeon +
+
+ + parkminjo
+ parkminjo +
+
+ + Hye10
+ Hye10 +
+
+ ๋‹ด๋‹น
+ AI ์„ ํƒ ํŽ˜์ด์ง€
+ ๋งž์ถค ์ฑ„์šฉ ๊ณต๊ณ  ํŽ˜์ด์ง€ +
+ ๋‹ด๋‹น
+ AI ์ง„ํ–‰ ํŽ˜์ด์ง€
+ ์ž์†Œ์„œ ์ž‘์„ฑ ํŽ˜์ด์ง€ +
+ ๋‹ด๋‹น
+ ๋ Œ๋”ฉ/์˜จ๋ณด๋”ฉ ํŽ˜์ด์ง€
+ ๋งˆ์ดํŽ˜์ด์ง€ ๋ฉด์ ‘ ๊ธฐ๋ก ๋ฐ ํƒญ ๊ด€๋ฆฌ
+ middleware ๊ด€๋ฆฌ +
+ + ImJaeOne
+ ImJaeOne +
+
+ + minchulpack
+ minchulpack +
+
+ ๋‹ด๋‹น
+ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€
+ ์บ๋ฆญํ„ฐ ๋ฐ ๊ฒฝํ—˜์น˜ ๊ด€๋ฆฌ
+ ๋งˆ์ดํŽ˜์ด์ง€ ๋ฉด์ ‘ ๊ธฐ๋ก
+
+ ๋‹ด๋‹น
+ ์ „์ฒด UI ๋””์ž์ธ
+
+ +
+ +## โš™ ํ”„๋กœ์ ํŠธ ๊ธฐ๋Šฅ ์†Œ๊ฐœ + +- **Next.js ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜**์ž…๋‹ˆ๋‹ค. +- **Zustand**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์บ๋ฆญํ„ฐ ID์™€ ๋ชจ๋‹ฌ ID ์ƒํƒœ๋ฅผ ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. +- **TanStack Query**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ € ์ •๋ณด, ์บ๋ฆญํ„ฐ, ์ž์†Œ์„œ, ์ฒด์šฉ ๊ณต๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์š”์ฒญํ•˜๊ณ , ์บ์‹ฑ๊ณผ ์ฟผ๋ฆฌ ๋ฌดํšจํ™”๋ฅผ ํ†ตํ•ด ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Prisma**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **DB ์Šคํ‚ค๋งˆ๋ฅผ ์„ค๊ณ„**ํ•˜๊ณ , ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. +- **Route Handler**๋ฅผ ์ด์šฉํ•˜์—ฌ RESTful API๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. +- **์ด๋ฉ”์ผ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ**๊ณผ **๊ตฌ๊ธ€/์นด์นด์˜ค ๊ธฐ๋ฐ˜ ์†Œ์…œ ๋กœ๊ทธ์ธ**์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. +- **ํšŒ์› ์ •๋ณด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ**๋ฅผ ํ†ตํ•ด ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- **Tailwind CSS**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. +- **Vercel**์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์œผ๋กœ ๋ฐฐํฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. + +
+ +## ๐Ÿ”— ํ˜‘์—… ํ”„๋กœ์„ธ์Šค + +- ### ํŽ˜์ด์ง€ ๋‹จ์œ„ ์ž‘์—… ๊ด€๋ฆฌ + - [๊ฐ ํŽ˜์ด์ง€๋ณ„ ์ด์Šˆ](https://github.com/BEST-L2CP/ChickMate/issues?q=is%3Aissue%20state%3Aclosed) ์ƒ์„ฑ + - ํŽ˜์ด์ง€๋ณ„ feature ๋ธŒ๋žœ์น˜ ์šด์˜ (`feat/#์ด์Šˆ๋ฒˆํ˜ธ-์ด์Šˆ๋ช…`, `refactor/#์ด์Šˆ๋ฒˆํ˜ธ-์ด์Šˆ๋ช…`) +- ### [Pull Request ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ](https://github.com/BEST-L2CP/ChickMate/pulls?q=is%3Apr+is%3Aclosed) + +
+ +## ๐Ÿ—ฃ๏ธ ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ • ๊ณผ์ • + +- #### [[Git] Git branch ์ „๋žต ์„ค์ •](https://chickmate.palms.blog/changyon99-1) +- #### [[ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ] ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ ๊ณผ์ •](https://chickmate.palms.blog/minjo-1) +- #### [[TypeScript] type ๋ณ„์นญ vs interface ์–ด๋–ค ๊ฑธ ์“ธ๊นŒ์š”?](https://chickmate.palms.blog/dhye-1) + +
+ +## ๐Ÿš€ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… + +- #### [[์ผ๋ฐ˜ ๋กœ๊ทธ์ธ] ์ผ๋ฐ˜ ๋กœ๊ทธ์ธ ํ›„ ์„ธ์…˜์ด ๋ฐ”๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ์ด์œ ](https://chickmate.palms.blog/jaeone-5) +- #### [[์†Œ์…œ ๋กœ๊ทธ์ธ] ์†Œ์…œ ๋กœ๊ทธ์ธ๋งŒ ์•ˆ๋˜๋Š” ์ด์œ ?](https://chickmate.palms.blog/jaeone-1) +- #### [[API ํ†ต์‹ ] NextResponse.json()์—์„œ status๋ฅผ ์ œ๋Œ€๋กœ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ์ƒ๊ธฐ๋Š” ์ผ](https://chickmate.palms.blog/jaeone-3) +- #### [[API ํ†ต์‹ ] RESTful API๋ž€?](https://chickmate.palms.blog/jaeone-7) +- #### [[ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ] ๋ชจ๋‹ฌ์„ ์ „์—ญ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ](https://chickmate.palms.blog/minjo-2) +- #### [[React Hook] React ์กฐ๊ฑด๋ถ€ Hook ํ˜ธ์ถœ](https://chickmate.palms.blog/changyon99-4) +- #### [[Tailwind CSS] tailwindcss + clsx ๋™์  ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์•„์š”](https://chickmate.palms.blog/dhye-2) +- #### [[Sentry] Sentry๋กœ ์˜ค๋ฅ˜ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•](https://chickmate.palms.blog/jaeone-4) + +
+ +## ๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ + +```markdown +๐Ÿ“ public // ์ •์  ํŒŒ์ผ ๊ด€๋ฆฌ +๐Ÿ“ src +โ”ฃ ๐Ÿ“ app // page, Route Handler์˜ ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ๊ด€๋ฆฌ +โ”ฃ ๐Ÿ“ components // ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ด€๋ฆฌ +โ”ฃ ๐Ÿ“ constants // ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ƒ์ˆ˜๋ฅผ ๊ด€๋ฆฌ +โ”ฃ ๐Ÿ“ features // ๊ฐ ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ๋ณ„ ๊ด€๋ฆฌ (api, hooks, utils, components ๋“ฑ ํฌํ•จ) +โ”ฃ ๐Ÿ“ hooks // ํŽ˜์ด์ง€ ๋‚ด๋ถ€์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ปค์Šคํ… ํ›…์„ ๊ด€๋ฆฌ +โ”ฃ ๐Ÿ“ lib // ๊ณต์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •, ์œ ํ‹ธ ํ•จ์ˆ˜ +โ”ฃ ๐Ÿ“ provider // root์— ์ ์šฉํ•˜๋Š” Provider ๊ด€๋ฆฌ +โ”ฃ ๐Ÿ“ store // zustand stroe ๊ด€๋ฆฌ +โ”ฃ ๐Ÿ“ styles // css style ๊ด€๋ฆฌ +โ”ฃ ๐Ÿ“ types // type alias ๊ด€๋ฆฌ +โ”ฃ ๐Ÿ“ utils // ๊ณตํ†ต ์œ ํ‹ธ ํ•จ์ˆ˜ ๊ด€๋ฆฌ +โ”— middleware.ts +``` + +
+ +## ๐Ÿงถ ๊ธฐ์ˆ  ์Šคํƒ + +
+ +## Frontend + +
+ +## Backend + + + + +## Deployment + +
+ +## Collaboration + +
diff --git a/src/app/api/resume/route.ts b/src/app/api/resume/route.ts index 8cb83981b..c6e4103ce 100644 --- a/src/app/api/resume/route.ts +++ b/src/app/api/resume/route.ts @@ -35,10 +35,6 @@ export const GET = async (request: NextRequest) => { }, }); - if (!response) { - return NextResponse.json({ message: NOT_FOUND }, { status: 404 }); - } - return NextResponse.json({ response }, { status: 200 }); } catch (error) { return NextResponse.json({ message: GET_SERVER_ERROR }, { status: 500 }); diff --git a/src/features/bookmark-selected/bookmark-selected-list.tsx b/src/features/bookmark-selected/bookmark-selected-list.tsx index ab82f3f9d..52857a28c 100644 --- a/src/features/bookmark-selected/bookmark-selected-list.tsx +++ b/src/features/bookmark-selected/bookmark-selected-list.tsx @@ -20,11 +20,11 @@ const BookmarkSelectedList = () => { const targetRef = useInfiniteScroll({ fetchNextPage, hasNextPage }); - if (!userId) return ; + if (!userId) return; if (isPending || status === 'loading') { return ( -
+
); diff --git a/src/features/character/character-detail-modal.tsx b/src/features/character/character-detail-modal.tsx index 28736dddc..351072c79 100644 --- a/src/features/character/character-detail-modal.tsx +++ b/src/features/character/character-detail-modal.tsx @@ -26,7 +26,7 @@ const CharacterDetailModal = ({ session }: Props) => { if (isPending) { return ( -
+
); diff --git a/src/features/interview-history/interview-history-list.tsx b/src/features/interview-history/interview-history-list.tsx index c2166de3b..ebd6d1c9a 100644 --- a/src/features/interview-history/interview-history-list.tsx +++ b/src/features/interview-history/interview-history-list.tsx @@ -32,7 +32,7 @@ const InterviewHistoryList = () => { if (isPending) return ( -
+
); diff --git a/src/features/interview/resume-all-modal.tsx b/src/features/interview/resume-all-modal.tsx index 02ec35169..91d276a23 100644 --- a/src/features/interview/resume-all-modal.tsx +++ b/src/features/interview/resume-all-modal.tsx @@ -58,7 +58,6 @@ const ResumeAllModal = () => { setResume(resume.id); toggleModal(ALL_RESUME_LIST); }} - hrOption={false} /> ); })} diff --git a/src/features/interview/resume-cards-box.tsx b/src/features/interview/resume-cards-box.tsx index 49d3b007b..3b58ff11d 100644 --- a/src/features/interview/resume-cards-box.tsx +++ b/src/features/interview/resume-cards-box.tsx @@ -67,10 +67,14 @@ const ResumeCardsBox = ({ session }: Props) => {