Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
214 changes: 214 additions & 0 deletions src/content/post/blog/cuebit-intranet-retrospect.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
---
title: '๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ SPA ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ'
description: '๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ CubeIT ์ธํŠธ๋ผ๋„ท ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.'
date: '2024-07-18'
tags:
- ๊น€๋ฏผํƒœ์˜ ๋ฐ๋ธŒ์บ ํ”„
- ํ† ์ดํ”„๋กœ์ ํŠธ
- ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ
---

๊น€๋ฏผํƒœ์˜ ๋ฐ๋ธŒ์บ ํ”„์˜ ์ฒซ ๋ฒˆ์งธ ํ† ์ด ํ”„๋กœ์ ํŠธ๋กœ '**๊ด€๋ฆฌ์ž์šฉ๊ณผ ์‚ฌ์šฉ์ž์šฉ์œผ๋กœ ๊ตฌ๋ถ„๋œ ์ธํŠธ๋ผ๋„ท ์„œ๋น„์Šค ์„ค๊ณ„ ๋ฐ ๊ฐœ๋ฐœ**'์ด๋ผ๋Š” ๋ฏธ์…˜์ด ์ฃผ์–ด์กŒ๋‹ค.

**๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ SPA**๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋Š”๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋„์›€ ์—†์ด ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ผ์šฐํŒ… ๋“ฑ ๋ชจ๋“  ๊ฑธ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ด์„œ ์ฒ˜์Œ์—๋Š” ๋„ˆ๋ฌด๋‚˜๋„ ๋ง‰๋ง‰ํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํŒ€์›๋“ค๊ณผ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์ฐจ๊ทผ์ฐจ๊ทผ ํ•˜๋‚˜์”ฉ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๋‹ค ๋ณด๋‹ˆ ์กฐ๊ธˆ์”ฉ ๋ฐฉํ–ฅ์„ฑ์„ ์žก์•„๊ฐˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

## ํŒ€ ์†Œ๊ฐœ

์šฐ๋ฆฌ ์กฐ์˜ ํŒ€๋ช…์€ `(mbt)i-dle` ์ด๋‹ค. ํŒ€์› ๋ชจ๋‘ MBTI๊ฐ€ I๋กœ ์‹œ์ž‘ํ•ด์„œ ํŒ€๋ช…์„ `์•„์ด๋“ค`๋กœ ์ง€์—ˆ๋‹ค.
์ธํŠธ๋ผ๋„ท ์„œ๋น„์Šค์˜ ํšŒ์‚ฌ ์ด๋ฆ„์€ `Cube.IT(ํ๋ธŒ์ž‡)`์œผ๋กœ ์ •ํ–ˆ๋Š”๋ฐ (์•„์ด๋Œ) ์•„์ด๋“ค์˜ ์†Œ์†์‚ฌ์ธ Cube์™€ IT ํšŒ์‚ฌ๋ผ๋Š” ์˜๋ฏธ์˜ IT๋ฅผ ํ•ฉ์นœ ์ด๋ฆ„์ด๋‹ค. ๐Ÿ˜

## ํŒ€ ๋ชฉํ‘œ

- ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด **ํ•„์ˆ˜ ๊ธฐ๋Šฅ**์„ ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ
- **Git๊ณผ Github** ์ž˜ ํ™œ์šฉํ•ด ๋ณด๊ธฐ
- ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ **UI/UX** ์„ค๊ณ„ํ•˜๊ธฐ
- **๋ณด์•ˆ** ๊ฐ•ํ™”ํ•˜๊ธฐ

