/yeondu-market

๐ŸŒฑ ํ”„๋ก ํŠธ์—”๋“œ ์Šค์ฟจ 3ํŒ€์˜ ์—ฐ๋‘๋งˆ์ผ“ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

Primary LanguageJavaScript

๊ฑด๊ฐ•ํ•œ ๋ ˆ์‹œํ”ผ, ์—ฐ๋‘๋งˆ์ผ“ ๐ŸŒฟ

์—ฐ๋‘๋งˆ์ผ“

๋ชฉ์ฐจ
  1. ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ
  2. ์š”๊ตฌ์‚ฌํ•ญ
  3. ํŒ€์› ์†Œ๊ฐœ
  4. ์—ญํ•  ๋ถ„๋‹ด
  5. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
  6. ํ”„๋กœ์ ํŠธ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ๋ฐฉ๋ฒ•
  7. UI
  8. ํ•ต์‹ฌ ์ฝ”๋“œ
  9. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋ฐ ๋ ˆ์Šจ๋Ÿฐ
  10. ํด๋” ๊ตฌ์กฐ

1. ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๐Ÿ‘ฉ ์—ฐ๋‘๋งˆ์ผ“์€ ๋ฐฐ๋‹ฌ์Œ์‹์— ์ง€์นœ 1์ธ ๊ฐ€๊ตฌ๋ฅผ ์œ„ํ•œ ์˜จ๋ผ์ธ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

๐Ÿš ์ž์‹ ๋งŒ์˜ ๊ฑด๊ฐ•ํ•˜๊ณ  ๋ง›์žˆ๋Š” ๋ ˆ์‹œํ”ผ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋”ฐ๋œปํ•œ ๋ฌธํ™”๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฅฆ ์ž์‹ ์˜ ์Šคํ† ์–ด์—์„œ ์ง์ ‘ ์žฌ๋ฐฐํ•œ ์ฑ„์†Œ ํ˜น์€ ์ƒํ’ˆ์„ ํŒ๋งคํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ฌ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ์ผ์ƒ์„ ๊ณต์œ ํ•˜๋ฉฐ ํŒ”๋กœ์šฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์œ ์ €์˜ ๊ฒŒ์‹œ๊ธ€์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ฌ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํŒ๋งค์ž์—๊ฒŒ ์ƒํ’ˆ ๋ฌธ์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์š”๊ตฌ์‚ฌํ•ญ

  • ์ธ์ฆ : ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ํ”„๋กœํ•„ ์„ค์ •, ์œ ํšจ์„ฑ ํ‰๊ฐ€

  • ๊ฒŒ์‹œ๊ธ€ : ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ/์‹ ๊ณ , ๋‹ค์ค‘ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์—…๋กœ๋“œ/์ˆ˜์ •/๋ฏธ๋ฆฌ๋ณด๊ธฐ

  • ์ƒํ’ˆ : ์ƒํ’ˆ ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ, ์ด๋ฏธ์ง€ ํŒŒ์ผ ์—…๋กœ๋“œ/์ˆ˜์ •/๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์œ ํšจ์„ฑ ํ‰๊ฐ€

  • ๋Œ“๊ธ€ : ๋Œ“๊ธ€ ๋“ฑ๋ก/์‚ญ์ œ/์‹ ๊ณ 

  • ๊ฒ€์ƒ‰ : ์œ ์ € ๊ฒ€์ƒ‰

  • ํŒ”๋กœ์šฐ : ์œ ์ € ํŒ”๋กœ์šฐ/์–ธํŒ”๋กœ์šฐ

  • ์ข‹์•„์š” : ๊ฒŒ์‹œ๋ฌผ ์ข‹์•„์š” / ์ทจ์†Œ


(๐Ÿ”ผ Top)

3. ํŒ€์› ์†Œ๊ฐœ

๊ตฌ๋‚˜์˜ ์ด์˜ˆ์€ ์ž„์ˆ˜์ง„ ์ž„์ˆ˜ํ˜„
๐Ÿ”— GitHub, ๊ณ„ํš ๋ฆฌ๋” ๐Ÿ”— GitHub, ๊ฐœ๋ฐœ ๋ฆฌ๋” ๐Ÿ”— GitHub, ๊ธฐ๋ก ๋ฆฌ๋” ๐Ÿ”— GitHub, ํšŒ๊ณ  ๋ฆฌ๋”

4. ์—ญํ•  ๋ถ„๋‹ด

image

(๐Ÿ”ผ Top)

5. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

[๊ฐœ๋ฐœ ๊ธฐ๊ฐ„] 2022.6.27 ~ 2022.8.12

