Skip to content

FRONTENDSCHOOL7/jubging

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

437 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

final-06-jubging

0. ๋ชฉ์ฐจ

  1. ์„œ๋น„์Šค ์†Œ๊ฐœ
  2. ํŒ€ ์†Œ๊ฐœ
  3. ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„
  4. ๊ธฐ์ˆ  ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
  5. ํ˜‘์—… ํ™˜๊ฒฝ
  6. ์—ญํ•  ๋ถ„๋‹ด
  7. UI
  8. ๊ตฌํ˜„ ๊ธฐ๋Šฅ
  9. ์ฃผ์š” ์ฝ”๋“œ
  10. ํด๋” ๊ตฌ์กฐ
  11. ๋ฆฌํŒฉํ† ๋ง ํ•  ๋ถ€๋ถ„
  12. ํšŒ๊ณ  ๋ฐ ์†Œ๊ฐ

1. ๐Ÿƒ์„œ๋น„์Šค ์†Œ๊ฐœ

Shot

์ค๊น…์€ ํ”Œ๋กœ๊น… ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ณ , ํ”Œ๋กœ๊น… ์ถ”์ฒœ ์ฝ”์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” SNS ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. '(์“ฐ๋ ˆ๊ธฐ๋ฅผ) ์ค๋‹ค'์™€ '์กฐ๊น…(jogging)'์„ ํ•ฉ์นœ '์ค๊น…'์€ ํ”ํžˆ ํ”Œ๋กœ๊น…์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ์šฐ๋ฉฐ, ํ™˜๊ฒฝ ๋ณดํ˜ธ์™€ ๊ฑด๊ฐ•ํ•œ ๋ผ์ดํ”„์Šคํƒ€์ผ์„ ๋™์‹œ์— ์ถ”๊ตฌํ•˜๋Š” ์ปจ์…‰์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • Follower, Following ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด, ์นœ๊ตฌ๋ฅผ ๋งบ์€ ์‚ฌ์šฉ์ž๋“ค์€ ์ž์‹ ์˜ ํ”Œ๋กœ๊น… ๊ฒฝํ—˜์„ ๊ธฐ๋กํ•˜์—ฌ ๊ณต์œ ํ•˜๊ณ , ์นœ๊ตฌ์˜ ํ”Œ๋กœ๊น… ๊ฒฝํ—˜๋„ ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž์‹ ์˜ ํ™ˆ ํ”ผ๋“œ์—์„œ ํŒ”๋กœ์šฐํ•œ ์‚ฌ๋žŒ์˜ ๊ฒŒ์‹œ๊ธ€์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋Œ“๊ธ€๊ณผ ์ข‹์•„์š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์„œ๋กœ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณธ์ธ์ด ๊ฒฝํ—˜ํ•œ ์ข‹์€ ํ”Œ๋กœ๊น… ์ฝ”์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด ๋” ํšจ์œจ์ ์ธ ํ”Œ๋กœ๊น… ํ™œ๋™์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์ธ์˜ ํ”Œ๋กœ๊น…์„ ๊ณต์œ ํ•˜๊ณ  ํƒ€์ธ์˜ ํ”Œ๋กœ๊น…์„ ๊ฒฝํ—˜ํ•จ์œผ๋กœ์จ ํ™˜๊ฒฝ ๋ณดํ˜ธ์— ๋Œ€ํ•œ ์ธ์‹์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿƒ ์ค๊น…์„ ํ†ตํ•ด ํ”Œ๋กœ๊น… ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๋ฉฐ ์†Œํ†ตํ•ด๋ณด์„ธ์š”๐Ÿ’š

๐Ÿƒ ๋ฐฐํฌ URL

๐Ÿƒ ์ค๊น… ํ…Œ์ŠคํŠธ ๊ณ„์ •
ID : jubging@gmail.com
PW : asd123

2. ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ ํŒ€ ์†Œ๊ฐœ

๊น€์ง€ํ—Œ ์„œ๋™์ฃผ ๊น€ํ•˜์˜ ์ •ํ˜„์ง€
๐Ÿ”— GitHub
Frontend
๐Ÿ”— GitHub
Frontend
๐Ÿ”— GitHub
Frontend
๐Ÿ”— GitHub
Frontend

(๐Ÿ”ผ Top)

3. ๐Ÿ“… ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