์šฐ๋ฆฌ๋Š” **ํ•„์ˆ˜ ๊ธฐ๋Šฅ์„ ์ œ๋Œ€๋กœ ๊ตฌํ˜„**ํ•˜๋Š” ๊ฑธ ์ตœ์šฐ์„  ๊ณผ์ œ๋กœ ์‚ผ์•˜๋‹ค. ๋Œ€๋ถ€๋ถ„ ํŒ€ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์ด ์—†๊ฑฐ๋‚˜ ์ ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊นƒ๊ณผ ๊นƒํ—ˆ๋ธŒ๋ฅผ ์ž˜ ํ™œ์šฉํ•ด ํšจ์œจ์ ์ธ ํ˜‘์—… ๋ฐฉ์‹์„ ๋ฐฐ์›Œ๋ณด๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•œ ๋ชฉํ‘œ์˜€๋‹ค.
์„œ๋น„์Šค ๋ชฉํ‘œ๋กœ๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž๋ฅผ ๊ณ ๋ คํ•œ UI/UX ์„ค๊ณ„์™€ ์ธํŠธ๋ผ๋„ท ์„œ๋น„์Šค์ธ ๋งŒํผ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ๋ณด์•ˆ์—๋„ ์‹ ๊ฒฝ ์จ๋ณด์ž๋Š” ๋ชฉํ‘œ๋ฅผ ์ •ํ–ˆ๋‹ค.

๊ฐœ์ธ์ ์ธ ๋ชฉํ‘œ๋Š” **์ต์ˆ™ํ•œ ๊ฒƒ๋ณด๋‹ค๋Š” ์ƒˆ๋กœ์šด ๋„์ „ ํ•ด๋ณด๊ธฐ**์™€ **์ด์œ  ์žˆ๋Š” ์„ ํƒํ•˜๊ธฐ**์˜€๋‹ค.

## ๊ธฐ์ˆ  ์Šคํƒ

`Vite` ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ…œํ”Œ๋ฆฟ์ด ์ฃผ์–ด์กŒ๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ํ”„๋ก ํŠธ์—”๋“œ ํŒŒํŠธ๋Š” `HTML, CSS, JavaScript`๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์— `Express` ๊ธฐ๋ฐ˜์˜ ๊ฐ„๋‹จํ•œ ์„œ๋ฒ„๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์—ˆ๊ณ  `SQLite3` ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์—ˆ๋‹ค.
SQLite3๋Š” ์„ ํƒ์‚ฌํ•ญ์ด์—ˆ์ง€๋งŒ, ๊น€๋ฏผํƒœ ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ SQL ๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ค„๋ณด๋ฉด ์ข‹์€ ๊ฒฝํ—˜์ด ๋  ๊ฑฐ๋ผ๊ณ  ํ•˜์…”์„œ ๋„์ „ํ•ด ๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

์‚ฌ์šฉํ•œ ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

- `Axios`: API ํ†ต์‹ ์„ ์œ„ํ•ด ์‚ฌ์šฉ
- `Bcrypt`: ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ
- `Cloudinary`: ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ url๋กœ ๋ณ€ํ™˜ํ•ด ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
- `Dayjs`: ํ˜„์žฌ ์‹œ๊ฐ ํ‘œ์‹œ ๋ฐ ์บ˜๋ฆฐ๋” ๊ตฌํ˜„ ๋“ฑ์— ์‚ฌ์šฉ
- `JsonWebToken(JWT)`: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ๋ณด์•ˆ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

## ๊ธฐํš

![Figjam ๊ธฐํš ์ผ๋ถ€](/images/cubeit-intranet-retrospect/figjam-plan.avif)

์ฃผ์–ด์ง„ ํ•„์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค ๊ฐ™์ด ๊ธฐํš์„ ์‹œ์ž‘ํ–ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์ด ์žˆ์œผ์‹  ์กฐ์žฅ๋‹˜์ด **์•„์ด์Šค๋ธŒ๋ ˆ์ดํ‚น, ํŽ˜๋ฅด์†Œ๋‚˜ ์„ค์ •, ์™€์ด์–ดํ”„๋ ˆ์ž„ ์„ค๊ณ„** ๋“ฑ ๊ธฐํš์„ ์ด๋Œ์–ด์ฃผ์…”์„œ ์ˆ˜์›”ํ•˜๊ฒŒ ์ง„ํ–‰๋๋‹ค.
ํ”ผ๊ทธ์žผ์€ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด ๋ดค๋Š”๋ฐ ๊ธฐํš์— ํ™œ์šฉํ•˜๊ธฐ ์ข‹์•„์„œ ์•ž์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด๋‹ค.

๊ธฐํš์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐ๋Šฅ ์ •์˜์„œ, ์ปดํฌ๋„ŒํŠธ ๊ด€๊ณ„๋„ ๋“ฑ ๋ฌธ์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

