๋๋ฅผ ๋ง๋๋ ์ง๋ฌธ, ํ์ธ๊ณผ ๋๋๋ ์ต๋ช ํธ์ง ๊ณผ๋ํ ์๊ทน์ ์๋์, ์ฑ์ฐฐ๊ณผ ์ง์ ์ฑ ์๋ ์ฐ๊ฒฐ์ ๋ค์ ๊บผ๋ด๋ ํธ์ง ์๋น์ค
์ฌ์ฉ์ ์๋น์ค: https://www.soksak-letter.com/
๊ฐ์ฒ๋(FE: 3๋ช , BE: 3๋ช ) + ์ญ์ค๋(PM, Designer, FE) => ์ฒ์ญ์ด
| ๋ถ์ผ | ์ด๋ฆ | ํฌ์ง์ |
|---|---|---|
| PM | ์ธ์ด/์์์ฐ | ํ๋ก์ ํธ ๋งค๋์ง, ์๊ตฌ์ฌํญ ์ ์, ์ผ์ /๋ฆฌ์คํฌ ๊ด๋ฆฌ |
| Design | ์ฐ๋/์กฐ์ ์ด | ๋์์ธ ์์คํ , UX/UI, ํ๋กํ ํ์ |
| FE | ์ /๊น์ง์, ์๋/์ฐจ์๋ฆฐ, ์์/์์์ง, ์ ๋/๋จ์ง์ค | ์ฌ์ฉ์ ํ๋ก์ฐ ๊ตฌํ, API ์ฐ๋, ์ํ/์บ์ ๊ด๋ฆฌ |
| BE | ํธ๋ฏธ/๊น์์ค, ๋๋ถ/์กฐ์ฐ์ค, ๊ท์/๋ฐ์น์ฃผ | API/DB ์ค๊ณ, ์ธ์ฆ/๋ณด์, ๋ฐฐํฌ/์ด์ |
๋๋ฅผ ๋ง๋๋ ์ง๋ฌธ, ํ์ธ๊ณผ ๋๋๋ ์ต๋ช ํธ์ง ์๋น์ค
- ๋งค์ผ ๋์ฐฉํ๋ โ์ค๋์ ์ง๋ฌธโ์ ๋ตํ๋ฉฐ ์๊ฐ์ ์ ๋ฆฌํ๊ณ
- ๋งค์นญ๋ ์๋์ ์ต๋ 10ํ ํธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ
- 3์ผ ๋ค ๋์๊ฒ ์ค๋ ํธ์ง(D+3) ๋ก ๋ฆฌํ ์ ๊ณผ ํ๋ณต ๊ฒฝํ์ ๋ง๋ ๋ค
ํ๋์ AI/SNS ์ฌ์ฉ์๋ ์ํผยทSNSยทAI Slop ๋ฑ ๋ํ๋ฏผ์ฑ ์ ๋ณด ๊ณผ์์ ๋ ธ์ถ๋์ด, ๊ฐ์ ์ ์ผ๋ก ์ง์ณค์ ๋ ์ฆ๊ฐ์ ์ธ ์๊ทน์ ์์กดํ๊ฒ ๋ฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ โ์๊ฐํ ์๊ฐโ์ด ์ค์ด ์๊ธฐ ์ฑ์ฐฐ์ด ์ด๋ ค์์ง๊ณ , ์ฅ๊ธฐ์ ์ผ๋ก ๋ฒ์์/๊ณ ๋ฆฝ๊ฐ์ด ๋์ ๋ฉ๋๋ค.
- ๊ทผ๋ณธ ์์ธ: ๋ด๋ฉด์ ๋ถ์์ ์ฑ + ๊ฑด๊ฐํ ์ฌ์ ๋ฅผ ์ํ ์ฐฝ๊ตฌ ๋ถ์ฌ
- ์ฌ์ด ํด๊ฒฐ(์ฆ๊ฐ ์๊ทน, AI ์์กด)๋ก ๊ณ ํต์ ํํผํ๋ ์ต๊ด ๊ฐํ
- ๊ธฐ์กด ํด๊ฒฐ์ฑ (์ผ๊ธฐ/๋ช ์ ์ฑ)์ ๋ถ๋ดยท์ง๋ฃจํจ์ผ๋ก ์ง์ ์ฌ์ฉ ์ ๋ ์คํจ
- ์๊ธฐ ๊ฐ๊ดํ ๋ฅ๋ ฅ ์ ํ โ ๊ฐ์ ์๋ชจ ์ฆ๊ฐ
- ์ธ๋ถ ์๊ทน ์์กด ๊ฐํ โ ์ฌ๋ฆฌ์ ํผ๋ก/๊ณ ๋ฆฝ๊ฐ ์ ํ
- ์ฅ๊ธฐ์ ์ผ๋ก ์ ์ ์ ๊ฑด๊ฐ์ ๋ถ์ ์ ์ํฅ
ํธ์ง์ ๊ฐ์น๋ฅผ ํตํด, ์ฌ์ฉ์์๊ฒ ์ฑ์ฐฐ๊ณผ ์ํต์ ๊ธฐํ๋ฅผ ์ ๊ณตํ์ฌ ์ฅ๊ธฐ์ ์ธ ์ฌ๋ฆฌ์ ์์ ๊ฐ์ ์ค๋ค.
| Fact | Insight |
|---|---|
| ๋์งํธ ๋ํก์ค/๋ํ๋ฏผ ๋ํก์ค ํธ๋ ๋ ํ์ฐ | ์ฌ์ฉ์๋ ์๊ทน์ ์ ์ํ์ ์ง์ณค๊ณ , ์ต๊ด ๊ต์ ํ ๊ฒฝํ์ ์ํ๋ค |
| SNS ์ฌ์ฉ ์ฆ๊ฐ โ ๋น๊ต ์ฌํ๋ก ์ธํ ๊ณ ๋ฆฝ๊ฐ | ์ธ๋ก์์ ์ฐ๊ฒฐ์ ๋ถ์ฌ๊ฐ ์๋๋ผ ์ฐ๊ฒฐ์ ํ์ง ๋ฌธ์ ๋ค |
| ์ฌ๋ฆฌ์๋ด ์์ฅ ์ฑ์ฅ, ์ฌํ์ ๊ณ ๋ฆฝ ์ด์ ํ๋ | ํฐ ๋น์ฉ/์๊ฐ ์์ด ์ผ์ ์์์ ์๋ฐฉ์ ์๊ธฐ๊ด๋ฆฌ ๋์ฆ๊ฐ ์๋ค |
์ฐธ๊ณ (์์): ์์ธ์ โ์ฌํ์ ๊ณ ๋ฆฝโ ์ ์ฑ ์๋ฃ: https://www.seoul.go.kr/policy/view.do?id=1056&lan=KO
- ๋ํ์
- 20๋ ์ง์ฅ์ธ
- 20๋ AI/SNS ํค๋น ์ ์
โ์ ์ โ ํ์ โ ๋งค์นญ/์ํต โ ์ข ๋ฃ/ํผ๋๋ฐฑ โ ์ฌ๋ฐฉ๋ฌธ/ํ์ฅโ์ ๊ฒฝํ์ ํ ์ฅ์ผ๋ก ์ค๊ณ
| ๋จ๊ณ | 1. ์ ์ ๋ฐ ์จ๋ณด๋ฉ | 2. ํ์ | 3. ๋งค์นญ ๋ฐ ์ํต | 4. ์ข ๋ฃ ๋ฐ ํผ๋๋ฐฑ | 5. ์ฌ๋ฐฉ๋ฌธ ๋ฐ ํ์ฅ |
|---|---|---|---|---|---|
| ์ฌ์ฉ์ ๋ชฉํ | ๋น ๋ฅด๊ฒ ๊ฐ์ ํ๊ณ ๊ฐ์น ํ์ธ | ์ค๋์ ์ง๋ฌธ ํ์ธ | ํฐํคํ์นด ๋๋ ๋ํ | ๊น๋ํ ๋ง๋ฌด๋ฆฌ/ํ๊ฐ | ๊ธฐ๋ก ํ์ธ/์ถ๊ฐ ์์ฑ |
| ์ฃผ์ ํ๋ | ์์ ๋ก๊ทธ์ธ โ ํ๋กํ โ D+3 ํธ์ง(ํ์) โ ์๋ฆผ | ์ง๋ฌธ ํ์ธ โ ๋ต๋ณ ์์ฑ | ๋ฐ์กโ๋งค์นญโ๊ตํ(์ต๋ 10ํ) | ์ข ๋ฃ(10ํ/48h) โ ์จ๋/ํ๊ทธ | 3์ผ ์ ํธ์ง ๋์ฐฉ โ ์ฃผ๊ฐ ๋ฆฌํฌํธ |
| ํฐ์นํฌ์ธํธ | ๋๋ฉ/์จ๋ณด๋ฉ/OS ์๋ฆผ | ํ(์ค๋์ ์ง๋ฌธ ์นด๋) | ์ฑํ ๋ฐฉ/์นด์ดํฐ | ๋ฆฌ๋ทฐ ๋ชจ๋ฌ/์ข ๋ฃ ํ์ด์ง | ๋ณด๊ดํจ/๋ฆฌํฌํธ/DatePicker |
| ๊ธฐํ์์ธ | Lock-in(๋ฏธ๋ ๋ณด์) | ํฌ์์ฑ(24h) | ํ์ง๊ด๋ฆฌ(๋ต์ฅ๋ฅ /์จ๋) | ๋ฐ์ดํฐ ์ ์ํ | ์ ๋ฃํ ํ์ฅ |
-
์ค๋์ ์ง๋ฌธ(24์๊ฐ)
๋งค์ผ ์ง๋ฌธ ๊ฐฑ์ / ์นด์ดํธ๋ค์ด / ๋ต๋ณ ์ง์ -
์ต๋ช ๋งค์นญ & ํธ์ง ๊ตํ(์ต๋ 10ํ, 48์๊ฐ)
๋ํ ํ์ ์นด์ดํธ, ๋ง๋ฃ ์ฒ๋ฆฌ -
D+3 ๋์๊ฒ ์ฐ๋ ํธ์ง(์จ๋ณด๋ฉ ํ์) โ๋ฏธ๋์ ๋โ์๊ฒ ๋ณด๋ด๋ ์์ฝ ํธ์ง, ์๋ฆผ์ผ๋ก ํ์
-
์ข ๋ฃ ๋ฆฌ๋ทฐ(์จ๋ ์ฌ๋ผ์ด๋ + ํ๊ธฐ ํ๊ทธ)
๊ฒฝํ ๋ฐ์ดํฐ ์์ง โ ๋ค์ ๋งค์นญ ํ์ง ๊ฐ์ -
์ฃผ๊ฐ ๋ฆฌํฌํธ
์ผ์ฃผ์ผ ๊ธฐ๋ก ์์ฝ/๊ฐ์ ๋ถํฌ/ํค์๋ ์ธ์ฌ์ดํธ ์ ๊ณต -
์น๊ตฌ ๊ธฐ๋ฅ / ํ ๋ง ๋ฐฐ๊ฒฝ / ํฐํธ ์ต์ / ์์ฝ ํธ์ง ํ์ฅ
-
React + Vite
์์ญํธ์ง๋ ๋ชจ๋ฐ์ผ 375px ๊ณ ์ UI ๊ธฐ๋ฐ์ SPA ์๋น์ค๋ก, SSR์ด ํ์์ ์ธ ๊ตฌ์กฐ๋ ์๋๋๋ค. ๋น ๋ฅธ ๊ฐ๋ฐ ์๋์ ๊ฐ๋ฒผ์ด ๋ฒ๋ค ํ๊ฒฝ์ ์ ๊ณตํ๋ Vite ๊ธฐ๋ฐ React ๊ตฌ์กฐ๋ฅผ ์ฑํํ์ฌ ๊ฐ๋ฐ ํจ์จ์ฑ๊ณผ ๋น๋ ์๋๋ฅผ ๋์์ ํ๋ณดํ์์ต๋๋ค. -
TypeScript
ํธ์ง, ๋งค์นญ, ๋ฆฌํฌํธ ๋ฑ ๋๋ฉ์ธ์ด ๋ช ํํ๊ณ API ์๋ต ๊ตฌ์กฐ๊ฐ ์ค์ํ ์๋น์ค ํน์ฑ์ ํ์ ์์ ์ฑ์ด ์ค์ํฉ๋๋ค. TypeScript๋ฅผ ํตํด ํ์ ์ ์๋๋ฅผ ๋ช ํํ ํ๊ณ , ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๊ณ ์ ์ ์ ํ์์ต๋๋ค. -
TanStack Query
์๋ฒ ๋ฐ์ดํฐ์ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ํด TanStack Query๋ฅผ ๋์ ํ์์ต๋๋ค. ์บ์ฑ, ์๋ refetch, ๋ก๋ฉ/์๋ฌ ์ํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ API ์ค์ฌ ๊ตฌ์กฐ์์ ์์ ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ์งํ๊ณ ์ ํ์์ต๋๋ค. -
Zustand
์ ์ญ ์ํ๋ฅผ ์ต์ํ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฒฝ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Zustand๋ฅผ ์ฑํํ์์ต๋๋ค. ๋ถํ์ํ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์์ด ์ง๊ด์ ์ธ store ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์์ผ๋ฉฐ, ์ธ์ฆ ์ํ๋ ๋ชจ๋ฌ ๊ด๋ฆฌ ๋ฑ UI ์ค์ฌ ์ ์ญ ์ํ์ ์ ํฉํ๋ค๊ณ ํ๋จํ์์ต๋๋ค. -
Tailwind CSS
Figma ๊ธฐ๋ฐ ๋์์ธ ์์คํ ์ ๋น ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ ์ํด Tailwind CSS๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ์ ํธ๋ฆฌํฐ ํด๋์ค ๊ธฐ๋ฐ ์คํ์ผ๋ง์ ํตํด ์ผ๊ด๋ ๋์์ธ์ ์ ์งํ๋ฉด์๋ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ผ ์ ์์ด ์ ์ ํ์์ต๋๋ค. -
Framer Motion
ํธ์ง ์ ํ, ๋ชจ๋ฌ ๋ฑ์ฅ ๋ฑ ๊ฐ์ฑ์ ์ธ ์ธํฐ๋์ ์ด ์ค์ํ ์๋น์ค ํน์ฑ์ ๊ณ ๋ คํ์ฌ Framer Motion์ ๋์ ํ์์ต๋๋ค. ์ง๊ด์ ์ธ API์ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ๊ตฌํ์ด ๊ฐ๋ฅํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐํํ ์ ์์์ต๋๋ค.
-
Node.js + Express
์์ญํธ์ง๋ REST ๊ธฐ๋ฐ API ์๋ฒ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์์ต๋๋ค. ๋น ๋ฅธ ๊ฐ๋ฐ๊ณผ ์ ์ฐํ ๋ผ์ฐํ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ Node.js์ Express๋ฅผ ํ์ฉํ์ฌ ํ๋ก ํธ์๋์์ ํ์ ํจ์จ์ ๋์ด๊ณ ์ ํ์์ต๋๋ค. -
MySQL
ํธ์ง, ์ ์ , ๋งค์นญ, ๋ฆฌ๋ทฐ ๋ฑ ๊ด๊ณํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ช ํํ ์๋น์ค์ด๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ RDBMS์ธ MySQL์ ์ฑํํ์์ต๋๋ค. ๋ฐ์ดํฐ์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ์ค์ ์ ๋์์ต๋๋ค. -
Redis
๋งค์นญ ๋๊ธฐ์ด ์ฒ๋ฆฌ ๋ฐ ์บ์ฑ๊ณผ ๊ฐ์ด ๋น ๋ฅธ ์๋ต์ด ํ์ํ ์์ญ์ ์ต์ ํํ๊ธฐ ์ํด Redis๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ณ ์๋ต ์๋๋ฅผ ๊ฐ์ ํ๊ณ ์ ํ์์ต๋๋ค. -
JWT
๋ฌด์ํ ์ธ์ฆ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด JWT ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์ ์ ์ฉํ์์ต๋๋ค. ์๋ฒ ํ์ฅ์ฑ๊ณผ ์ธ์ฆ ์ฒ๋ฆฌ์ ๋จ์ํ๋ฅผ ๊ณ ๋ คํ์ฌ ํด๋น ๋ฐฉ์์ ์ฑํํ์์ต๋๋ค.
-
์ปค๋ฐ ์ ํ
- Feat
- Fix
- Remove
- Refactor
- Style
- Test
- Chore
- docs
-
์ปค๋ฐ ๋ฉ์์ง
Feat: ์ฌ์ฉ์ ๋ก๊ทธ์ธ API ๊ตฌํ (#9)
- ๊ท์น
- ์ ๋ชฉ 50์ ์ด๋ด
- ์ ๋ชฉ ๋ ๋ง์นจํ ๊ธ์ง
- ๋ณธ๋ฌธ์ ๋ฌด์/์ ์์ฑ
- ํ์ผ๋ช
: kebab-case
- user.controller.ts
- Class / Interface: UpperCamelCase
- UserController, AuthService
- ํจ์ / ๋ณ์: lowerCamelCase
- getUserById, accessToken
- ์์: UPPER_SNAKE_CASE
- TOKEN_EXPIRE_TIME
- initXXX(): ์ด๊ธฐ ์ค์
- createXXX(): ์์ฑ
- getXXX(): ๋จ์ผ ์กฐํ
- getXXXs(): ๋ณต์ ์กฐํ
- updateXXX(): ์์
- deleteXXX(): ์ญ์
- findXXX(): ์กฐ๊ฑด ํ์
- GET โ getUser(), getUserList()
- POST โ createUser(), loginUser()
- PUT / PATCH โ updateProfile()
- DELETE โ deleteUser()
- ์์ | [์ปค๋ฐ์ ํ] ์ด์ ๋ด์ฉ
- ์์ | [FEAT] ์ฌ์ฉ์ ๋ก๊ทธ์ธ API ๊ตฌํ
- PR ํ์
- ๊ธฐ๋ฅ ์ถ๊ฐ
- ๊ธฐ๋ฅ ์ญ์
- ๋ฒ๊ทธ ์์
- ๋ฆฌํฉํ ๋ง / ์ค์ ๋ณ๊ฒฝ
- ๋ฐ์ ๋ธ๋์น
- feature/#9-์์ ๋ก๊ทธ์ธAPI๊ตฌํ โ develop
- ๋ณ๊ฒฝ ์ฌํญ
- ๋ณ๊ฒฝ ๋ด์ฉ ์์ฝ
- ํ
์คํธ ๊ฒฐ๊ณผ
- API ํ ์คํธ ๊ฒฐ๊ณผ ๋๋ Swagger ์บก์ฒ
- ์ค์ ์๋น์ค์ ๋ฐฐํฌ๋๋ ๋ธ๋์น
- ์ง์ ๊ฐ๋ฐํ์ง ์์ผ๋ฉฐ, dev ๋ธ๋์น๋ฅผ ํตํด ๋ณํฉ
- main์์ ๋ถ๊ธฐ๋๋ ๊ฐ๋ฐ ํตํฉ ๋ธ๋์น
- feature ๋ธ๋์น์์ ์์ ํ ๊ธฐ๋ฅ์ ๋ณํฉ
- ์ถฉ๋ถํ ํ ์คํธ ํ main์ผ๋ก ๋ฐฐํฌ
- ๋ฒ๊ทธ ์์ ๋ธ๋์น
- dev์์ ๋ถ๊ธฐํ์ฌ ์์ ํ dev๋ก ๋ณํฉ
- ๊ธฐ๋ฅ ๊ตฌํ ๋ธ๋์น๊ฐ dev์ ๋ณํฉ๋์ด ์๋์ง ํ์ธ ํ ์์