/final-17-breath-connect

๐Ÿƒํ•จ๊ป˜ ๋‹ฌ๋ฆฌ๋Š” ์ฆ๊ฑฐ์›€์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„, ๋“ค์ˆจ๋‚ ์ˆจ

Primary LanguageTypeScript

๐ŸŒฌ ๋“ค์ˆจ๋‚ ์ˆจ


image

ํ•จ๊ป˜ ๋‹ฌ๋ฆฌ๋Š” ์ฆ๊ฑฐ์›€์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„, ๋“ค์ˆจ๋‚ ์ˆจ ๐Ÿƒโ€โ™€๏ธ๐Ÿƒโ€โ™‚๏ธ


๋“ค์ˆจ๋‚ ์ˆจ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Test ID : bc30@naver.com
Test PW : bc12345!

๋ชฉ์ฐจ
  1. ์„œ๋น„์Šค ์†Œ๊ฐœ
  2. ํŒ€ ์†Œ๊ฐœ
  3. ๊ธฐ์ˆ  ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
  4. ๊ฐœ๋ฐœ ์ผ์ •
  5. ์—ญํ•  ๋ถ„๋‹ด
  6. ๊ตฌํ˜„ ๊ธฐ๋Šฅ
  7. ์ปจ๋ฒค์…˜
  8. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
  9. ํ˜‘์—… ๋ฌธํ™”
  10. ์ด์Šˆ ๊ด€๋ฆฌ
  11. ๋ฒ„๊ทธ ๊ด€๋ฆฌ

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

'๋“ค์ˆจ๋‚ ์ˆจ'์€ ๊ฐ™์€ ๋™๋„ค ํ˜น์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋™๋„ค์—์„œ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜ ๋‹ฌ๋ฆฌ๊ฑฐ๋‚˜ ์†Œ์‹์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” SNS/์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

  • ์ž์œ ๋กญ๊ฒŒ ๋›ฐ๋Š” ๋‚ ์งœ์™€ ์žฅ์†Œ๋งŒ ๊ฒŒ์‹œํ•œ๋‹ค๋ฉด ๋ˆ„๊ตฌ๋“ ์ง€ ํ•จ๊ป˜ ๋‹ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŒ”๋กœ์ž‰ํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ํŒ”๋กœ์ž‰ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์˜ ์†Œ์‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด๊ฐ€ ๋‹ฌ๋ฆฐ ๊ธฐ๋ก๊ณผ ์‚ฌ๋žŒ๋“ค์„ ์ด์›ƒ๋“ค์—๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๊ธ€์— ์ข‹์•„์š”, ๋Œ“๊ธ€์„ ํ†ตํ•ด ํ™œ๋ฐœํ•˜๊ฒŒ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



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

์œ„๋‹ˆ๋“œํŒ€์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค!

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


๐Ÿฟ ๊น€์šฉ๋• ๐Ÿ’œ ๋ฐ•์—ฐ์ฃผ ๐ŸŒฟ ๋ฐฑ์ˆ˜์—ฐ ๐Ÿ• ์ด์–‘๋ž˜




FrontEnd
Development%20Leader
FrontEnd
Communication%20Leader
FrontEnd
Design%20Leader
FrontEnd
Team%20Leader


๐Ÿ› ๏ธ 3. ๊ธฐ์ˆ  ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

FrontEnd BackEnd Design ํ˜‘์—…๋ฐฉ์‹ ์ปจ๋ฒค์…˜
์ œ๊ณต๋œ API



๐Ÿ“… 4. ๊ฐœ๋ฐœ ์ผ์ •



๐Ÿ“ 5. ์—ญํ•  ๋ถ„๋‹ด

๊น€์šฉ๋•

๐ŸŽจ UI

  • ๋งˆ์ด ํ”„๋กœํ•„ ํŽ˜์ด์ง€
  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ํŽ˜์ด์ง€
  • ํ™ˆ ํ”ผ๋“œ ํŽ˜์ด์ง€
  • ์ง€๋„ ์ƒ์„ธ ํŽ˜์ด์ง€