[๊ธฐ์ˆ ]

  • FrontEnd: React, React-router, Hooks
  • BackEnd: ์ œ๊ณต๋œ API ์‚ฌ์šฉ

[ํ˜‘์—… ๋„๊ตฌ]

  • Discord: ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•œ ํ™”๋ฉด ๊ณต์œ 
  • GitHub Wiki: ์ฃผ์š” ํšŒ์˜๋ก, ์ปจ๋ฒค์…˜
  • Google Docs: ์ผ์ƒ ํšŒ์˜๋ก

[์ด์Šˆ ๊ด€๋ฆฌ]

[Git Flow]

๋น ๋ฅธ ๊ฐœ๋ฐœ ์ž‘์—…์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Git Flow๋ฅผ ๋„์ž…ํ•˜์˜€์œผ๋ฉฐ,
ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํฌ์ง€ ์•Š์•„ ์„ธ ๊ฐ€์ง€์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. (๊ด€๋ จ Wiki)

  • main: ์ •์‹ ๋ฐฐํฌ๋œ ๋ฒ„์ „์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ธŒ๋žœ์น˜
  • develop: ๋‹ค์Œ ๋ฒ„์ „ ์ถœ์‹œ๋ฅผ ์œ„ํ•œ ์ตœ์‹  ์ฝ”๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ธŒ๋žœ์น˜
  • feature: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋ธŒ๋žœ์น˜๋กœ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜๋ฉด ์‚ญ์ œ๋˜๋Š” ๋ธŒ๋žœ์น˜

[์ปจ๋ฒค์…˜]

๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ํ†ต์ผ์„ฑ๊ณผ ํšจ์œจ์ ์ธ ์ด์Šˆ ํŠธ๋ž˜ํ‚น์„ ์œ„ํ•ด ์ปจ๋ฒค์…˜์„ ์ง€์ •ํ•˜์—ฌ commit, PR ์‹œ์— ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. (๊ด€๋ จ Wiki)

Feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ
Fix: ๋ฒ„๊ทธ๋ฅผ ๊ณ ์นœ ๊ฒฝ์šฐ
Design: CSS๋“ฑ ์‚ฌ์šฉ์ž UI ๋””์ž์ธ ๋ณ€๊ฒฝ
Style: ์ฝ”๋“œ ํฌ๋งท ๋ณ€๊ฒฝ, ์„ธ๋ฏธ ์ฝœ๋ก  ๋ˆ„๋ฝ, ์ฝ”๋“œ ์ˆ˜์ •์ด ์—†๋Š” ๊ฒฝ์šฐ
Refactor: ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
Comment: ํ•„์š”ํ•œ ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ
Docs: ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
Chore: ๋นŒ๋“œ ํƒœ์ŠคํŠธ ์—…๋ฐ์ดํŠธ, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ(ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ X)
Rename: ํŒŒ์ผ ํ˜น์€ ํด๋”๋ช…์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…๋งŒ์ธ ๊ฒฝ์šฐ
Remove: ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ
Test: ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€, ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง
!BREAKING CHANGE: ์ปค๋‹ค๋ž€ API ๋ณ€๊ฒฝ์˜ ๊ฒฝ์šฐ
!HOTFIX: ๊ธ‰ํ•˜๊ฒŒ ์น˜๋ช…์ ์ธ ๋ฒ„๊ทธ๋ฅผ ๊ณ ์ณ์•ผํ•˜๋Š” ๊ฒฝ์šฐ

(๐Ÿ”ผ Top)


6. ํ”„๋กœ์ ํŠธ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ๋ฐฉ๋ฒ•

npm install
npm start

7. UI

0. Splash 1. ํšŒ์›๊ฐ€์ž…
2. ํ”„๋กœํ•„ ์„ค์ • 3. ๋กœ๊ทธ์ธ
4. ๊ฒ€์ƒ‰ 5. ํ™ˆ ํ”ผ๋“œ
6. ๊ฒŒ์‹œ๋ฌผ ๋“ฑ๋ก 7. ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •
8. ๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ 9. ๊ฒŒ์‹œ๊ธ€ ๋Œ“๊ธ€ ๋“ฑ๋ก
10. ๊ฒŒ์‹œ๋ฌผ ๋Œ“๊ธ€ ์‹ ๊ณ  11. ๋‚ด ํ”„๋กœํ•„
12. ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ˆ˜์ • 13. ํƒ€ ์œ ์ € ํ”„๋กœํ•„
14. ํŒ”๋กœ์šฐ 15. ๋กœ๊ทธ์•„์›ƒ
16. ํŒ๋งค ์ƒํ’ˆ ๋“ฑ๋ก 17. ํŒ๋งค ์ƒํ’ˆ ์ˆ˜์ •
18. ์ฑ„ํŒ…๋ฐฉ 19. ์ข‹์•„์š”