๐Ÿƒ2023.10.16 ~ 2023.11.08

  • ๊ฐœ๋ฐœ ์ผ์ •์€ ๋…ธ์…˜์˜ ๊ฐ„ํŠธ ์ฐจํŠธ๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ผ์ •

์ฃผ์ฐจ ์ž‘์—… ๋‚ด์šฉ
์‚ฌ์ „ ๋ชจ์ž„
(10/12 ~ 10/13)
- ์ฃผ์ œ ์„ ์ • ๋ฐ ๊ตฌ์กฐ๋„ ์ž‘์„ฑ
- API ๋ช…์„ธ ํŒŒ์•…
1์ฃผ์ฐจ
(10/16 ~ 10/22)
- ํ”„๋กœ์ ํŠธ ๊ธฐ์ดˆ ์…‹ํŒ… ๋ฐ ํด๋” ๊ตฌ์กฐ ์„ค์ •
- ์ปจ๋ฒค์…˜ ๋ฐ Issue, PR ํ…œํ”Œ๋ฆฟ ์„ค์ •
- Figma๋ฅผ ํ†ตํ•ด ์™€์ด์–ดํ”„๋ ˆ์ž„ ๋ฐ UI ์ œ์ž‘
2์ฃผ์ฐจ
(10/23 ~ 10/29)
- ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ์ œ์ž‘
- ๊ฐ ๋งก์€ ํŽ˜์ด์ง€ ๋งˆํฌ์—… & ์Šคํƒ€์ผ๋ง ๊ตฌํ˜„
- ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ณ„๋กœ ํ•„์ˆ˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ๊ฒŒ์‹œ๊ธ€, ํ”„๋กœํ•„ ๋“ฑ)
3์ฃผ์ฐจ
(10/30 ~ 11/5)
- ํŽ˜์ด์ง€ ๋‹จ์œ„ 2์ฐจ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (์ฝ”์Šค ๋“ฑ๋ก, ๋Œ“๊ธ€)
- ์ถ”๊ฐ€๊ธฐ๋Šฅ ๊ตฌํ˜„ (์ข‹์•„์š”, ๊ฒ€์ƒ‰, ํŒ”๋กœ์šฐ)
4์ฃผ์ฐจ
(11/6 ~ 11/8)
- ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ๋ฆฌํŒฉํ† ๋ง
- ๋ฐฐํฌ (Netlify)
- README ์ž‘์„ฑ

4. โš’๏ธ ๊ธฐ์ˆ  ๋ฐ ๊ธฐ์ˆ  ํ™˜๊ฒฝ

๊ธฐ์ˆ ์Šคํƒ

์‚ฌ์šฉ ๊ธฐ์ˆ 
ํŒจํ‚ค์ง€
ํฌ๋งทํ„ฐ
ํ˜‘์—…
๋””์ž์ธ
API
IDE

Recoil ํ™œ์šฉ : ์›์ž์  ์ƒํƒœ ๊ด€๋ฆฌ์™€ React์™€์˜ ์นœํ™”์„ฑ

ยท ์ „์—ญ ์ƒํƒœ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ํšจ์œจ์ ์ธ ํ˜‘์—… ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
ยท React์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” API๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— React๋ฅผ ๋ฐฐ์šด์ง€ ์–ผ๋งˆ ์•ˆ ๋œ ํŒ€์›๋“ค๋„ Recoil์— ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์ ์‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Axios ํ™œ์šฉ : ๋น„๋™๊ธฐ ์š”์ฒญ ์ฒ˜๋ฆฌ์™€ ์ „์—ญ ์„ค์ • ์šฉ์ด์„ฑ

ยท Promise ๊ธฐ๋ฐ˜์˜ API๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ์š”์ฒญ์„ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
ยท ์ „์—ญ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ธฐ๋ณธ URL, ํ—ค๋” ๋“ฑ์„ ํ•œ ๊ณณ์—์„œ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ยท Interceptor ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ชจ๋“  ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์— ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ํ† ํฐ ์ธ์ฆ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋“ฑ๊ณผ ๊ฐ™์€ ๋กœ์ง์„ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

CustomHook ํ™œ์šฉ : ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ ์Šคํฌ๋กค ์ œ์–ด