๐ŸŽถ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ

  • Button
  • Header
  • Footer
  • Map
  • Modal

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

  • ํ™ˆํ”ผ๋“œ์™€ ๋ฌดํ•œ ์Šคํฌ๋กค
  • ๋‚ด ํ”„๋กœํ•„ ๋ฐ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„
  • ์นด์นด์˜ค ์ง€๋„ api๋ฅผ ์ด์šฉํ•œ path ๊ทธ๋ฆฌ๊ธฐ
  • ๋Œ“๊ธ€ ์ˆ˜์ •
  • ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ, ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •

๐Ÿค ๊ธฐํƒ€

  • ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด์˜ ๊ทผ์›
  • ์ง€๋„ api ์ž๋ฃŒ์กฐ์‚ฌ

๋ฐ•์—ฐ์ฃผ

๐ŸŽจ UI

  • ํŒ”๋กœ์ž‰ ๋ชฉ๋ก ํŽ˜์ด์ง€
  • ํŒ”๋กœ์›Œ ๋ชฉ๋ก ํŽ˜์ด์ง€
  • ์ฑ„ํŒ… ํŽ˜์ด์ง€
  • 404 ํŽ˜์ด์ง€

๐ŸŽถ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ

  • Follow
  • Search

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

  • ํŒ”๋กœ์ž‰๊ณผ ํŒ”๋กœ์›Œ ๋ฆฌ์ŠคํŠธ
  • ์ฑ„ํŒ… ๋ฆฌ์ŠคํŠธ
  • ์ฑ„ํŒ… ๋ฃธ
  • ๊ฒ€์ƒ‰ debounce๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”

๐Ÿค ๊ธฐํƒ€

  • ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ, ๋ฒˆ๊ฐœ ํšŒ์˜๋ก ์ž‘์„ฑ
  • ๋…ธ์…˜ ๊ด€๋ฆฌ

๋ฐฑ์ˆ˜์—ฐ

๐ŸŽจ UI

  • Splash ํŽ˜์ด์ง€
  • ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€
  • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
  • ํ”„๋กœํ•„ ์„ค์ • ๋ฐ ์ˆ˜์ • ํŽ˜์ด์ง€

๐ŸŽถ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ

  • Input
  • Loading

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

  • ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ํ”„๋กœํ•„ ์„ค์ • ๋ฐ ์ˆ˜์ • ์‹œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ์ฐธ์—ฌํ•˜๊ธฐ์™€ ์ฐธ์—ฌํ•˜๊ธฐ ์ทจ์†Œ
  • ๋Œ“๊ธ€ ์ž‘์„ฑ
  • ์ด๋ฏธ์ง€ ์••์ถ•์„ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
  • api ๋ชจ๋“ˆํ™” ๋ฐ ์นด์นด์˜ค ์ง€๋„ api ์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜

๐Ÿค ๊ธฐํƒ€

  • ํ”„๋กœ์ ํŠธ ๋””์ž์ธ ๊ด€๋ฆฌ
  • ๊นƒํ—™ ์ด์Šˆ ๋ฐ PR ์ •๋ฆฌ

์ด์–‘๋ž˜

๐ŸŽจ UI

  • ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€
  • ๊ฒŒ์‹œ๋ฌผ ์ž‘์„ฑ ํŽ˜์ด์ง€
  • ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ธ ํŽ˜์ด์ง€

๐ŸŽถ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ

  • Comment
  • Modal
  • Alert

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

  • ์œ ์ € ๊ฒ€์ƒ‰
  • ๊ฒŒ์‹œ๊ธ€ ์—…๋กœ๋“œ
  • ๋Œ“๊ธ€ ์‚ญ์ œ
  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ๋‹คํฌ๋ชจ๋“œ ๊ตฌํ˜„

๐Ÿค ๊ธฐํƒ€

  • ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ, ๋ฒˆ๊ฐœ ํšŒ์˜ ๋ฆฌ๋”
  • ํ”„๋กœ์ ํŠธ ์ผ์ • ๊ด€๋ฆฌ


๐ŸŒป 6. ๊ตฌํ˜„ ๊ธฐ๋Šฅ

  • ํ™ˆ