(๐Ÿ”ผ Top)


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

1. map()

  • ํŒŒ์ผ๋ช…: <PostAlbum.jsx> ๋“ฑ ๋‹ค์ˆ˜
  • ์„ ์ • ์ด์œ : ๊ฒŒ์‹œ๊ธ€, ์ƒํ’ˆ, ํŒ”๋กœ์›Œ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ Œ๋”๋ง ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋†’๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์„ค๋ช…: ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ์˜ ์•„์ดํ…œ์ด ํ•˜๋‚˜ ์ด์ƒ์ด๋ผ๋ฉด, ์•„์ดํ…œ์„ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•˜๋ฉฐ PostAlbumItem ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉฐ props๋กœ ์ด๋ฏธ์ง€ ์•„์ดํ…œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค. ์ด๋•Œ, ๊ฐ๊ฐ์˜ ์š”์†Œ์—๋Š” ๊ณ ์œ ํ•œ ํ‚ค ๊ฐ’์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋ฉฐ ์ง€์ผœ์ง€์ง€ ์•Š์„ ์‹œ์— ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
{imageList && imageList.length > 0 
    ? imageList.map((imageList, id) => { 
        return ( 
            <div key={id} className="postAlbum">
                <PostAlbumItem imageList={imageList}/> 
            </div> 
        ); 
    })
: null}

2. axios GET ์š”์ฒญ

  • ํŒŒ์ผ๋ช…: <Search.jsx> ๋“ฑ ๋‹ค์ˆ˜
  • ์„ ์ • ์ด์œ : ๋™์ ์œผ๋กœ ๋ฐ›์•„์˜จ ๊ฒฐ๊ณผ๋ฅผ ๋ฟŒ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ์€ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ๋ฟ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋งŒํผ ์ค‘์š”๋„๊ฐ€ ๋†’๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์„ค๋ช…: ํ‚ค์›Œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด useEffect Hook์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ๋น„๋™๊ธฐ์ ์œผ๋กœ GET ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด async/await ๋ฌธ๋ฒ•๊ณผ axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
useEffect(()  =>  {
    if (keyword) {
        const  handleGetUserInfo  =  async  ()  =>  {
            try  {
                const  response  =  await  axios.get(
                    BASE_URL  +  "/user/searchuser/?keyword="  +  keyword,
                    {
                        headers:  {
                            Authorization:  `Bearer ${token}`,
                        },
                    }
                );
                setSearchUser(response.data);
            }  catch (err) {
                console.error(err);
            }
        };
    handleGetUserInfo();
    }
}, [keyword]);

3. ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

  • ํŒŒ์ผ๋ช…: <UploadPost.jsx>
  • ์„ ์ • ์ด์œ : ์ฒ˜์Œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ FileReader ๊ฐ์ฒด์™€ readAsDataURL ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์†Œํ–ˆ์ง€๋งŒ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด์˜ฌ ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” API์ธ ๋งŒํผ ์ค‘์š”๋„๊ฐ€ ๋†’๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์„ค๋ช…: FileReader ์ธ์Šคํ„ฐ์Šค์˜ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋  img ํƒœ๊ทธ์˜ ๊ธฐ์กด imgSrc ๋ฐฐ์—ด์„ ๋ฐ›์•„์˜ค๋ฉด์„œ result ๊ฐ’์„ 3๊ฐœ๊นŒ์ง€ ์—ฐ์ด์–ด ๋‹ด์•„์ฃผ๊ธฐ ์œ„ํ•ด useState Hook์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
const imgPreview = (file) => { 
    const reader = new FileReader(); 
    reader.readAsDataURL(file); 
    return new Promise((resolve) => { 
        reader.onload = () => { 
            setImgSrc([...imgSrc, reader.result]); 
            resolve(); 
        }; 
    }); 
};

(๐Ÿ”ผ Top)


9. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋ฐ ๋ ˆ์Šจ๋Ÿฐ