![์ปดํฌ๋„ŒํŠธ ๊ด€๊ณ„๋„ ์ผ๋ถ€ - Profile ํŽ˜์ด์ง€](/images/cubeit-intranet-retrospect/profile-page-component.avif)

์ดˆ๋ฐ˜์— ์ปดํฌ๋„ŒํŠธ ๊ด€๊ณ„๋„๋Š” ๋ฌธ์„œ์—์„œ ์ œ์™ธํ•˜์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ, ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์•„ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ฒ ๋‹ค๊ณ  ํ–ˆ๋‹ค.
ํŒ€์›๋“ค์ด ์ปดํฌ๋„ŒํŠธ ๊ด€๊ณ„๋„ ๋•๋ถ„์— **์ „๋ฐ˜์ ์ธ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์ข‹์•˜๋‹ค**๊ณ  ํ•ด์ฃผ์…”์„œ ๋ฟŒ๋“ฏํ–ˆ๋‹ค!

## ๋””์ž์ธ

๊น€๋ฏผํƒœ ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ **๋””์ž์ธ ๊ฐ๊ฐ**์€ ์ค‘์š”ํ•œ ์š”์†Œ์ด๋‹ˆ ๋””์ž์ธ ๋ฆฌ์„œ์น˜๋ฅผ ํ•ด๋ณด๋ฉฐ UI ์š”์†Œ๋“ค์„ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒฝํ—˜์„ ๊ฐ€์ง€๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•˜์…จ๋‹ค.
์‚ฌ์‹ค ํŒ€์— ๋””์ž์ธํ•  ์ค„ ์•„์‹œ๋Š” ๋ถ„์ด ๋‘ ๋ถ„์ด๋‚˜ ๊ณ„์…”์„œ ๋‚ด๊ฐ€ ํ•˜๊ฒŒ ๋  ์ค„์€ ๋ชฐ๋ž๋Š”๋ฐ ์–ด์ฉŒ๋‹ค ๋ณด๋‹ˆ ๋””์ž์ธ์„ ๋งก์•„์„œ ํ•˜๊ฒŒ ๋๋‹ค.ใ…Žใ…Ž

![Figma PC ๋””์ž์ธ](/images/cubeit-intranet-retrospect/pc-design.avif)

![Figma ๋ชจ๋ฐ”์ผ ๋””์ž์ธ](/images/cubeit-intranet-retrospect/mobile-design.avif)

๋ฐ˜์‘ํ˜•์œผ๋กœ ๊ตฌํ˜„ ์˜ˆ์ •์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— **PC์™€ ๋ชจ๋ฐ”์ผ ๋‘ ๊ฐ€์ง€ ๋””์ž์ธ**์„ ์™„์„ฑํ–ˆ๋‹ค. ์˜ค๋žœ๋งŒ์— ํ•ด์„œ ๊ทธ๋Ÿฐ์ง€ ๋””์ž์ธ ์ž‘์—…์€ ๋‚˜๋ฆ„ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋๋‚ธ ๊ฒƒ ๊ฐ™๋‹ค.
๋””์ž์ธ์ด ๋‚˜์™€์•ผ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ™œ์šฉํ•ด ์ฃผ๋ง์— ๋น ๋ฅด๊ฒŒ ์ž‘์—…ํ–ˆ๋‹ค.
์กฐ์žฅ๋‹˜(์ง„์งœ ๋””์ž์ด๋„ˆ)์ด ๋ ˆํผ๋Ÿฐ์Šค๋„ ๊ตฌํ•ด์ฃผ์‹œ๊ณ  ํ”ผ๋“œ๋ฐฑ๋„ ๋น ๋ฅด๊ฒŒ ์ฃผ์…”์„œ ์ข€ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

![๋ฐ˜์‘ํ˜•์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋ชจ์Šต](/images/cubeit-intranet-retrospect/mediaquery.gif)

## ์—ญํ• 

๋””์ž์ธ ์™ธ์—๋„ ํ”„๋กœ์ ํŠธ ์„ธํŒ…, ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋ฐ ๋ผ์šฐํŒ… ์„ค๊ณ„, ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ๋“ฑ ๋‹ค์–‘ํ•œ ์—ญํ• ์„ ๋งก์•˜๋‹ค.