๐Ÿ”—์Šคํ”Œ๋ž˜์‰ฌ ๐Ÿ”—ํšŒ์›๊ฐ€์ž… ๐Ÿ”—ํ”„๋กœํ•„ ์„ค์ •
แ„‰แ…ณแ„‘แ…ณแ†ฏแ„…แ…ขแ„‰แ…ฑ แ„’แ…ฌแ„‹แ…ฏแ†ซแ„€แ…กแ„‹แ…ตแ†ธ แ„‘แ…ณแ„…แ…ฉแ„‘แ…ตแ†ฏ แ„‰แ…ฅแ†ฏแ„Œแ…ฅแ†ผ
๐Ÿ”—๋กœ๊ทธ์ธ ๐Ÿ”—ํ™ˆ ํ”ผ๋“œ ๐Ÿ”—๊ณ„์ • ๊ฒ€์ƒ‰
แ„…แ…ฉแ„€แ…ณแ„‹แ…ตแ†ซ แ„’แ…ฉแ†ท แ„‘แ…ตแ„ƒแ…ณ แ„€แ…จแ„Œแ…ฅแ†ผ แ„€แ…ฅแ†ทแ„‰แ…ขแ†จ
๐Ÿ”—ํŒ”๋กœ์ž‰ ํŒ”๋กœ์šฐ ๐Ÿ”—404 ๐Ÿ”—์ฑ„ํŒ…
แ„‘แ…กแ†ฏแ„…แ…ฉแ„‹แ…ตแ†ผ แ„‘แ…กแ†ฏแ„…แ…ฉแ„‹แ…ฎ 404 แ„Žแ…ขแ„แ…ตแ†ผ
  • ๊ฒŒ์‹œ๊ธ€
๐Ÿ”—๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ๐Ÿ”—๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ๐Ÿ”—๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ
แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ แ„Œแ…กแ†จแ„‰แ…ฅแ†ผ แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ แ„‰แ…ฎแ„Œแ…ฅแ†ผ แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ แ„‰แ…กแ†จแ„Œแ…ฆ
๐Ÿ”—๋Œ“๊ธ€ ์ž‘์„ฑ ๐Ÿ”—๋Œ“๊ธ€ ์‚ญ์ œ ๐Ÿ”—๋Œ“๊ธ€ ์‹ ๊ณ 
แ„ƒแ…ขแ†บแ„€แ…ณแ†ฏ แ„Œแ…กแ†จแ„‰แ…ฅแ†ผ แ„ƒแ…ขแ†บแ„€แ…ณแ†ฏ แ„‰แ…กแ†จแ„Œแ…ฆ แ„ƒแ…ขแ†บแ„€แ…ณแ†ฏ แ„‰แ…ตแ†ซแ„€แ…ฉ
๐Ÿ”—๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ๐Ÿ”—๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š” ๐Ÿ”—๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š” ์ทจ์†Œ
แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ แ„‰แ…กแ†ผแ„‰แ…ฆ แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ ์ข‹์•„์š” แ„€แ…ฆแ„‰แ…ตแ„€แ…ณแ†ฏ แ„Œแ…ฉแ‡‚แ„‹แ…กแ„‹แ…ญ ์ทจ์†Œ
  • ํ”„๋กœํ•„
๐Ÿ”—๋‚ด ํ”„๋กœํ•„ ๐Ÿ”—๋‚ด ํ”„๋กœํ•„ ์ˆ˜์ • ๐Ÿ”—์œ ์ € ํ”„๋กœํ•„ ํŒ”๋กœ์šฐ
แ„‚แ…ข แ„‘แ…ณแ„…แ…ฉแ„‘แ…ตแ†ฏ ๋‚ด แ„‘แ…ณแ„…แ…ฉแ„‘แ…ตแ†ฏ แ„‰แ…ฎแ„Œแ…ฅแ†ผ แ„‹แ…ฒแ„Œแ…ฅ แ„‘แ…ณแ„…แ…ฉแ„‘แ…ตแ†ฏ แ„‘แ…กแ†ฏแ„…แ…ฉแ„‹แ…ฎ


โ˜๏ธ 7. ์ปจ๋ฒค์…˜

Git ์ปจ๋ฒค์…˜