๐Ÿ‘ฉ๐Ÿป ๋‚˜์˜

  • ๊ฒŒ์‹œ๊ธ€ ์—…๋กœ๋“œ ํŽ˜์ด์ง€ ์ค‘๋ณต ๋ Œ๋”๋ง ์ด์Šˆ (๋ธ”๋กœ๊ทธ)
    : ์ƒ์„ธํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด /:postId ๋ฅผ ์‚ฌ์šฉํ•ด ๋™์ ์œผ๋กœ ์ธ์ž๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ ์ž…์žฅ์—์„œ /upload ๋˜ํ•œ ์ธ์ž๋กœ ์ธ์‹ํ•ด ์ค‘๋ณต ๋ Œ๋”๋ง๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. exact ์†์„ฑ์€ ์ด์™€ ๊ด€๋ จ์—†์ด ์ •ํ™•ํžˆ ํ•ด๋‹น๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ผ๋ฉด ๋ชจ๋‘ ๋ Œ๋”๋งํ•ด์ฃผ๋ฏ€๋กœ ๊ฐ€์žฅ ๋จผ์ € ์ผ์น˜ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•ด์ฃผ๋Š” Switch ๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒŒ์‹œ๊ธ€ ์—…๋กœ๋“œ ์‹œ ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋Šฅ
    : ์ด๋ฏธ์ง€ ์ฃผ์†Œ ์ž์ฒด๋กœ๋Š” ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด FileReader ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ํ›„ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ์–ป๊ธฐ ์œ„ํ•ด readAsDataURL ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๐Ÿ‘ฉ๐Ÿป ์˜ˆ์€

  • modal์ฐฝ๊ณผ alert์ฐฝ ์—ฐ๊ฒฐ
    : ๋ชจ๋‹ฌ์ฐฝ๊ณผ ์•Œ๋ฆผ์ฐฝ์„ ์—ฐ๊ฒฐํ•  ๋•Œ props๋กœ ์ „๋‹ฌ ๋ฐ›์€ closeModal์„ ์ด์šฉํ•ด ๋ชจ๋‹ฌ ์™ธ๋ถ€๋ฅผ ํด๋ฆญํ•˜๋ฉด closeModal์ด ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‹ฌ ์™ธ๋ถ€๋ฅผ ํด๋ฆญํ•˜๋ฉด ์•Œ๋ฆผ์ฐฝ์ด ๋œจ์ง€ ์•Š๊ณ  ๊บผ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‹ฌ์ฐฝ์„ ํด๋ฆญํ•ด๋„ ์•„๋ž˜์— ์žˆ๋Š” ๋ชจ๋‹ฌ์ฐฝ ์™ธ๋ถ€๊นŒ์ง€ ์ „๋‹ฌ๋˜์ง€ ์•Š๋„๋ก e.stopPropagation()์„ ์‚ฌ์šฉํ•ด ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ๋ง‰์•˜์Šต๋‹ˆ๋‹ค.

  • ์ƒํ’ˆ ๋“ฑ๋ก ์ค‘ price
    : ์ƒํ’ˆ ๋“ฑ๋ก์‹œ price๋ฅผ ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ 1000์› ๋‹จ์œ„๋งˆ๋‹ค โ€˜,โ€™๋ฅผ ๋ถ™์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. replace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ โ€˜,โ€™๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ „๋‹ฌํ•ด์ฃผ์—ˆ๋Š”๋ฐ ํ•˜๋‚˜๋งŒ ์ œ๊ฑฐ ๋˜๊ณ  ,๋’ค์˜ ์ˆซ์ž๊ฐ€ ์‚ญ์ œ๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. replaceAll์„ ์‚ฌ์šฉํ•ด โ€˜.โ€™๋ฅผ ์ „์ฒด ์ œ๊ฑฐํ•˜์—ฌ ์ˆซ์ž๋ฅผ ๋ณด๋‚ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์œ ์ €ํ”„๋กœํ•„์—์„œ ํ”„๋กœํ•„๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ์ด์Šˆ
    : ์œ ์ €ํ”„๋กœํ•„์—์„œ tapmenu์— ์žˆ๋Š” ํ”„๋กœํ•„๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด myprofile๋กœ ๊ฐ€์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. useEffect์—์„œ deps์— accountname์„ ๋„ฃ์–ด์ฃผ์–ด accountname์ด ๋ณ€๊ฒฝ๋ ๋•Œ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€ ์ฃผ์†Œ ์ „๋‹ฌ
    : ์ด๋ฏธ์ง€ ์ฃผ์†Œ๋ฅผ api์— ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๋ฏธ์ง€ ์ด๋ฆ„๋งŒ ์ „๋‹ฌ์„ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ ๋กœ์ปฌ์—์„œ๋Š” ์ž˜ ๋Œ์•„๊ฐ”์ง€๋งŒ 1๊ธฐ๋ถ„๋“ค ์„œ๋ฒ„์—์„œ๋Š” ์ €ํฌ๊ฐ€ ์˜ฌ๋ฆฐ ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ํ˜„์ƒ๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋งŒ๋‹ค๋ฆฐ์ฃผ์†Œ (https://mandarin.api.weniv.co.kr/)๋ฅผ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค์ด์˜€์Šต๋‹ˆ๋‹ค.

  • ๐Ÿ’ก ๋ ˆ์Šจ๋Ÿฐ: useLocation ์‚ฌ์šฉ
    : ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ props๋กœ ์ „๋‹ฌํ•ด์ค„์ˆ˜๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์ด ๋˜์–ด์„œ useLocation์— ์ •๋ณด๋ฅผ ๋‹ด์•„ ์‚ฌ์šฉํ•ด์ฃผ์–ด์„œ link๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ฉ๐Ÿป ์ˆ˜์ง„

  • disabled ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ๋•Œ
    : ๋ฒ„ํŠผ์— disabled๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•ด ๋‹นํ™ฉํ–ˆ๋Š”๋ฐ css์˜ pointer-events ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ
    : ํ”„๋กœํ•„ ์„ค์ •๊ณผ ์ˆ˜์ • ๋ถ€๋ถ„์— ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ปดํฌ๋„ŒํŠธํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ์—๊ฒŒ ์ „๋‹ฌํ•ด์•ผ ํ–ˆ๋Š”๋ฐ ๊ทธ ๊ณผ์ •์—์„œ ์ž์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๐Ÿ‘ฉ๐Ÿป ์ˆ˜ํ˜„

  • ๐Ÿ’ก ๋ ˆ์Šจ๋Ÿฐ: ํŒ€์›์˜ ์ฝ”๋“œ์— ์ง‘์ค‘
    : ๋ณธ์ธ์˜ ์ฝ”๋“œ๋งŒ ์ง‘์ค‘ํ•˜๊ฒŒ ๋˜๊ณ  ์ž‘์„ฑ์„ ํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ๋ชจ๋‹ฌ์ฐฝ ์™ธ๋ถ€๋ฅผ ํด๋ฆญํ•˜๋ฉด ์•Œ๋ฆผ์ฐฝ์ด ๋œจ์ง€ ์•Š๊ณ  ๊บผ์ง€๋Š” ํ˜„์ƒ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋œํ›„ ์ˆ˜์ • ๋ฐฉ๋ฒ•์„ ์œ„ํ•ด ์ธํ„ฐ๋„ท์„ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ €ํฌ ํ๋ฆ„์— ๋งž๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์–ด๋ ค์› ๋˜ ์ค‘ ํŒ€์›์ด ์ €๋ž‘ ๊ฐ™์€ ๊ณ ๋ฏผ์„ ํ•˜์…จ๊ณ  ํ•ด๊ฒฐ์„ ํ•˜์…จ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋œ ํ›„ ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ํŒ€์›๋ถ„๋“ค์˜ ์ฝ”๋“œ๋ถ€ํ„ฐ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋œ๋‹ค์˜€์Šต๋‹ˆ๋‹ค.๊ฐ™์€ ๋ถ€๋ถ„์„ ๊ณ ๋ฏผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๊ณ  ์„œ๋กœ์˜ ํž˜์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋งŽ์ด ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

10. ํด๋” ๊ตฌ์กฐ

๐Ÿ“ฆpublic
 โ”ฃ ๐Ÿ“ƒindex.html
๐Ÿ“ฆsrc
 โ”ฃ ๐Ÿ“‚assets
 โ”ƒ โ”ฃ ๐Ÿ“‚icon
 โ”ฃ ๐Ÿ“‚components
 โ”ƒ โ”ฃ ๐Ÿ“‚button
 โ”ƒ โ”ฃ ๐Ÿ“‚chat
 โ”ƒ โ”ฃ ๐Ÿ“‚comment
 โ”ƒ โ”ฃ ๐Ÿ“‚common
 โ”ƒ โ”ฃ ๐Ÿ“‚constants
 โ”ƒ โ”ฃ ๐Ÿ“‚follow
 โ”ƒ โ”ฃ ๐Ÿ“‚loginjoin
 โ”ƒ โ”ฃ ๐Ÿ“‚modal
 โ”ƒ โ”ฃ ๐Ÿ“‚post
 โ”ƒ โ”ฃ ๐Ÿ“‚product
 โ”ƒ โ”ฃ ๐Ÿ“‚profile
 โ”ƒ โ”ฃ ๐Ÿ“‚search
 โ”ฃ ๐Ÿ“‚pages
 โ”ƒ โ”— ๐Ÿ“‚style
 โ”ฃ ๐Ÿ“ƒApp.js
 โ”ฃ ๐Ÿ“ƒindex.js
 โ”— ๐Ÿ“ƒreset.css

(๐Ÿ”ผ Top)