### ํ”„๋กœ์ ํŠธ ์„ธํŒ…

`๊นƒํ—ˆ๋ธŒ ๊ด€๋ฆฌ์ž`๋ผ๋Š” ์—ญํ• ์„ ๋งก์•„ ํ”„๋กœ์ ํŠธ ์„ธํŒ…์„ ๋‹ด๋‹นํ–ˆ๋‹ค. **์ฝ”๋”ฉ ์ปจ๋ฒค์…˜**์„ ์ •ํ•˜๊ณ  **์ด์Šˆ ํ…œํ”Œ๋ฆฟ, PR ํ…œํ”Œ๋ฆฟ** ๋“ฑ๋„ ์•Œ์•„๋ดค๋‹ค.
๋‹ค์–‘ํ•œ ๊นƒํ—ˆ๋ธŒ ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ๋ฅผ ์ฐพ์•„๋ณด๋ฉฐ **Github Wiki**๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ์ œ์•ˆํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.

### ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋ฐ ๋ผ์šฐํŒ… ์„ค๊ณ„

`Class` ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœํ–ˆ๋‹ค.
๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” `html` ๋ฉ”์†Œ๋“œ๋กœ ํ…œํ”Œ๋ฆฟ์„ ์„ค์ •ํ•˜๊ณ , `render`์™€ `addEventListeners` ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์ผ๊ด€๋œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.

๋ผ์šฐํŒ…์€ `History API`๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค. Hash ๋ฐฉ์‹๋„ ๊ณ ๋ คํ–ˆ์ง€๋งŒ URL์— `#`์ด ํฌํ•จ๋˜์–ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋ณดํ†ต ๊ฐ™์€ ํŽ˜์ด์ง€ ๋‚ด์˜ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ด๋ผ ์ข€ ๋” **๊น”๋”ํ•œ URL ๊ตฌ์กฐ**๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” `History API` ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค.

SPA ๊ตฌํ˜„์„ ์œ„ํ•ด `popstate` ์ด๋ฒคํŠธ์™€ `document.body`์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๋กœ ํŽ˜์ด์ง€ ์ „ํ™˜์„ ์ฒ˜๋ฆฌํ–ˆ๋‹ค. ๋งํฌ ํด๋ฆญ ์‹œ `handleNavigatePage` ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด ํŽ˜์ด์ง€๊ฐ€ ์ „ํ™˜๋œ๋‹ค.

URL์˜ **๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ**๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•œ `matchRoute` ํ•จ์ˆ˜๋„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

```js
// /members/:id ๊ฐ™์€ ๋™์  ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ
export const matchRoute = (path, routes) => {
if (!routes) {
return null
}

let matchedRoute = null

Object.keys(routes).forEach((routePath) => {
if (matchedRoute) return

const route = routes[routePath]
const paramNames = []
const regexPath = routePath.replace(/:[^\s/]+/g, (match) => {
paramNames.push(match.slice(1))
return '([^\\/]+)'
})

const regex = new RegExp(`^${regexPath}$`)
const match = path.match(regex)
if (match) {
matchedRoute = route
}
})

return matchedRoute
}
```

### ํ”„๋กœํ•„ ํŽ˜์ด์ง€

Cube.IT ์ธํŠธ๋ผ๋„ท ์„œ๋น„์Šค๋Š” ํฌ๊ฒŒ **๋กœ๊ทธ์ธ, ํ™ˆ, ํ”„๋กœํ•„, ๊ตฌ์„ฑ์›, ๊ทผ๋ฌด/ํœด๊ฐ€ ํŽ˜์ด์ง€**๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ๊ทธ์ค‘ ๋‚ด๊ฐ€ ๋งก์€ ํŽ˜์ด์ง€๋Š” `ํ”„๋กœํ•„ ํŽ˜์ด์ง€`์˜€๋‹ค.

![ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ์†Œ๊ฐœ](/images/cubeit-intranet-retrospect/profile-page.png)