Emoji Code ๊ธฐ๋Šฅ Description
โœจ :sparkles: Feat ์ƒˆ ๊ธฐ๋Šฅ
โ™ป๏ธ :recycle: Refactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
๐Ÿ“ฆ :wrench: Chore ๋ฆฌ์†Œ์Šค ์ˆ˜์ •/์‚ญ์ œ
๐Ÿ› :bug: Fix ๋ฒ„๊ทธ ์ˆ˜์ •
๐Ÿ“ :memo: Docs ๋ฌธ์„œ ์ถ”๊ฐ€/์ˆ˜์ •
๐ŸŽจ :lipstick: Style UI/์Šคํƒ€์ผ ํŒŒ์ผ ์ถ”๊ฐ€/์ˆ˜์ •
๐ŸŽ‰ :tada: Init ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ / Init
โœ… :white_check_mark: Test ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€/์ˆ˜์ •
โช :rewind: Rewind ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋˜๋Œ๋ฆฌ๊ธฐ
๐Ÿ”€ :twisted_rightwards_arrows: Merge ๋ธŒ๋žœ์น˜ ํ•ฉ๋ณ‘
๐Ÿ—ƒ :card_file_box: DB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์ˆ˜์ •
๐Ÿ’ก :bulb: Comment ์ฃผ์„ ์ถ”๊ฐ€/์ˆ˜์ •
๐Ÿš€ :rocket: Deploy ๋ฐฐํฌ

Code ์ปจ๋ฒค์…˜

  • ์ž‘์€ ๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ '' ์‚ฌ์šฉ
  • ์ „์ฒด๋ฅผ ๋ฌถ๋Š” ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ ๋ช…์€ ๋์— container ์‚ฌ์šฉ
  • ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ ๋ช…์€ ํŒŒ์Šค์นผ ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ
  • ์ผ์น˜ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

ESLint์™€ Prettier

ESLint

{
  "extends": ["react-app", "react-app/jest", "prettier"],
  "rules": {
    "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
    "linebreak-style": 0
  }
}
  • "extends": ["react-app", "react-app/jest", "prettier"] : ๋‹ค๋ฅธ ESLint ๊ตฌ์„ฑ์„ ํ™•์žฅํ•˜๋Š” ์—ญํ• ๋กœ, Create React App ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๊ณ , Jest ๊ด€๋ จ ๊ทœ์น™๋„ ํ•จ๊ป˜ ํ™•์žฅํ•˜๋ฉฐ, ๋งˆ์ง€๋ง‰์œผ๋กœ Prettier์™€ ๊ด€๋ จ๋œ ๊ทœ์น™๋„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • "rules": { ... } ****: ESLint์˜ ๊ทœ์น™์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }] ****: ์ด ์„ค์ •์€ JSX๋ฅผ ์‚ฌ์šฉํ•˜๋Š” React ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.
    • [1, { "extensions": [".js", ".jsx"] }] ์€ ๊ฒฝ๊ณ ๋กœ ์„ค์ •๋˜์–ด โ€˜.jsโ€™ ๋˜๋Š” โ€˜.jsxโ€™ ํ™•์žฅ์ž๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ์—์„œ JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    • "linebreak-style": 0 : ๊ฐœํ–‰ ๋ฌธ์ž ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค. 0 ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด, ๊ฐœํ–‰ ๋ฌธ์ž ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Prettier

{
  "trailingComma": "es5",
  "tabWidth": 2,
  "semi": true,
  "singleQuote": true
}
  • "trailingComma" : ๋งˆ์ง€๋ง‰ ์š”์†Œ ๋’ค์— ์‰ผํ‘œ๋ฅผ ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. es5 ๊ฐ’์€ ES5 ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ๋งˆ์ง€๋ง‰ ์š”์†Œ ๋’ค์— ์‰ผํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • "tabWidth" : ํƒญ ๋ฌธ์ž์˜ ๋„ˆ๋น„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋“ค์—ฌ์“ฐ๊ธฐ์— ํƒญ ๋Œ€์‹  2๊ฐœ์˜ ๊ณต๋ฐฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • "semi" : ๋ฌธ์žฅ ๋์— ์„ธ๋ฏธ์ฝœ๋ก ์„ ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. true ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์„ธ๋ฏธ์ฝœ๋ก ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • "singleQuote" : ์ด ์„ค์ •์€ ๋ฌธ์ž์—ด์„ ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์Œ€์ง€ ํฐ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์Œ€์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. true ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋ฌธ์ž์—ด์„ ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.

