[Main Project 3์ฃผ์ฐจ] 9.11 ~ 9.17
๊ธฐ๋ฅ ๊ตฌํ (ํ์ฐพ๊ธฐ/ํ์์ฐพ๊ธฐ ๊ฒ์ํ CRUD, ๋๊ธ, ๊ฒ์/ํํฐ)
๐ฌ ํ๋ก์ ํธ๊ฐ ๋๋ ํ์ ๋ฐ์ผ๋ฆฌ๋ก ์ ๋ฆฌํ๋ ๊ธฐ๋ก์ ๋ณด๋ฉฐ ํ๋ก์ ํธ ์ ์ฒด ๊ณผ์ ์ ์ ๋ฆฌํ์ฌ 4์ฃผ์ฐจ๋ก ๋๋์ด ์์ฑํ์ต๋๋ค.
3์ฃผ์ฐจ: ํ์ฌ๊ธ
๐ ๋ฐ๋ชจ๋ฐ์ด & ํ๋ก์ ํธ ์ ์ฒด ํ๊ณ
๐ฉ๐ป๐ป Github Repository https://github.com/sw2377/smoothie
๐ SUMMARY
9.11 MON
- ํ์ฐพ๊ธฐ/ํ์์ฐพ๊ธฐ ๊ฒ์ํ CRUD API Call ํ ์คํธ ์๋ฃ
9.12 TUE
- front-end 2์ฐจ merge
9.13 WED
1. ์ ๋ merge ํ ๋ฐ์ํ๋ authInstance ๊ด๋ จ ์๋ฌ ํด๊ฒฐ
2. ๋๊ธ ๊ธฐ๋ฅ ๊ตฌํ ์ค!
3. ํ๋ก ํธ์๋ ์์ ๋ฐฐํฌ (S3)
9.14 THU
1. ๐ง๐ป 3์ฐจ ๋ฉํ ๋ง ์ธ์
2. ์๋ฒ: ํ๋ ฅ์ ์ฃผ์ IP ์ ์ฉ
9.15 FRY
1. ํ์ฐพ๊ธฐ/ํ์์ฐพ๊ธฐ ๊ฒ์ํ ์์ ์์
2. ๋๊ธ ์ผ์ด์ค๋ณ CSS ์์
9.16 ~ 17 SAT, SUN
โก๏ธ ํ๋ก์ ํธ ๋ง๊ฐ์ผ์ด ์ฝ์์ด๋ผ ๋ง๋ฌด๋ฆฌ ์์ ์ง์
1. ํ์ฐพ๊ธฐ/ํ์์ฐพ๊ธฐ ๊ฒ์ํ ๋ฐ ๋๊ธ ๊ธฐ๋ฅ ๊ตฌํ
2. ๊ฒ์ํ ๊ฒ์/ํํฐ ๊ธฐ๋ฅ ๊ตฌํ
3. ๊ธฐ์ ์คํ ์์ด์ฝ ์ถ๊ฐ
๐ 3์ฃผ์ฐจ ํ๊ณ
๐ ๋ชฉ์ฐจ
๋๋ฏธ๋ฐ์ดํฐ → ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ฅ ๊ตฌํ
๋๊ธ๋ก ํ์ ์๋ฝํ๊ณ ์๋ฆผ ๋ณด๋ด๊ธฐ
โพ๏ธ ๋๊ธ ์ผ์ด์ค๋ณ CSS ์์โพ๏ธ ๋๊ธ ์๋ฝํ๊ธฐ ๋ฒํผ ํด๋ฆญ์ ์๋ ๊ตฌํ
๐ง๐ป 3์ฐจ ๋ฉํ ๋ง ์ธ์
๋ง๋ฌด๋ฆฌ ์์ ์ ํ๊ณ ์ถ์์ง๋ง…
๐ 3์ฃผ์ฐจ, ์์ ํ๋ฉฐ ๋๋ ๋ฌด์์ ๋ฐฐ์ ์๊น? (What I Learned)
1. react-quill ์ฌ์ฉํ๊ธฐ
๋๋ฏธ๋ฐ์ดํฐ → ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ฅ ๊ตฌํ
๋ด๊ฐ ๋ด๋นํ๋ ๋ ๊ฐ์ ๊ฒ์ํ์ ๋๋ฏธ ๋ฐ์ดํฐ๋ก๋ง ์์ ํ๋ค๊ฐ, API Call์ ํตํด ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์์ ์ ํ๊ธฐ ์์ํ๋ค. ํฌ์คํธ๋งจ๊ณผ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ HTTP ์์ฒญ๊ณผ ํ ์คํธ๋ฅผ ๋ฐ๋ณตํ๊ณ , ๊ฒ์๊ธ ์กฐํ๋ฅผ ์ ์ธํ ์์ฑ๊ณผ ์์ , ์ญ์ , ๋๊ธ์ ๋ชจ๋ ๋ก๊ทธ์ธ์ด ๋ ์ํ์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ ๊ณ์ ์ ๋ง๋ค์ด ํ ์คํธ๋ฅผ ํ๊ธฐ ์์ํ๋ค. ์ค์ ๋ก ๋ด๊ฐ ์์ ํ ํ์ด์ง์์๋ ๊ฒ์๋ฌผ์ ์ญ์ ํ๋ ํ์๋ ํ ์ ์์๊ธฐ ๋๋ฌธ์ (์ญ์ ๋ ๋ค๋ฅธ ํ๋ก ํธ ํ์๋ถ์ด ์์ ํ๋ ๋ง์ดํ์ด์ง์์๋ง ๊ฐ๋ฅํ๋ค) ์ญ์ ๊ธฐ๋ฅ์ ๋์์ ํ๋์ง๋ง ํ์ธํ๋ค.
์ฒ์ ์ฌ์ฉํด๋ณด๋ Redux Toolkit์ createAsyncThunk์ auth๋ฅผ ๋ด๋นํ ํ์๋ถ๊ป์ ๋ง๋ Axios Instance๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ๋ก์ง์ ์์ฑํ๋ค. ์ฌ์ค ์ด๋ฒ์ ์์ฑํ Redux Toolkit ์ฝ๋๋ ๊ฐ์๋ฅผ ์ ์๊ฐ ํ์ ๊ฐ์์ ์ต๋ํ ๋น์ทํ ํํ๋ก ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ์ ์ฉํ๊ฑฐ๋ผ, ๋ค์ ์์ฑํด๋ณด๋ผ๊ณ ํ๋ฉด ์๋ง ๋ ์ฐธ๊ณ ์ฝ๋๋ฅผ ์ด์ฌํ ํํค์ณ๋ด์ผํ ๊ฒ ๊ฐ๋ค. ๊ฒ๋ค๊ฐ thunk์ slice๋ฅผ ๋ฐ๋ก ๊ตฌ๋ถํ์ฌ, slice์ extraReducers์์ pending, fulfilled, rejected ์์ ์ด๋ค ํ๋์ ํ๋ผ๊ณ ๋งค๋ฒ ์ฝ๋๋ฅผ ์์ฑํ๋๊ฒ ๋ง๋ ๋ฐฉ๋ฒ์ธ์ง ์๋ฌธ์ด ๋ค์๋ค. Redux Toolkit์์ ์ด๋ ํ ๋ฐฉ์์ผ๋ก data๋ฅผ fetchํ๋์ง ๋ ์ฐพ์๋ณผ ํ์์ฑ์ด ์๋ค๊ณ ๋๊ผ๋ค.
๋๊ธ๋ก ํ์ ์๋ฝํ๊ณ ์๋ฆผ ๋ณด๋ด๊ธฐ
ํ์์ฐพ๊ธฐ ๊ฒ์ํ์๋ ๋๊ธ๊ธฐ๋ฅ์ด ์์๊ธฐ ๋๋ฌธ์ ๋๊ธ ๊ธฐ๋ฅ๋ ๊ตฌํ์ ํด์ผ ํ๋ค. ๊ธฐํ ํ์์์ ํ๋ก์ ํธ ์นธ๋ฐ์ ํตํด ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌ(ํ์ ์๋ฝ ๋ฑ์ ํฌํจ)ํ๋ ๊ธฐ๋ฅ์ ์์ ๋ ๋์ ๋๊ธ์ผ๋ก ๋์ฒดํ์๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋๊ธ ๊ธฐ๋ฅ ๋ํ ํ์์๋๋ฐ, ๊ฐ๋จํ ์ค ์์๋ ๋๊ธ๋ ์๊ฐ๋ณด๋ค ํ ์ผ์ด ๋ง์๋ค.
โพ๏ธ ๋๊ธ ์ผ์ด์ค๋ณ CSS ์์
์ฐ์ ์ฒซ๋ฒ์งธ๋ก, ๋๊ธ์ contents ์ผ์ด์ค๋ณ๋ก CSS ์์ ์ด ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค. ๋๊ธ์ ํตํด ํ์ ์๋ฝ๊ณผ ๊ฑฐ์ ์ ํ ์ ์๋๋ก ๊ตฌํํ๊ธฐ ์ํด ํ๋ก์ ํธ๋ฅผ ์ง์ํ๊ธฐ ์ํ ‘์ง์๋๊ธ’๊ณผ ์ผ๋ฐ์ ์ผ๋ก ๋๊ธ์ ์์ฑํ๋ ‘์ผ๋ฐ๋๊ธ’๋ก ๋๋์ด์ก๋ค.
1. ์ผ๋ฐ๋๊ธ โก๏ธ width 100%
2. ์ง์๋๊ธ โก๏ธ width ์กฐ์ ํ์
1) ์๋ฝ/๊ฑฐ์ ์ : ์๋ฝํ๊ธฐ ๊ฑฐ์ ํ๊ธฐ ๋ฒํผ ๋ ธ์ถ
2) ์๋ฝ/๊ฑฐ์ ํ: ์๋ฝ ๋๋ ๊ฑฐ์ ๋ฉํธ ๋ ธ์ถ
๋ํ ๋๊ธ ์์ฑ์๋ง ๋๊ธ์ ์์ /์ญ์ ๊ฐ ๊ฐ๋ฅํ๊ณ , ์ง์๋๊ธ์ด ์๋ฝ๋ ํ์๋ ์์ฑ์๋ ์์ /์ญ์ ๊ฐ ๋ถ๊ฐํ๋ค. ์ด์ ๋ง์ถฐ ์ผ์ด์ค ์์ ์ ํ๋๊ฒ ๊ฝค ๋ฒ๊ฑฐ๋ก์ ๋ค.
๊ฒฐ๊ตญ 300์ค์ด ๋๊ฒ ๋ ๋๊ธ ์ปดํฌ๋ํธ ๋ํ ์ถํ ๋ฆฌํฉํ ๋งํ ์๊ฐ์ ๊ฐ์ง๊ณ , ์ฐ์ ์ ๊ธฐ๋ฅ ๊ตฌํ์๋ง ๋งค์งํ๋ค.
โพ๏ธ ๋๊ธ ์๋ฝํ๊ธฐ ๋ฒํผ ํด๋ฆญ์ ์๋ ๊ตฌํ
๋๋ฒ์งธ๋ก ๋๊ธ์ ์๋ฝํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ์์ฑ์์๊ฒ ์๋ฆผ์ด ๊ฐ๋ ์๋์์คํ ๋ ๊ตฌํํ๊ณ ์ ํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ง๋ API ์์ฒญ๋ ๋ณด๋ด์ฃผ์ด์ผ ํ๋ค.
์ด์ ๊ด๋ จํด์๋ ๋ฐฑ์๋ ํ์๊ณผ ์ด์ผ๊ธฐ๋ฅผ ๋ช ๋ฒ ๋๋์์๋๋ฐ, ์ฒ์์๋ ๋ณต์กํ๋ API Call์ด ๋ฉํ ๋ง ์ธ์ ํ ์ ๋ง ๊ฐ๋จํ๊ฒ ๋ณ๊ฒฝ๋๊ธฐ๋ ํ์๋ค.
โ๏ธ ๋ฐฑ์๋ ํ์๊ณผ ํ์๋ฅผ ํ ๋ ๊ธฐ์ตํด์ผ ํ ๋ถ๋ถ๋ค์ ๋ฉ๋ชจํด๋์๋ค.
# ์๋
- alermType : ํ์ ์๋ฝ์ ๋ํ ๊ฑฐ๋ฉด 0(ACCEPT)
(๋ค๋ฅธ ์๋์ด ์์ ์๋ ์์ด์ ํ์ฅ์ฑ์ ์ํด ์ถ๊ฐํ ํ์ )
- targetId : ๋๊ธ ์์ฑ์์ ID
- memberId : ๋ฉค๋ฒ๋ณด๋์ ID
- ๋ฉค๋ฒ๋ณด๋(ํ์์ฐพ๊ธฐ๊ฒ์ํ) ์์ฑํ ๋ /projects ๋ก (post req: accountId ์์ฑ์์์ด๋, memberBoardId ๊ฒ์๊ธ์์ด๋)
โถ๏ธ ๋ฐฑ์๋์์ ์ฒ๋ฆฌ๋จ.
- ์๋ฝ๋ฒํผ ํด๋ฆญํ์ ๋
- /projects ๋ก (post req: accountId ๋๊ธ์์ฑ์์์ด๋, memberBoardId ๊ฒ์๊ธ์์ด๋)
- /alerms ๋ก (post req: alermType ์๋ํ์ , accountId ๋๊ธ์์ฑ์์์ด๋, memberBoardId ๊ฒ์๊ธ์์ด๋)
- /replys/{replyId} ๋ก (patch req: acceptType)
โถ๏ธ ์๋ฝ/๊ฑฐ์ ํ์ธ ํ์๋ ์์ /์ญ์ ์๋๋๋ก.
โฌ๏ธ ๋ณ๊ฒฝ
- ๋๊ธ์์ ์ content๋ง ๋ณด๋ด๋๊ฑธ๋ก ๋ณ๊ฒฝ (acceptType ์ ์ธ)
- reply/accept/{replyId} → ์๋ฝ๋ฒํผ ํด๋ฆญํ์ ๋
- ํ๋ก์ ํธ ์๋ฝ์ acceptType 1 ํ๋ก์ ํธ ๊ฑฐ์ ์ acceptType 2
์ฒ์์๋ ๋๊ธ์ “์๋ฝํ๊ธฐ” ๋ฒํผ์ ๋๋ ์ ๋ ์๋ฒ ์ธก์ ๊ฐ ๋ค๋ฅธ ์๋ํฌ์ธํธ๋ก 3๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉํฅ์ผ๋ก ๋ฐฑ์๋ ์ชฝ์์ ์ค๊ณ๋ฅผ ํ์ จ๊ธธ๋, ์ด๋ ๊ฒ 3๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋๊ฒ ๊ด์ฐฎ์์ง, ์ค๋ฌด์์๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์ด ๋๋์ง ๊ถ๊ธํด์ ๋ฉํ ๋ง ์๊ฐ์ ์ง๋ฌธ์ ํ์๋ค. ๋ฐฑ์๋ ํ์๋ถ๋ ๊ด๋ จํด์ ๋ฐฑ์๋ ๋ฉํ ๋ง ์๊ฐ์ ์ง๋ฌธ์ ํ์ จ๋ ๊ฒ ๊ฐ๋ค. ๋ค์๋ ํ์๋ฅผ ํ๋๋ฐ ์์ฒญ์ ํ ๋ฒ์ผ๋ก ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ์์ ํ๊ณ , ๋๋จธ์ง ๋ก์ง์ ๋ฐฑ์๋์์ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ๋ก ํ๋ค๊ณ ํ์ จ๋ค ๐ฅฐ
์ด๋ฏธ HTTP ํต์ ์ด ์ ๋๋ ์ํ์์ ์์ฒญ ํ๋๋ง ๋ณด๋ด๋ฉด ๋์๊ธฐ ๋๋ฌธ์, ์์ํ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
AWS S3 ํ๋ก ํธ ๋ฐฐํฌ
๋ฐฑ์๋์ ๋ฐฐํฌ๋ฅผ ๋ด๋นํ์ ํ์๋ถ๊ป์ ์ธํ ํด๋ AWS S3์ ํ๋ก ํธ์๋ ์์ ๋ฐฐํฌ๋ฅผ ํ๋ค. ํ๋ฆฌ ํ๋ก์ ํธ ๋๋ S3๋ก ํ๋ก ํธ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ์ด๋ ต์ง ์๊ฒ ์งํํ ์ ์์๋ค.
๊ฐ๋ฅํ๋ค๋ฉด Vercel๋ก ๋ฐฐํฌ๋ฅผ ํด๋ณด๊ณ ์ถ์๋๋ฐ, Vercel๋ก ๋ฐฐํฌ์ ์๋ฒ์ธก https ์ด์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ์์๋ ์ธํ ์ ํด์ฃผ์ด์ผ ํ๋ค๊ณ ๋ ํ๊ณ , ์ด ์ฆ์ ๊ณ์ํด์ ํ๋ก์ ํธ์ ์๋ฌ๊ฐ ๋ฐ๋ณต๋์๊ธฐ ๋๋ฌธ์ ๋ง์ ๊บผ๋ผ ์๊ฐ์ด ์์๋ค.
์ฌํผ S3 ํ๋ก ํธ ๋ฐฐํฌ๋ ์ํํ๊ฒ ์ ์งํ๋์๋ค.
๐ง๐ป 3์ฐจ ๋ฉํ ๋ง ์ธ์
๋ฉํ ๋ง ์ธ์ ์ ์ง๋ฌธ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ ๋..
์์ ์ ํ๋ค๋ณด๋ API ๋ช ์ธ์์ ํ์ด์ง๋ณ ๊ฒ์๊ธ ๋ฆฌ์คํธ์ ๋ํ GET ์์ฒญ๊ณผ ๊ฒ์๊ธ ํ๋์ ๋ํ GET ์์ฒญ์ด ๋ฐ๋ก ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค. ๊ฒ์๊ธ ์์ฒด์ ๋ํ response๋ ๊ฐ์๊ณ , ํ์ด์ง๋ณ ๊ฒ์๊ธ ๋ฆฌ์คํธ์ GET ์์ฒญ์ page์ ๋ํ ์ ๋ณด๊ฐ ์ถ๊ฐ๋์ด ์์๋ค.
์ด๋ด ๊ฒฝ์ฐ, ์๋ฅผ ๋ค์ด ํ์์ฐพ๊ธฐ ๊ฒ์ํ์ "memberBoardId": 1์ ์์ธํ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค๋ฉด,
1. ํ์์ฐพ๊ธฐ ๊ฒ์๊ธ ๋ฆฌ์คํธ response์์ "memberBoardId": 1
์ ์ฐพ์ ์์ธํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ด ๋์์ง
2. ํ์์ฐพ๊ธฐ ๊ฒ์๊ธ ํ๋์ ๋ค์ ์์ฒญ์ ๋ณด๋ด "memberBoardId": 1
์ data๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ด ๋์์ง
์์ ์ ํ๋ค๊ฐ ๋ฌธ๋ ๊ถ๊ธํด์ก๋ค. ์ด์ ์ ๋คํธ์ํฌ ์์ฒญ์ ๋น์ฉ์ด ๋น์ธ๋ค๋ ๋ด์ฉ์ ๋ค์ ์ ์ด ์์ด ๋ค์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ๋ณด๋ค๋ ๊ธฐ์กด์ ๋ฐ์ ์๋ต์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด ๋ ๋ซ์ง ์์๊น? ๋ผ๊ณ ์๊ฐ์ ํ๋๋ฐ ์ ์ ๊ตฌํ์ ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ํ์๋ ๋๋ ์ฌ๋… ๐ซ ๐ซ ๐ซ
์ฌํผ ๊ฒฐ๋ก ์ ์๋ก ์์ฒญํ๋ ๋ฐฉ๋ฒ์ด ๋ซ๋ค๋ ๊ฒ์ด์๋ค. (1๋ฒ ๋ฐฉ๋ฒ) ์๋ํ๋ฉด ์์ธํ์ด์ง๋ก ์ง์ ํ๋ ๋์ ์ ๋ณด๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์๊ฒ ํญ์ ์ ๋ฐ์ดํธ๋ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค์ผ ํ๋ค๋ฉด ๋งค๋ฒ ์์ฒญ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ์ค์ํ๊ฑด ์์๋ก ๋ฐ๋๋ ๋ด์ฉ์ธ์ง, ๊ทธ๋ ์ง ์์์ง๋ฅผ ํ์ ํ๋๊ฒ ์ค์ํ๋ค.
์ด ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ๋ถ๋ถ์ ๋ฐฐ์ธ ์ ์์๋๋ฐ,
• ๋ง์ดํ์ด์ง์ ๋ผ์ฐํ ์ ๊ฒฝ์ฐ url์ mypage/5 ๋์ mypage/userid ์ด๋ฐ์์ผ๋ก ์ ๋ํฌํ ๊ฐ์ด ์ค๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
• ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ && ๋ณด๋ค ์ผํญ์ฐ์ฐ์๋ฅผ ์ ํธ (isLogin ? <Hello /> : <World />
)
→ ๋ง์ฝ ์ฝ๋๋ฅผ ์๋ชป ์์ฑํ์ ๋ isLogin && <Hello />
์ด๋ฐ ์์ ์์ฑ๋ฒ์ ์๋์น ์๊ฒ 0์ด ํ๋ฉด์ ํํ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ข
์ข
๋ณผ ์ ์์๋ค๊ณ ํ๋ค.
• ์ต๋ํ ์์ ๋จ์๋ก ์์ฑ
→ ๋ญ๋ผ๊ณ ์ค๋ช
ํด์ผ ๋ฑ ๋ง๋ ์ฉ์ด์ธ์ง ๋ชจ๋ฅด๊ฒ ๋๋ฐ, ์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ์ ํ์์ด๋ค.
<ActionButton buttonType={"submit"}>
{location.pathname.startsWith("/projectlist/edit") &&
"์นด๋ ์์ ํ๊ธฐ"}
{location.pathname.startsWith("/projectlist/new") &&
"์นด๋ ๋ฑ๋กํ๊ธฐ"}
</ActionButton>
// location.pathname.startsWith("/projectlist/edit")
// ์ ํํ ๋์ ์๋์ฒ๋ผ,
{ EDIT_CARD ? "์นด๋ ์์ ํ๊ธฐ" : "์นด๋ ๋ฑ๋กํ๊ธฐ" }
// ์ต๋ํ ์ต์๋ก ์ค์ด๋ ๊ฒ์ ์ถ์ฒ
// ๋ฌผ๋ก ๋น๊ต์ ๊ฐ๋จํ ๊ตฌํ์ผ ๋๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง์ง๋ ์์ง๋ง
// ๊ตฌ์กฐ๊ฐ ์ข ๋ณต์กํด์ง๋ฉด ๊ฐ๋
์ฑ์ด ๋จ์ด์ง ์ ์์ผ๋ ์ด๋ ๊ฐ์ธ์ด ์ ํ๋จํ์ฌ ์์
ํ๋ฉด ๋ ๋ฏ!
์๋ฌ ํํฐ์ ์์
HTTP ํต์ ๊ณผ ์์ฒญ์ ํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉด์ ๋ ์ด์ ๋ก์ปฌ์์๋ง ์์ ํ๋ ์์ ์ฑ์ด ์ฌ๋ผ์ง๊ธฐ ์์ํ๋ค. ์ ๋ ๊น์ง๋ง ํด๋ ์๋ฒ์ ํต์ ์ด ์ ๋์๋๋ฐ, ๋ค์๋ ์ด ๋๋ ๊ฐ์๊ธฐ ์๋ฌ๊ฐ ๋๊ธฐ๋ ํ๊ณ (๋ฌผ๋ก ์ค๊ฐ์ ์ด๋๊ฐ ์๋ชป๋์๊ฒ ์ง๋ง), merge๋ฅผ ํ๊ณ ๋๋ ๋๋๊ฒ ๋ ์๋๊ธฐ๋ ํ๊ณ … ์์ฃผ ๋์ฅํ์ด์๋ค. ๋ฌด๋ํ๊ฒ ์ ํ๋ฌ๊ฐ๊ณ ์์ด ์์ผ๋ก๋ ๊ทธ๋ด์ค๋ง ์์๋ ์์๊ณผ๋ ๋ฌ๋ฆฌ ์๋ฌํํฐ๊ฐ ์์๋ ๊ฒ์ด์๋ค.
์ด๋ฐ์ ๋ฐ ์๋ฌ๊ฐ ์์์ง๋ง, ๋ค๋ฅธ ํ์๋ค์ด ์์ ํ๋ ์ฝ๋์์ ๋ฌ๋ ์๋ฌ๋ผ ์ด๋ค ๋ถ๋ถ์ด ์๋ชป๋์์๊น ์ถ์ธก๋ง ํ ๋ฟ ๋ด๊ฐ ๋ณผ ์ ์๋ ์ฝ๋๊ฐ ์์๋ค. ์ฝ๊ฐ์ ๋ฌด๋ ฅ๊ฐ์ ๋๋ผ๋ฉด์ ๋ด๊ฐ ํ ์ ์๋ ๋ค๋ฅธ ์์ ์ ๋จผ์ ์งํํด์ผ๋ง ํ๋ค.
๐ง ๋น์์๋ ๊ฐ์๊ธฐ ์ ๋๋ ์ฝ๋๊ฐ merge ํ์ ๋์ง ์๊ณ , ์ด๋ฐ์ ๋ฐ ๋ฌธ์ ์ํฉ์ ๋ถ๋ชํ์ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ์ง ์ํด๋ ๋ค. ์๋ฒ ์ชฝ ์ฝ๋์์ ๋ ์๋ฌ๋ ๋์งธ์น๊ณ , ์ด๋ฐ์ ํ๋ก ํธ ์ชฝ์ authInstance ๊ด๋ จํด์๋ ๋ ์๋ฌ๊ฐ ์์๋๋ฐ, ์ด ๋ถ๋ถ์ ๋ค๋ฅธ ํ๋ก ํธ ํ์์ด ์์ ํ๊ณ , ๋๋ axios intersepter(? instance?)๋ฅผ ์ฌ์ฉํด๋ณธ์ด ์์๊ธฐ ๋๋ฌธ์ ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ์์ธกํ๊ธฐ๊ฐ ์ด๋ ค์ ๋ค. ๋ด๊ฐ ์์ ํ๋ ๋ถ๋ถ์๋ ํด๋น ์๋ฌ๊ฐ ์ํฅ์ ๋ฏธ์ณค๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ์ดํด๋ณด๊ธฐ๋ ํ์๋๋ฐ, ์ ๋์ง ์์ ํด์ผํ ๋ค๋ฅธ ์์ ๋ ๋ง์์ ํด๋น ํ์๋ถ์ด ํด๊ฒฐ์ ํด์ฃผ๊ฒ ์ง, ๋ผ๋ ์๊ฐ์ผ๋ก ํ ๋ฐ ๋ค๋ก ๋ฌผ๋ฌ๋์์๋ ๊ฒ ๊ฐ๋ค. ์ฐ๋ฆฌ ํ๋ก ํธ ํ์๋ถ๋ ๋ฌธ์ ๊ฐ ๋ญ์ง ์ฐพ๊ธฐ ํ๋ค์ดํ๋ ๊ฒ ๊ฐ๊ธฐ๋ ํ์๋๋ฐ, ๊ฒฐ๊ตญ์ ํด๊ฒฐ์ ํ์๋ค. ๋น์์ ๋ด ์์ ํ๋๋ฐ๋ ๋ฐ๋น ์ ๋จ์ ์ฝ๋์์ ๋ ์๋ฌ๋ฅผ ๋ณผ ์ฌ์ ๊ฐ ์์๋๋ฐ, ์ง๊ธ ์๊ฐํด๋ณด๋ ๋์ ๊ทธ๋ฐ ๋์ฒ๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ด์์๊น, ๋ผ๋ ์๊ฐ์ด ๋ ๋ค. ์๋ฌ์ ์์ธ์ ๊ฒ์ํด์ ์ฐพ์๋ณด๋๋ฐ ์๊ฐ์ ์กฐ๊ธ๋ง ๋ ๋ค์๋๋ผ๋ฉด, ์กฐ๊ธ ๋ ๋ง์์ ์ฌ์ ๋ฅผ ๊ฐ์ก๋๋ผ๋ฉด, ์ข ๋ ํจ๊ป ์๊ฐํด ๋ดค๋๋ผ๋ฉด ์ด๋ผ๋ ์๊ฐ์ด ๋ค์๋ ๊ฒ ๊ฐ๋ค. ์๋ฒ ์ชฝ ์ฝ๋์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋์๋ ๋ง์ฐฌ๊ฐ์ง์๋ค. Java๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ๋๋์ฑ ์ฝ์ ์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ ๋ฌผ๋ก ์ด๊ณ ํด๊ฒฐ๋ฐฉ์๋ ์์ธกํ ์๊ฐ ์์๋ค. ํ์ง๋ง ํ์ด์ฌ์ ๊ณต๋ถํด๋ดค๋ ๋ค๋ฅธ ํ๋ก ํธ ํ์๋ถ์ด ์ด๋ฐ์ ๋ฐ ๋ฐฉํฅ์ผ๋ก ๋ฌด์์ด ๋ฌธ์ ์ผ๊น ์์ธกํ๊ณ , ์๊ฒฌ์ ๊ณต์ ํด์ฃผ๋ ๋ชจ์ต์ ๋ณด๋ฉด์ ๋ช๋ช ์๊ฐ์ด ๋ค์๋ ๊ฒ ๊ฐ๋ค. ๋ชจ๋ ๊ฑธ ๋ค ์ ์๋ ์๊ฒ ์ง๋ง, ์กฐ๊ธ๋ง ๋ ๋๊ฒ ๊ณต๋ถ๋ฅผ ํ๋ฉด ๋ค์ํ ์ํฉ์ ๋ํด ์กฐ๊ธ ๋ ์ ์ฐํ ๋์ฒ๊ฐ ๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ๋ ๋ค์๋ค.
๋ง๋ฌด๋ฆฌ ์์ ์ ํ๊ณ ์ถ์์ง๋ง…
3์ฃผ์ฐจ์ ๋ค์ด์ค๋ ๋ง์์ด ๊ธํด์ก๋ค. ์๊ฐ์ด ์ผ๋ง ๋จ์ง ์์ ๊ฒ ๊ฐ์๋ฐ, ํด์ผํ ์ผ์ด ๋๋ฌด ๋ง์๋ ๊ฒ์ด๋ค. ๋คํํ๋ ๋ง์ง๋ง ์ฃผ๋ง์ ์๋ฒ๋ฅผ 12์ ~ 9์๊น์ง ์ด์ด์ฃผ๊ธฐ๋ก ํด์ ๊ทธ ์๊ฐ๋์์ ์๋ฒ ํต์ ์ด ํ์ํ ์์ ์ ๊ณ์ํด์ ํ ์ ์์๋ค.
์ฃผ๋ง๋์ 2๊ฐ์ ๊ฒ์ํ๊ณผ ๋๊ธ์ ์ค์๋ “์”์ธ ๊ธฐ๋ฅ์ ๋ค ๊ตฌํ์ ๋ง์ณค๊ณ , ๊ฒ์๊ณผ ํํฐ ๊ธฐ๋ฅ๋ ๋ง๋ฌด๋ฆฌ๋ฅผ ํ๋ค. ์๋ฒฝํ์ง๋ ์์์ง๋ง, ๊ธฐ๋ฅ ๊ตฌํ์ด ๋๋ ๊ฒ์ ์๋ฏธ๋ฅผ ๋์๋ค.
์๋์ ๊ณํ์ด๋ผ๋ฉด ์ด๋ฒ์ฃผ์ ๊ธฐ๋ฅ ๊ตฌํ์ ๋ง๋ฌด๋ฆฌํ๊ณ , ํ์๋ค๊ณผ ๋ค ํจ๊ป ์ ์ ํ๋ก์ฐ๋ฅผ ๋ฐ๋ผ ํ ์คํธ๋ฅผ ํ์์ด์ผ ํ๋๋ฐ ์๋ฌํํฐ๊ฐ ๋์ ๊ณํ๋๋ก ๋์ง๊ฐ ์์๋ค. ๋ํ ๋ง์ง๋ง๊น์ง ๋ฉ์ธํ์ด์ง ๊ตฌ์ฑ๋ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฉ์ธํ์ด์ง์ ๋ํ ๊ณ ๋ฏผ๋ ๋น ๋ฅด๊ฒ ํ์์ด์ผ ํ๋ค. ์๋ฌ๋ ๊น์ ์ด๋ฅผ ํด๊ฒฐํ ๋์ ๋ฉ์ธํ์ด์ง๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ์ง์ ๋ํ ๊ณ ๋ฏผ์ ํ๊ธฐ๋ก ํ๋ค.
์์์น ๋ชปํ ์๋ฌ๋ก ํ ๋ถ์๊ธฐ๋ ์ฝ๊ฐ ์ธ๋ํด์ก๋ค. ๊ฑฐ์ ์์ ์ ํฅํด๊ฐ๋ ๋ฆ์ ๋ฐค์ด์ด์ ๋ค๋ค ๋ ์๋ฏผํด์ ธ ์์๋ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค. ๋ฌธ์ ์ ์์ธ์ด ๋ฌด์์ธ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๋๋ฐ, ๋ง๊ฐ์ ๋ช์ผ ์๋๊ณ ๊ฐ์๊ธฐ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ๋ ์ธ๋ํ ๋ถ์๊ธฐ์ ํ ๋ชซ ํ๋ ๊ฒ ๊ฐ๋ค. ์๊ฐ์ด ๋๋ํ๋๋ผ๋ฉด ์ข ๋ ์ฌ์ ๋ฅผ ๊ฐ์ง๊ณ ์ฐจ๊ทผ์ฐจ๊ทผ ์๊ฐํด๋ณผ ๋ฌธ์ ์์ํ ๋ฐ. ๊ทธ๋ ๊ฒ ์ฐ๋ฆฌ์ ๋ง๋ฌด๋ฆฌ ์์ ์ ๋ฏธ๋ค์ง๊ณ ์์๋ค.
๐ 3์ฃผ์ฐจ, ์์ ํ๋ฉฐ ๋๋ ๋ฌด์์ ๋ฐฐ์ ์๊น? (What I Learned)
1. react-quill ์ฌ์ฉํ๊ธฐ
์น ์๋ํฐ๋ฅผ ์ข ๋ ๋น ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ ์ํด react-quill ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. ๊ด๋ จ๋ ์๋ฃ๊ฐ ๋ง์์ ๋น ๋ฅด๊ฒ ์ธํ ํ ์ ์์๋ค. ๋ค๋ง ์ธํ ํ์ ์น ์๋ํฐ์ ์ ๋ ฅ๋ ๋ด์ฉ์ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ ๋๋ ์๋์ ๊ฐ์ด ์ ๋ ฅํด์ฃผ์ด์ผ ํ๋ค.
<div dangerouslySetInnerHTML={{ __html: content }} />
→ React์์๋ ๋ณด์ ์ด์๊ฐ ์์ด ๊ธฐ๋ณธ์ ์ผ๋ก HTML ํ๊ทธ๋ฅผ ์ง์ ์ฝ์
ํ ์ ์๊ฒ ์ค์ ๋์ด ์๋๋ฐ, ์ํํ์ง๋ง dangerouslySetInnerHTML
์ด ์์ฑ์ ์ฌ์ฉํด HTML ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๊ณต๊ฒฉ์๊ฐ ์
์์ ์ฝ๋๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์์ ์คํ์ํค๋ XSS(Cross Site Script) ๊ณต๊ฒฉ์ ์ทจ์ฝํด์ง๋๋ฐ, ์ด๋ฐ ๊ฒฝ์ฐ ์
๋ ฅ ๊ฐ์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ํตํด ์ํ์ฑ์ด ์์ ๋ฌธ์ ๋ฅผ ์๋ฐฉํด์ผ ํ๋ค๊ณ ํ๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์๋ ๋ณด์์ ๊ด๋ จ๋ ์ฌํญ์ ์ ์ฉํ์ง ์์์ง๋ง, ๋ค์ ์๊ฐํด๋ณด๋ ๋งค์ฐ ์ค์ํ ๋ฌธ์ ๊ฐ ์๋ ์ ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค. React์์๋ DOMPurify์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด์ ๊ฒ์ฌ๋ฅผ ํ ์ ์๋ค๊ณ ํ๋ค.
โญ react-quill ์ฌ์ฉํ๊ธฐ ์ธ์๋ useParams()
์ ํ์
์ ์ง์ ํ๋ ๋ฐฉ๋ฒ, createAsyncThunk
์์ ํ๋ผ๋ฏธํฐ 2๊ฐ ์ด์ ๋๊ธฐ๊ธฐ ๋ฑ ๊ธฐ๋ฅ ๊ตฌํ์ ํ๋ฉฐ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ๋ง์ด ๋ฐฐ์ ์๋๋ฐ, ๋ง์ ์ ๋ฆฌ๋ฅผ ํ๋ ค๊ณ ํ๋ ๋ด๊ฐ ๋ฐฐ์ด๊ฑธ ์๊ณ ์ฌ์ฉํ๊ฑด์ง ํ์ ์ด ๋ค์ง ์๋๋ค. ์ง๊ธ ์๊ฐํด๋ณด๋ ๊ฒ์ํด์ ์ฐพ์๋ ๋ฐฉ๋ฒ์ ์ ์ฉํ์ ๋ฟ, ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋๋ค์ ๋ง๋๋ค๋ฉด ๋ค์ ๊ฒ์ํ๊ฒ ๋ ๊ฒ ๊ฐ์ผ๋ ์ฌ๋ฌ๋ฒ ๋ง๋์ ์ต์ํด์ง๋์ง, ๋
ธํธ ํ์ผ ์ ์ ์ ๋ฆฌํด๋๋์ง ํด์ผ๊ฒ ๋ค.