ํ”„๋กœํ•„ ํŽ˜์ด์ง€์—์„œ๋Š” **๊ทผ๋ฌด ์‹œ์ž‘/์ข…๋ฃŒ** ๋ฐ **๋ณธ์ธ ํ”„๋กœํ•„ ์ˆ˜์ •**์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋งŒ๋“  ๋•๋ถ„์— ๊ตฌ์„ฑ์› ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ๋„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

![ํ”„๋กœํ•„ ์ˆ˜์ •](/images/cubeit-intranet-retrospect/profile-edit.avif)

์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ฉด **Cloudinary**๋ฅผ ์ด์šฉํ•ด **url๋กœ ๋ณ€ํ™˜**ํ•œ ๋‹ค์Œ, **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ**ํ•œ๋‹ค.
๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์—ˆ์ง€๋งŒ, ์šฉ๋Ÿ‰ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด Cloudinary ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

![๋žœ๋ค ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์ƒ์„ฑ](/images/cubeit-intranet-retrospect/random-profile-image.gif)

`๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ์„ค์ •`์„ ํด๋ฆญํ•˜๋ฉด [DiceBear](https://www.dicebear.com/) API์˜ Lorelei ์Šคํƒ€์ผ **์•„๋ฐ”ํƒ€๋ฅผ ๋žœ๋ค์œผ๋กœ ์„ค์ •**ํ•ด์ฃผ๋Š” ์ด์Šคํ„ฐ์—๊ทธ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
์ฒ˜์Œ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ์žฌ๋ฏธ์žˆ์–ด์„œ ํ™€๋ฆฐ ๋“ฏ์ด ๊ณ„์† ๋ˆŒ๋Ÿฌ๋ดค๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค. ๐Ÿคฃ

### ๊ตฌ์„ฑ์› ์ƒ์„ธ ํŽ˜์ด์ง€

![๊ถŒํ•œ์— ๋”ฐ๋ผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ๋‹ค๋ฆ„](/images/cubeit-intranet-retrospect/member-detail.png)

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ”„๋กœํ•„ ํŽ˜์ด์ง€์—์„œ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

๊ตฌ์„ฑ์› ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ๋Š” ๊ถŒํ•œ์— ๋”ฐ๋ผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ๋‹ค๋ฅด๋‹ค.
`๊ด€๋ฆฌ์ž`๋Š” ์—ฐ๋ด‰, ์ฃผ์†Œ, ๊ณ ์šฉ ์ •๋ณด, ํ•™๋ ฅ ๋ฐ ๊ฒฝ๋ ฅ ๋“ฑ **๊ตฌ์„ฑ์›์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ™•์ธ**ํ•  ์ˆ˜ ์žˆ๊ณ , **์ˆ˜์ •**๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฐ˜๋ฉด `์ผ๋ฐ˜ ์ง์›`์€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์›์˜ **์ œํ•œ๋œ ์ •๋ณด**๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

### ๋”๋ฏธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

`ChatGPT`๋ฅผ ํ™œ์šฉํ•ด ์ง์›, ๋ถ€์„œ, ํœด๊ฐ€ ๊ด€๋ฆฌ ๋“ฑ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ์—ฐ๊ด€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.
์‹ค์ œ ์„œ๋น„์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋ ค๊ณ  ๋”๋ฏธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์— ๋งŽ์€ ๊ณต์„ ๋“ค์˜€๋Š”๋ฐ, ๊ทธ ์‹œ๊ฐ„์„ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ ์„ค๊ณ„์— ๋” ํˆฌ์žํ–ˆ๋‹ค๋ฉด ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์•„์‰ฌ์›€์ด ๋“ ๋‹ค.

## ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์น˜๋ฉฐ

๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€, ์–ด๋–ค UI/UX๊ฐ€ ๋” ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ• ์ง€, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋‘˜ ์ˆ˜ ์žˆ์„์ง€, ์–ด๋А ์‹œ์ ์— ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋งํ• ์ง€ ๋“ฑ ์ •๋ง ๋งŽ์€ ์š”์†Œ๋ฅผ ๊ณ ๋ฏผํ•˜๊ณ  ๋‹ต์„ ์ฐพ์•„๊ฐ€๋ฉฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

๋งŽ์€ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ๋˜ ๋งŒํผ ์ข‹์€ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๊ณ , ํ˜ผ์ž ํ–ˆ์œผ๋ฉด ์ ˆ๋Œ€๋กœ ์ด ์ •๋„ ํ€„๋ฆฌํ‹ฐ๋ฅผ ๋‚ผ ์ˆ˜ ์—†์—ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
ํŒ€์›๋“ค์ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ์„œ๋กœ์—๊ฒŒ ๋ฐฐ์šธ ์ ์ด ๋งŽ์•˜๋Š”๋ฐ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์ด ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์— ํฐ ๋„์›€์ด ๋  ๊ฑฐ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

## ์ข‹์•˜๋˜ ์ 

### ํŒ€ ๋ถ„์œ„๊ธฐ

![๋งค๋‹ˆ์ €๋‹˜์˜ ์ฝ”๋ฉ˜ํŠธ](/images/cubeit-intranet-retrospect/teamwork.avif)

๋งค๋‹ˆ์ €๋‹˜๋„ ์ธ์ •ํ•˜์‹ค ์ •๋„๋กœ ํŒ€ ๋ถ„์œ„๊ธฐ๊ฐ€ ์ •๋ง ์ข‹์•„์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋‚ด๋‚ด ์ฆ๊ฑฐ์› ๋‹ค.
์Šฌ๋ž™ ์†Œํ†ต๋„ ํ™œ๋ฐœํ–ˆ๊ณ  <span class="text-gray-400">(๋•๋ถ„์— ์งค ํด๋”๋„ ์ƒ๊ฒผ๋‹ค)</span> ๋‹ค๋“ค ๋งก์€ ์ผ์„ ์—ด์‹ฌํžˆ ํ•ด์คฌ๋‹ค.

### ์ด์Šˆ ๋ฐ PR ํ™œ์šฉ

์ด์Šˆ์— ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ๋“ค์„ ๋ฏธ๋ฆฌ ์ถ”๊ฐ€ํ•ด ๋‘๊ณ , ๊ตฌํ˜„ํ•  ์‚ฌ๋žŒ์ด ํ•ด๋‹น ์ด์Šˆ์— ๋ณธ์ธ์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.
์ด์Šˆ ๋ชฉ๋ก์„ ๋ณด๋ฉด **๋ˆ„๊ฐ€ ์–ด๋–ค ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…**ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์— ํฐ ๋„์›€์ด ๋๋‹ค.

PR์€ **2๋ช… ์ด์ƒ ์Šน์ธ**ํ–ˆ์„ ๋•Œ ๋จธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. **์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™”**๋ฅผ ๋„์ž…ํ•ด ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด๋‚˜ ๊ฐœ์„ ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๋‚จ๊ธฐ๋ฉด ๋ฐ˜์˜ํ–ˆ๊ณ  ๋•๋ถ„์— ํ”„๋กœ์ ํŠธ์˜ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์•„์งˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ค‘๋ฐ˜์ฏค **๋งˆ์ผ์Šคํ†ค** ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋ผ์„œ ๋งˆ์ผ์Šคํ†ค๋„ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ, ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ง„ํ–‰๋๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์ข‹์•„์„œ ์œ ์šฉํ–ˆ๋‹ค.

### ๋ชฉํ‘œ ๋‹ฌ์„ฑ!

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚˜๊ณ  ๋Œ์•„๋ณด๋‹ˆ ํŒ€์—์„œ ๋ชฉํ‘œ๋กœ ํ•œ ๋ถ€๋ถ„๋“ค์„ ๋Œ€๋ถ€๋ถ„ ์ด๋ฃฌ ๊ฒƒ ๊ฐ™์•„ ์‹ ๊ธฐํ•˜๊ณ  ๋ฟŒ๋“ฏํ–ˆ๋‹ค.
๊ฐœ์ธ์ ์ธ ๋ชฉํ‘œ๋„ ๋‚˜๋ฆ„๋Œ€๋กœ ๋‹ฌ์„ฑํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์šฐ์„  api ์„ค๊ณ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, Cloudinary ์—ฐ๋™ ๋“ฑ ๋ฐฑ์—”๋“œ ์ฝ”๋“œ์— ๋„์ „ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ SPA๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ํด๋ž˜์Šค ๋ฌธ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๋Š” ๋“ฑ ๋‚ฏ์„ค์ง€๋งŒ ๋„์ „ ์ž์ฒด๋งŒ์œผ๋กœ๋„ ์˜๋ฏธ ์žˆ๋Š” ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋ฐฐํฌ๋„ ๋„์ „ํ•ด ๋ดค๋Š”๋ฐ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ ๋˜ ๋ฐฐํฌ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ด๋ฒˆ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ข€ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์„ ์ •ํ•  ๋•Œ๋„ ํ•ญ์ƒ ๊ทผ๊ฑฐ๋ฅผ ๋“ค์–ด ์˜๊ฒฌ์„ ์ œ์‹œํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค. ๋‹ค๋ฅธ ํŒ€์›๋ถ„๋“ค๋„ ๊ฐ์ž ๊ทผ๊ฑฐ๋ฅผ ๋“ค์–ด ์˜๊ฒฌ์„ ์ œ์‹œํ•ด ์ฃผ์…”์„œ ํฐ ๊ฐˆ๋“ฑ ์—†์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

## ์•„์‰ฌ์› ๋˜ ์ 

### ๊นƒํ—ˆ๋ธŒ ํ”„๋กœ์ ํŠธ ํ™œ์šฉ

๊นƒํ—ˆ๋ธŒ์˜ ๊ธฐ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด ๋ณด๊ณ  ์‹ถ์–ด์„œ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์‹คํšจ์„ฑ์ด ์—†์—ˆ๋‹ค.
์ด์Šˆ๋ฅผ ๋งŒ๋“ค ๋•Œ ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•˜๊ธด ํ–ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€ ํ™•์ธํ•˜๋Š” ํŒ€์›๋„ ์—†์—ˆ๊ณ  ๊ทธ๋ƒฅ ์—ฐ๊ฒฐํ•  ์ผ ํ•˜๋‚˜๋งŒ ๋” ์ถ”๊ฐ€๋œ ๋А๋‚Œ์ด๋ผ ์•„์‰ฌ์› ๋‹ค.

## ๋ฌธ์„œํ™”

๋ฌธ์„œํ™”๋ฅผ ํ•˜์ง€ ์•Š์€ ๊ฑด ์•„๋‹Œ๋ฐ ์ž๋ฃŒ๋ฅผ ์ฐพ๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค.
ํšŒ์˜๋ก์„ ๋‚ ์งœ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์–ด์„œ ์ผ์ •ํ‘œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํšŒ์˜๋ก์„ ์—ด์–ด๋ด์•ผ ํ•˜๋Š” ๋“ฑ <span className="text-gray-400">(6/26 ํšŒ์˜๋ก ์•ˆ์— ์žˆ์—ˆ๋‹ค...)</span> ์›ํ•˜๋Š” ์ž๋ฃŒ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์–ด๋ ค์› ๋‹ค.

์ œ์ถœ์„ ์œ„ํ•œ ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์— ๋„์›€์ด ๋˜๋Š” ๋ฌธ์„œ ์ •๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด ๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

## ๋งบ์œผ๋ฉด์„œ

์ฒ˜์Œ์—” ์ •๋ง ๋ง‰๋ง‰ํ–ˆ๋Š”๋ฐ ๋ชจ๋‘ ํž˜์„ ํ•ฉ์ณ ์ข‹์€ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์–ด์„œ ๋ฟŒ๋“ฏํ•˜๊ณ  ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์šฐ๋ฆฌ ์กฐ๋„ ์ •๋ง ์ž˜ํ–ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์กฐ๋„ ๊ฐ์ž์˜ ๊ฐœ์„ฑ์„ ๋‹ด์€ ๋ฉ‹์ง„ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด๋‚ด์…”์„œ ๋ฐœํ‘œ๋ฅผ ๋ณด๋ฉด์„œ ๋Œ€๋‹จํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
์—ด์‹ฌํžˆ ํ•œ ๋งŒํผ ํ›„ํšŒ๋Š” ์—†๊ณ  ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ ์ž˜ ํ™œ์šฉํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค.

CubeIT์˜ ์ „์ฒด ์ฝ”๋“œ๋Š” [Github](https://github.com/Dev-FE-1/idle-intranet-service)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.