๐ŸŒฑ 7. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

  • public/favicon/ : ํŒŒ๋น„์ฝ˜
  • src/assets/ : ์ „์—ญ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํฐํŠธ, ์Šคํ”„๋ผ์ดํŠธ ์ด๋ฏธ์ง€, ๋กœ๊ณ  ์ด๋ฏธ์ง€
  • src/atoms/ : ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์•„ํ†ฐ (UserAtom, LoginAtom)
  • src/components/ : ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ์™€ Map ์ปดํฌํŠธ
  • src/pages/ : ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ ํŽ˜์ด์ง€
  • src/routes/ : ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…
  • src/styles/ : ์ „์—ญ ์Šคํƒ€์ผ (layout, globalstyle, theme)

๐ŸŒฌ๏ธ ๋“ค์ˆจ๋‚ ์ˆจ
๐ŸŒฑpublic
 โ”ฃ ๐ŸŒฟfavicon.ico
 โ”— ๐ŸŒฟindex.html
๐ŸŒฑsrc
 โ”ฃ ๐ŸŒฟassets
 โ”ƒ โ”ฃ ๐Ÿชดfonts
 โ”ƒ โ”ฃ ๐Ÿชดimages
 โ”ƒ โ”— ๐Ÿชดsprite
 โ”ฃ ๐ŸŒฟatoms
 โ”ฃ ๐ŸŒฟcomponents
 โ”ƒ โ”ฃ ๐Ÿชดcommon
 โ”ƒ โ”ƒ โ”ฃ ๐ŸŒณAlert
 โ”ƒ โ”ƒ โ”ฃ ๐ŸŒณButton
 โ”ƒ โ”ƒ โ”ฃ ๐ŸŒณComment
 โ”ƒ โ”ƒ โ”ฃ ๐ŸŒณInput
 โ”ƒ โ”ƒ โ”ฃ ๐ŸŒณLoading
 โ”ƒ โ”ƒ โ”ฃ ๐ŸŒณModal
 โ”ƒ โ”ƒ โ”— ๐ŸŒณUser
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐ŸŒณFollow
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐ŸŒณSearch
 โ”ƒ โ”ฃ ๐ŸชดFooter
 โ”ƒ โ”ฃ ๐ŸชดHeader
 โ”ƒ โ”— ๐ŸชดMap
 โ”ฃ ๐ŸŒฟhooks
 โ”ฃ ๐ŸŒฟpages
 โ”ƒ โ”ฃ ๐ŸชดChatPage
 โ”ƒ โ”ฃ ๐ŸชดFeedPage
 โ”ƒ โ”ฃ ๐ŸชดFollowListPage
 โ”ƒ โ”ฃ ๐ŸชดLoginPage
 โ”ƒ โ”ฃ ๐ŸชดNotFoundPage
 โ”ƒ โ”ฃ ๐ŸชดPostPage
 โ”ƒ โ”ฃ ๐ŸชดProfilePage
 โ”ƒ โ”ƒ โ”ฃ ๐ŸŒณProfileEdit
 โ”ƒ โ”ฃ ๐ŸชดProfileSettingPage
 โ”ƒ โ”ฃ ๐ŸชดSearchPage
 โ”ƒ โ”ฃ ๐ŸชดSignupPage
 โ”ƒ โ”ฃ ๐ŸชดSnsLoginPage
 โ”ƒ โ”ฃ ๐ŸชดSplashPage
 โ”ƒ โ”— ๐ŸชดUploadPage
 โ”ฃ ๐ŸŒฟroutes
 โ”ฃ ๐ŸŒฟstyles
 โ”ฃ ๐ŸŒฟutils
 โ”ฃ ๐Ÿ“œApp.js
 โ”— ๐Ÿ“œindex.js



๐Ÿ’ช ํ˜‘์—… ๋ฌธํ™”

- Daily Scrum

  • ์ผ์‹œ: ํ‰์ผ ์˜ค์ „ 9์‹œ (15๋ถ„ ๋‚ด์™ธ)
  • ์žฅ์†Œ: [ํšŒ์˜์‹ค] ํ”„๋กœ์ ํŠธ 17์กฐ ๋””์Šค์ฝ”๋“œ (์นด๋ฉ”๋ผOn)
  • ๋‚ด์šฉ: ํšŒ๊ณ  ๋ฐ ์ž‘์—… ๊ณ„ํš
  • ๋Œ€ํ™”๋ฐฉ์‹: ์ •๋ณด ์ „๋‹ฌ์ด ์•„๋‹Œ ๋Œ€ํ™” ์ฃผ์ œ๊ฐ€ ๊ฐ€์ ธ์˜ค๋Š” ํšจ๊ณผ๋‚˜ ํ•ด๊ฒฐ์ฑ…์— ํ† ๋ก 