โ…ฐ useDebounce Hook
  ยท ์‚ฌ์šฉ์ž์˜ ์—ฐ์†์ ์ธ ์ž…๋ ฅ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ•œ Hook
  ยท ์ž…๋ ฅ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„, ํ•ด๋‹น ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ API ํ˜ธ์ถœ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

โ…ฑ useScrollTop Hook
  ยท ์Šคํฌ๋กค ์œ„์น˜ ์ดˆ๊ธฐํ™”
  ยท ๋ผ์šฐํŒ… ๊ฐ„ ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์Šคํฌ๋กค ์œ„์น˜๋ฅผ ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

React-Portal ํ™œ์šฉ : ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€ ๋ Œ๋”๋ง ๊ด€๋ฆฌ

ยท ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฃจํŠธ ์™ธ๋ถ€์— ๋ Œ๋”๋ง ํ•˜์—ฌ CSS ์Šคํƒ€์ผ๋ง๊ณผ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์—์„œ ์ž์œ ๋กญ๊ฒŒ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

5. ๐Ÿค ํ˜‘์—… ํ™˜๊ฒฝ

โš™๏ธ Convention

ํŒ€์› ๊ฐ„์˜ ์›ํ™œํ•œ ์†Œํ†ต๊ณผ ํ˜‘์—…์„ ์œ„ํ•ด prettier์™€ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜์„ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Prettier Convention
{
  "bracketSpacing": true, // ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—์„œ ๊ด„ํ˜ธ์— ๊ณต๋ฐฑ ์‚ฝ์ž…
  "jsxBracketSameLine": false, // JSX์˜ ๋งˆ์ง€๋ง‰ `>`๋ฅผ ๋‹ค์Œ ์ค„๋กœ ๋‚ด๋ฆด์ง€ ์—ฌ๋ถ€
  "jsxSingleQuote": true, // JSX์— ํ™‘๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ ์—ฌ๋ถ€
  "semi": true, // ์„ธ๋ฏธ์ฝœ๋ก  ์‚ฌ์šฉ ์—ฌ๋ถ€
  "printWidth": 80, // ์ค„ ๋ฐ”๊ฟˆ ํ•  ํญ ๊ธธ์ด
  "useTabs": false, // ํƒญ ์‚ฌ์šฉ ์—ฌ๋ถ€
  "tabWidth": 2, // ํƒญ ๋„ˆ๋น„
  "arrowParens": "always" // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๊ด„ํ˜ธ ์‚ฌ์šฉ ์—ฌ๋ถ€
}
  • Git Commit Convention
Emoji Type ์„ค๋ช… ์˜ˆ์‹œ
๐Ÿ› FIX ๋ฒ„๊ทธ, ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ex) ๐Ÿ› callback error
๐Ÿ“ ADD ๋ฌธ์„œ ์ƒ์„ฑ / ์ˆ˜์ • ex) ๐Ÿ“ LoginActivity
โœจ FEAT ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„ ex) โœจ google login
๐Ÿ”ฅ DEL, REMOVE ์ฝ”๋“œ / ํŒŒ์ผ ์‚ญ์ œ ex) ๐Ÿ”ฅ ์ค‘๋ณต ํŒŒ์ผ ์‚ญ์ œ
โ™ป๏ธ REFACTOR ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง, ์„ธ๋ฏธ์ฝœ๋ก  ์ค„๋ฐ”๊ฟˆ ํฌํ•จ ex) โ™ป๏ธ MVP architecture to MVVM
๐Ÿšš CHORE ๊ทธ ์ด์™ธ์˜ ์žก์ผ/ ๋ฒ„์ „ ์ฝ”๋“œ ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ, ํŒŒ์ผ ์ด๋™, ๊ฐ€๋…์„ฑ์ด๋‚˜ ๋ณ€์ˆ˜๋ช…, reformat ๋“ฑ ex) ๐Ÿšš delete unnecessary import package
๐Ÿ’„ DESIGN UI ๊ฐ™์€ ์Šคํƒ€์ผ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ ex) ๐Ÿ’„ ํšŒ์›๊ฐ€์ž… ๋ ˆ์ด์•„์›ƒ ์กฐ์ •
๐Ÿ’ก COMMENT ํ•„์š”ํ•œ ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ ex) ๐Ÿ’ก ๋ฉ”์ธ ๋ทฐ์ปจ ์ฃผ์„ ์ถ”๊ฐ€
โœ… TEST ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ ex) โœ… ๋กœ๊ทธ์ธ ํ† ํฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€