ํ•ต์‹ฌ ์ฝ”๋“œ

API ๋ชจ๋“ˆ Axios

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

import axios from 'axios';

const URL = 'https://api.mandarin.weniv.co.kr/';

/* ๊ธฐ๋ณธ ์ธ์Šคํ„ด์Šค */
export const instance = axios.create({
  baseURL: URL,
  headers: {
    'Content-Type': 'application/json',
  },
});

/* ์ด๋ฏธ์ง€ ์ธ์Šคํ„ด์Šค */
export const imgInstance = axios.create({
  baseURL: URL,
  headers: {
    'Content-Type': 'multipart/form-data',
  },
});

/* auth ์ธ์Šคํ„ด์Šค */
export const authInstance = axios.create({
  baseURL: URL,
  headers: {
    Authorization: `Bearer ${localStorage.getItem('token')}`,
    'Content-Type': 'application/json',
  },
});

/* content ์—…๋กœ๋“œ */
export const postContentUpload = async (token, post) => {
  const response = await authInstance.post(`/post/`, post, {
    headers: {
      Authorization: `B๋‹ค

Axios๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ API ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๊ณ  ์š”์ฒญ์„ ๋‹ด๋‹นํ•˜๋Š” ์ธ์Šคํ„ด์Šค์™€ ๊ฐ๊ฐ์˜ API ์š”์ฒญ ํ•จ์ˆ˜๋ฅผ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์˜ ํ˜•์‹๋„ ํ†ต์ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

kakao Map API & react-kakao-maps-sdk

์‚ฌ์šฉ์ž๋“ค์„ ์œ„ํ•ด ์‹œ์ž‘ ์œ„์น˜์™€ ์ข…๋ฅ˜ ์œ„์น˜๋ฅผ ์–ป์–ด์˜ค๋Š” ๊ธฐ๋Šฅ, path๋ฅผ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฃผ์†Œ๋ฅผ ๊ฐ’์ด ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์นด์นด์˜ค ๋งต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์นด์นด์˜ค ์ง€๋„ API์™€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฆฌ์•กํŠธ ์นด์นด์˜ค ์ง€๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

useEffect(() => {
    if (data.image) {
      try {
        const parsing = JSON.parse(data.image);
        const startLat = parsing[0].lat;
        const startLng = parsing[0].lng;
        const geocoder = new window.kakao.maps.services.Geocoder();
        const startLatlng = new window.kakao.maps.LatLng(startLat, startLng);

        geocoder.coord2Address(
          startLatlng.getLng(),
          startLatlng.getLat(),
          (result, status) => {
            if (status === window.kakao.maps.services.Status.OK) {
              const startPoint = result[0].address.address_name;
              setStartPoint(startPoint);
            }
          }
        );

        const endLat = parsing[parsing.length - 2].lat;
        const endLng = parsing[parsing.length - 2].lng;
        const endLatlng = new window.kakao.maps.LatLng(endLat, endLng);
				/* ๋งˆ์ง€๋ง‰ ์š”์†Œ = ์ด ๊ฑฐ๋ฆฌ */

        geocoder.coord2Address(
          endLatlng.getLng(),
          endLatlng.getLat(),
          (result, status) => {
            if (status === window.kakao.maps.services.Status.OK) {
              const endPoint = result[0].address.address_name;
              setEndPoint(endPoint);
            }
          }
        );
      } catch (error) {
        console.error(error);
      }
    }
  }, [data.image]);

๋ชจ๋‘๊ฐ€ ์ง€๋„ API๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์นด์นด์˜ค ์ง€๋„ API์—์„œ ๋ฐ›์•„์˜ค๋Š” ๋ฐ์ดํ„ฐ(์œ„๋„, ๊ฒฝ๋„)๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ(์ฃผ์†Œ ๊ฐ’)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ–ˆ๋Š”๋ฐ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„๊ทธ ๋ฌธ์ œ