โš™๏ธ Issue ๋ฐ PR template

๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•œ Issue ๋ฐ PR ์ƒ์„ฑ์„ ์œ„ํ•ด template์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Issue
# ๐Ÿ“‘ Description

์„ค๋ช…์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

# ๐Ÿ“ Todo

- [ ] todo 1
- [x] todo 2

# ๐Ÿ“ ETC

๊ธฐํƒ€์‚ฌํ•ญ
  • Pull Request
# โšก PR ์š”์•ฝ

PR ๋‚ด์šฉ์„ ์š”์•ฝํ•˜์—ฌ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

# ๐Ÿ” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ

- ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ชฉ๋ก์„ ์ž‘์„ฑ

# ๐Ÿ’ก ๊ด€๋ จ ์ด์Šˆ

Resolve {#์ด์Šˆ๋ฒˆํ˜ธ}

๐Ÿ“… Github Projects

๊นƒํ—ˆ๋ธŒ์—์„œ ์ œ๊ณตํ•˜๋Š” ์นธ๋ฐ˜๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ•œ ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด ์ผ์ • ๊ด€๋ฆฌ์— ์ˆ˜์›”ํ–ˆ์Šต๋‹ˆ๋‹ค.

(๐Ÿ”ผ Top)

6. ๐Ÿ‘จโ€๐ŸŽ“ ์—ญํ•  ๋ถ„๋‹ด

Shot

7. ๐ŸŽจ UI

๐Ÿ‘‰ํ”ผ๊ทธ๋งˆ ๋งํฌ

UI

8. โœจ ๊ตฌํ˜„ ๊ธฐ๋Šฅ

์Šคํ”Œ๋ž˜์‰ฌ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž…
splash login signup
404 ๊ณ„์ • ๊ฒ€์ƒ‰ ํŒ”๋กœ์›Œ&ํŒ”๋กœ์ž‰
404 search follower
ํ™ˆ ๋‰ด์Šค๋ ˆํ„ฐ ์ข‹์•„์š”
home newsletter like
๋Œ“๊ธ€ ๋“ฑ๋ก ๋Œ“๊ธ€ ์‚ญ์ œ/์‹ ๊ณ  ์ฑ„ํŒ…
comment_more comment_delete แ„Žแ…ขแ„แ…ตแ†ผ
๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •/์‚ญ์ œ ์ฝ”์Šค ๋“ฑ๋ก/์ƒ์„ธ ๋ณด๊ธฐ
๊ฒŒ์‹œ๊ธ€_แ„ƒแ…ณแ†ผแ„…แ…ฉแ†จ แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ แ„‰แ…กแ„Œแ…ตแ†ซ แ„‰แ…กแ†จแ„Œแ…ฆ แ„‰แ…ฎแ„Œแ…ฅแ†ผ แ„‰แ…กแ†จแ„Œแ…ฆ ์ฝ”์Šค_๋“ฑ๋ก
ํ”„๋กœํ•„ ์ˆ˜์ • ๊ณ„์ • ์‹ ๊ณ /๊ณต์œ ,แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ แ„‰แ…ตแ†ซแ„€แ…ฉ ๋กœ๊ทธ์•„์›ƒ
ํ”„๋กœํ•„_์ˆ˜์ • แ„‰แ…กแ†ผแ„ƒแ…ขแ„‡แ…กแ†ผ แ„‘แ…ณแ„…แ…ฉแ„‘แ…ตแ†ฏ, แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ แ„‰แ…ตแ†ซแ„€แ…ฉ แ„€แ…ฉแ†ผแ„‹แ…ฒ ๋กœ๊ทธ์•„์›ƒ

(๐Ÿ”ผ Top)

9. ๐ŸŒŸ ์ฃผ์š” ์ฝ”๋“œ

kakao Map API & react-kakao-maps-sdk

์นด์นด์˜ค ๋งต API์™€ React ์นด์นด์˜ค ์ง€๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ๊ณ  ์‚ฌ์šฉ์ž์˜ ํŽธ์˜์„ฑ์„ ์œ„ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ๊ทธ๋ ค์ง„ ์ง€๋„ ์•ˆ์— ๊ฒฝ๋กœ์˜ ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๋กœ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ์„ ๋“ค์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ค‘์‹  ์ขŒํ‘œ๊ฐ’์„ ๊ตฌํ•˜์—ฌ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ œํ•œ์ ์ธ ๋ฐฑ์—”๋“œ API ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ง€๋„์™€ ์„ ์˜ ์ •๋ณด๋ฅผ JSON.stringify๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜์‹œ์ผฐ๊ณ  ๋ฐ์ดํ„ฐ ํ†ต์‹  ์ดํ›„ JSON.parse๋กœ ๊ฐ์ฒดํ™”ํ•˜์—ฌ ์ง€๋„์™€ ์„ ์„ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ด์—ˆ์Šต๋‹ˆ๋‹ค.

const drawLineOnNewMap = () => {
  if (clickPosition) {
    const container = document.getElementById("newMap");

    // ์„ ์˜ ์‹œ์ž‘์ , ์ค‘๊ฐ„์ , ๋์  ๊ณ„์‚ฐ
    const options = {
      draggable: false,
      zoomable: false,
      isableDoubleClick: false,
      disableDoubleClickZoom: false,
      center: clickPosition,
      center: new kakao.maps.LatLng(centerLat, centerLng),
      level: 6,
    };

    // ์ง€๋„ ์ƒ์„ฑ
    const newMap = new kakao.maps.Map(container, options);

    // ์„  ์ƒ์„ฑ
    new kakao.maps.Polyline({
      map: newMap,
      path: linePoints,
      strokeWeight: 3,
      strokeColor: "#db4040",
      strokeOpacity: 1,
      strokeStyle: "solid",
    });

    // ์ง€๋„ ๋ฐ์ดํ„ฐ
    const mapState = {
      center: {
        lat: newMap.getCenter().getLat(),
        lng: newMap.getCenter().getLng(),
      },
      level: newMap.getLevel(),
    };

    // ์„  ๋ฐ์ดํ„ฐ
    const linePointsData = linePoints.map((point) => ({
      lat: point.getLat(),
      lng: point.getLng(),
    }));

    // ์„  ๋ฐ์ดํ„ฐ ๋ฌธ์ž์—ดํ™”
    const stringifylinePointsData = JSON.stringify(linePointsData);

    // ์ง€๋„ ๋ฐ์ดํ„ฐ ๋ฌธ์ž์—ดํ™”
    const serialized = JSON.stringify(mapState);

    // ์ง€๋„ ์ข…ํ•ฉ ๋ฐ์ดํ„ฐ
    const mapInfo = {
      map: serialized,
      line: stringifylinePointsData,
    };

    // ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ฌ์šฉ์ž๋ฅผ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋กœ ์ด๋™์‹œํ‚ค๊ณ , mapInfo ๊ฐ์ฒด๋ฅผ state์— ๋‹ด์•„ ์ „๋‹ฌ
    setMapInfo(mapInfo);
    navigate(`/profile/${userInfo.accountname}/addcourse`, {
      state: { data: mapInfo },
    });
  }
};

// ์ƒ์„ธ ํŽ˜์ด์ง€ ์ง€๋„ ๋‚˜ํƒ€๋‚ด๊ธฐ
useEffect(() => {
  if (location.state.data) {
    const container = document.getElementById("newMap");

    // ์ง€๋„ ์ •๋ณด ๊ฐ์ฒดํ™”
    const mapInfo = JSON.parse(location.state.data.map);

    // ์„  ์ •๋ณด ๊ฐ์ฒดํ™”
    const lineInfo = JSON.parse(location.state.data.line);

    // ์ง€๋„ ์ค‘๊ฐ„ ์ง€์ 
    const center = new kakao.maps.LatLng(
      mapInfo.center.lat,
      mapInfo.center.lng
    );

    const options = {
      // ์ƒ๋žต
    };

    // ์ง€๋„ ์ƒ์„ฑ
    const newMap = new kakao.maps.Map(container, options);

    // ์„  ์ƒ์„ฑ
    const linePointsLatLng = lineInfo.map(
      (point) => new kakao.maps.LatLng(point.lat, point.lng)
    );

    new kakao.maps.Polyline({
      //  ์ƒ๋žต
    });
  }
}, [location.state.data]);

// ํ”„๋กœํ•„ ํŽ˜์ด์ง€๋กœ ์ง€๋„ ๋ฐ์ดํ„ฐ ์ „์†ก ์ด๋™
const handleSubmitMap = async (event) => {
  event.preventDefault();

  const mapData = {
    product: {
      itemName: courseName,
      price: parseInt(courseLength),
      link: courseReview,
      itemImage: JSON.stringify(location.state.data),
    },
  };

  const response = await postCourseUpload(mapData);
  response && navigate(`/profile/${userInfo.accountname}`);
};

10. ๐Ÿ“ฆ ํด๋” ๊ตฌ์กฐ

๐Ÿƒ jubging
โ”œโ”€ ๐Ÿ“ฆ public
โ”‚  โ”œโ”€ ๐Ÿ“„ favicon.ico
โ”‚  โ””โ”€ ๐Ÿ“„ index.html
โ”œโ”€ ๐Ÿ“ฆ src
โ”‚  โ”œโ”€ ๐Ÿ“‚ api
โ”‚  โ”œโ”€ ๐Ÿ“‚ assets
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ fonts
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ icon
โ”‚  โ”‚  โ””โ”€ ๐Ÿ“‚ images
โ”‚  โ”œโ”€ ๐Ÿ“‚ components
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ common
โ”‚  โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Alert
โ”‚  โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Button
โ”‚  โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ ChatList
โ”‚  โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Header
โ”‚  โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Input
โ”‚  โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Modal
โ”‚  โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Navbar
โ”‚  โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Profile
โ”‚  โ”‚  โ”‚  โ””โ”€ ๐Ÿ“‚ UserList
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ kakaomap
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Post
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Splash
โ”‚  โ”œโ”€ ๐Ÿ“‚ context
โ”‚  โ”œโ”€ ๐Ÿ“‚ hooks
โ”‚  โ”œโ”€ ๐Ÿ“‚ pages
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ AddCourse
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Chat
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ ChatList
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ CourseDetail
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Follow
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Home
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Loading
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Login
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ NewsLetter
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ NotFound
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Post
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Profile
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Search
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ Sign
โ”‚  โ”‚  โ”œโ”€ ๐Ÿ“‚ SplashScreen
โ”‚  โ”‚  โ””โ”€ ๐Ÿ“‚ Upload
โ”‚  โ”œโ”€ ๐Ÿ“‚ recoil
โ”‚  โ”œโ”€ ๐Ÿ“‚ routes
โ”‚  โ”œโ”€ ๐Ÿ“‚ styles
โ”‚  โ”œโ”€ ๐Ÿ“„ App.js
โ”‚  โ”œโ”€ ๐Ÿ“„ index.js
โ”‚  โ”œโ”€ ๐Ÿ“„ .gitignore
โ”‚  โ”œโ”€ ๐Ÿ“„ package-lock.json
โ”‚  โ”œโ”€ ๐Ÿ“„ package.json
โ”‚  โ””โ”€ ๐Ÿ“„ README.md

11. โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง ํ•  ๋ถ€๋ถ„

  • ์•„์ง ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•œ ์ฝ”์Šค ์ˆ˜์ • ๋ฐ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ์ค‘๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์ด๊ธฐ
  • ๋ฐ˜์‘ํ˜• ์ž‘์—…(pc, ํƒœ๋ธ”๋ฆฟ) ๋ฐ ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ ์›น์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ
  • ์ด๋ฏธ์ง€ ์••์ถ• ๋ฐ Sprite ๊ธฐ๋ฒ•, Lazy-loading์„ ํ™œ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ Œ๋”๋ง ์†๋„ ํ–ฅ์ƒ
  • UI ๊ฐœ์„ ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข€ ๋” ์นœ์ ˆํ•œ UX ์ œ๊ณต
  • useMemo, useRef ๋“ฑ ๋ฆฌ์•กํŠธ ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ๋ Œ๋”๋ง ๋ฐฉ์ง€

12. โค๏ธ ํšŒ๊ณ  ๋ฐ ์†Œ๊ฐ โค๏ธ

๊น€์ง€ํ—Œ

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

๊น€ํ•˜์˜

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

์ •ํ˜„์ง€

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

์„œ๋™์ฃผ

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

(๐Ÿ”ผ Top)

About

๐Ÿƒ ๋‚˜์˜ ํ”Œ๋กœ๊น… ๊ฒฝํ—˜์„ ๊ธฐ๋กํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” SNS ํ”Œ๋žซํผ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages