์ ์ฒด ๊ธ (38) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ redux-saga #. redux-saga๋? redux-saga(์ดํ ๋ฆฌ๋์ค ์ฌ๊ฐ)๋ redux์ ๋ฏธ๋ค์จ์ด๋ก์ ๋น๋๊ธฐ ๋์์ ์คํ ํ ์ ์๊ฒ ํ๋ค. ์ฆ ์ธ๋ถ์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(fetch)์ ๊ฐ์ ๋น๋๊ธฐ ๋์๋ค์ ๋ ํจ์จ์ ์ผ๋ก ์คํํ๊ณ , ์ฝ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์๋ฅผ ๋ค์ด, redux์ action์ด ๋ฐ์ํ๋ฉด reducer๊ฐ ์ก์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋น๋๊ธฐ ์์ ์ ์์ฒญํ๊ฑฐ๋ ๋ค๋ฅธ ์ก์ ์ ๋ฐ์์ํค๋ ๋ฑ ๋ค์ํ ์์ ์ ํ ์ ์๋๋ก ๋ฏธ๋ค์จ์ด๋ก ๋์ํ๋ค. #. redux-saga ์ฌ์ฉํ๋ ์ด์ 1) ์ฃผ๋ก ์๋ฒ์ ๋น๋๊ธฐ ์์ฒญ์ ํ ๋ ์ปดํฌ๋ํธ์์ ์์ฒญํ์ง ์๊ณ Saga์์ ๋ชจ์์ ๊ด๋ฆฌํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ปดํฌ๋ํธ์์ ์ง์ async/await ๋ฌธ๋ฒ์ ํตํด ์๋ฒ์ API ์์ฒญ์ ๋ณด๋ด๋๊ฒ ๊ฐ์ฅ ๊ฐํธํ๋ค. ํ์ง๋ง ์ด๋ฌํ .. mysql ํน์ ๋ฌธ์ ๋ฐ์ดํฐ ๊ฒ์ ** LIKE ์ฐ์ฐ์๋ ํน์ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋ ์ฌ์ฉ๋๋ค. 1. ํน์ ๋ฌธ์๋ฅผ ํฌํจํ๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ SELECT [ํ๋๋ช ] FROM [ํ ์ด๋ธ๋ช ] WHERE [ํ๋๋ช ] LIKE '%ํน์ ๋ฌธ์์ด%'; 2. ํน์ ๋ฌธ์๋ก ์์ํ๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ SELECT [ํ๋๋ช ] FROM [ํ ์ด๋ธ๋ช ] WHERE [ํ๋๋ช ] LIKE 'ํน์ ๋ฌธ์์ด%'; 3. ํน์ ๋ฌธ์๋ก ๋๋๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ SELECT [ํ๋๋ช ] FROM [ํ ์ด๋ธ๋ช ] WHERE [ํ๋๋ช ] LIKE '%ํน์ ๋ฌธ์์ด'; 4. ๋ณต์๊ฐ์ ํน์ ๋ฌธ์๋ฅผ ํฌํจํ๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ (Tip. ์์ ๊ฒฝ์ฐ์ REGEXP ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํธ๋ฆฌํ๋ค) SELECT [ํ๋๋ช ] FROM [ํ ์ด๋ธ๋ช ] WHERE [ํ๋๋ช ] LIKE '%ํน์ ๋ฌธ์์ด%' OR .. ios ์ฌํ๋ฆฌ, ํฌ๋กฌ heigth: 100vh ์๋ ๋ (feat. ์ด๊ฒ์ด ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง์ธ๊ฐ) ๊ธฐํ์๋ก ์ผํ๋ฉด์ QA๋ฅผ ์ฌ๋ฌ ์ฐจ๋กํ ๋ ๋น์ฐํ๋ฏ ํ๋ ๋ธ๋ผ์ฐ์ ๋ณ ํ ์คํธ๊ฐ ์ด์ ๋ด๊ฐ ๊ฐ๋ฐ์๋ก ์ฝ๋์น๋ฉด์๋ ์๊ณ ์์๋ค ๐ ์ฌ์ค ์ด๋ ดํ์ด ํด์ผ์ง๋ ์๊ฐํ๋๋ฐ ๋น์ฅ ๊ฐ๋ฐ ์์ ์ด ๋ฐ์๋๊น ์ผ๋จ ๋๊ฒผ๋๋ ๊ฒฐ๊ตญ..! ๋ฐฐํฌ ์ ํ ์คํธ ๋ ํ๋ฉด ๋ ์ด์์์ด ์ผ๋ถ ๊นจ์ก๋ค ๐ฑ ์ง์ง ios..... ์ ์๋๋ ์ง.... ํ์ฐธ ๊ตฌ๊ธ๋ง ํด์ ํด๊ฒฐํ ์ค๋์ ์ฃผ์ ...! ios ์ฌํ๋ฆฌ, ํฌ๋กฌ heigth: 100vh ์๋ ๋์ ๋ฌธ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ ๋ฏธ๋์ ๋๋ฅผ ์ํด ๊ธฐ๋กํ๋ค. ์ด์ iOS ๊ธฐ๊ธฐ ๋ธ๋ผ์ฐ์ ์์ 100vh ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ๋๊ตฌ๋ฐ ์์ญ๊น์ง ์ก๊ณ ์๋ค๊ณ ํ๋ค. ๊ทธ๋์ ํ๋จ์ ๋ฒํผ๊ณผ ๊ฐ์ ๋ฌด์ธ๊ฐ ๋ฐฐ์นํ๋ฉด ๊ฐ๋ ค์ ์๋ณด์ด๋ ํ์์ด ๋ํ๋๋ค. ํด๊ฒฐ๋ฐฉ๋ฒ ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ ๋ฐฉ๋ฒ์ ์ด๋ฌํ๋ค. ์ค์ innerHeight ๊ฐ์ ๊ธฐ์ค์ผ๋ก css .. iwinv ์๋ฒ์ mysql ํ์ผ ์ฎ๊ธฐ๊ธฐ ( feat. mysql ๋ฐฑ์ ) iwinv๋ฅผ ์ด์ฉํด ์๋ฒ๋ฅผ ํ๋ ๋น๋ ธ๋ค. ๊ทธ๋ฆฌ๊ณค ๋ด ํ๋ก์ ํธ๋ฅผ ๊นํ๋ธ์ ์ฌ๋ฆฌ๊ณ ์๋ ์๋ฒ์ clone ํ์๋ค. ๊ทผ๋ฐ ๋ก์ปฌ์ ์ ์ฅ๋ mysql ํ์ผ์ ์ด๋ป๊ฒ ์ฎ๊ฒจ์ผ ๋ ์ง ๋ชฐ๋ผ์ ํ์ฐธ ํค๋งธ๋ค. ๊ทธ๋์ ๋ฏธ๋์ ๋๋ฅผ ์ํด ๋จ๊ธฐ๋ ๋ฉ๋ชจ...! iwinv ์๋ฒ์ mysql ํ์ผ ๋ฐฑ์ ํ๊ธฐ...! ๐ฅ 1. ๋ก์ปฌ ์๋ฒ์ ์๋ mysql ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ export ํ๊ธฐ. ์ผ๋จ ๋๋ mysql workbench๋ฅผ ์ด์ฉํ๋ค. 1) mysql workbench์ ์ ์ํ๋ฉด ์ข์ธก์ Data Export ๋ฉ๋ด ํด๋ฆญ. 2) exportํ ์คํค๋ง ์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณด์ฌ์ง๊ณ ํด๋น ์คํค๋ง ํด๋ฆญ. 3) ํ๋จ์ Export to Self-Contained File ์ต์ ํด๋ฆญ. (*์ด๋ ํ์ผ๊ฒฝ๋ก ์ ๊ธฐ์ตํด๋๊ธฐ.) 4) ๋งจํ๋จ์ [Start.. git clone ์๋ฌ 'remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.' ์๋ ์๋ฒ์ git clone์ ํ๋๋ฐ ์๋ฌ๊ฐ ๋ฌ๋ค. ๊ฒ์์ ํด๋ณด๋ ๋ญ ๋น๋ฐ๋ฒํธ ์ธ์ฆ ์ง์์ด 2021.08.13 ์ดํ๋ก ์๋๋ค๋ ๋ด์ฉ ๊ฐ์๋ค. ๊ทธ๋์ ๊ฒฐ๋ก ์ ๊นํ๋ธ์ ๋ค์ด๊ฐ์ ํ ํฐ์ด๋ ssh ๋ ์ค ํ๋๋ก ์ธ์ฆ์ ํด์ผํ๋๋ฐ, ์๊ฐ๋ณด๋ค ์์ ์ด ์ด๋ ต์ง ์์์ด์ ๋ธ๋ก๊ทธ์ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณธ๋ค. 1. ์ผ๋จ ๋ด ๊นํ๋ธ๋ก ์ด๋ ํ ์๋ ์ด๋ฏธ์ง๋๋ก ์ด๋ํ์. ํ ํฐ ๋ง๋๋ ํ์ด์ง๋ก ์ด๋ํ๋ ๊ฑด๋ฐ ์๊ทผ ํ์ฐธ ์ฐพ์๋ค. 2. ํด๋น Personal access token ํ์ด์ง๊น์ง ์ด๋ํ๋ค๋ฉด ๊ทธ ํ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์. ๋ ์ด๋ฏธ ํ ํฐ์ ๋ง๋ค์ด์ ์ด๋ฏธ์ง ์บก์ณ๊ฐ ์ด๋ ต๋ค ํคํฟใ ใ ใ ใ . ๐๐๐๐๐๐๐๐๐๐ https://docs.github.com/en/authentication/keeping-your-account-and-data.. #7. ํ์๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ (react-hook-form) #7-0 ๋ค์ด๊ฐ๋ ๋ง ๊ธฐ์กด์ ์์ฑํ ํ์๊ฐ์ ํผ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅ์ ๋ณด์ํ๋ ค๋ ์ฐจ์ react-hook-form์ด ์๋ค๋๊ฑธ ์๊ฒ ๋์๋ค. react-hook-form์ ์ด์ฉํ๋๊ฒ ๊ธฐ์กด ์ฝ๋์ ์๋ ์ค์ผ ์ ์๊ณ , ์ข ๋ ์ ์ง์ฌ์ง ๊ธฐ๋ฅ์ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ๋ค ์ธ ์ ์์๊ฑฐ ๊ฐ์ ํ๋ฒ ์ ์ฉ์์ผ ๋ณด์๋ค. #7-1 react-hook-form ์ด์ฉํ๊ธฐ ๋จผ์ npm install react-hook-form์ ํ์ฌ ์ค์นํ ํ์ ๊ณต์ ํํ์ด์ง(https://react-hook-form.com/kr/get-started/)์ ์๋ด๋ ๋๋ก ์คํํด ๋ณด์์ผ๋ "Uncaught TypeError: path.split is not a function" ๋ ์๋ฌ๊ฐ ๋ด๋ค.๊ฒ์ํด๋ณด๋ ์ฌ๋ฌ ํด๊ฒฐ๋ฐฉ๋ฒ ์ค react-hook-form ๋ฒ์ ์.. #6. ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ (1์ฐจ) #6-0 ๋ค์ด๊ฐ๋ ๋ง ์ด์ ์ ํฌ์คํ ํ๋๋๋ก(https://white-salt.tistory.com/26) JWT ๋ฐฉ์์ผ๋ก ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด์๋ค. jwt ๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ๋ ์กฐ๊ธ ์ด๋ ค์ ๋๋ฐ ์ค์ ๋ก ์ฝ๋ ์ง๋๊ฑด ๋ ์ด๋ ค์ ๋ค (^_^;;). ์ผ๋จ ์ง๊ธ๊น์ง ์ง ์ฝ๋๋ฅผ ํ๋ฒ ์ ๋ฆฌ ํ ๋ฐฑ์๋ ์น๊ตฌ์ ํ์๋ฅผ ์งํํด๋ณด์. #6-1 ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๋ก์ง 1. ์์ด๋์ ํจ์ค์๋๋ฅผ ์๋ฒ๋ก ์ ์กํ์ฌ accessToken๊ณผ refreshToken ๋ฐ๊ธฐ. ์ ๋ ฅ๋ฐ์ id์ password ๊ฐ์ ์๋ฒ๋ก ๋ณด๋ด๋ฉด, ์๋ฒ๋ ์ ์ ํ์ธ ํ ๋ฑ๋ก๋ ์ ์ ๊ฐ ๋ง๋ค๋ฉด accessToken, refreshToken์ ๋ฐ๊ธํด์ค๋ค. (Q1. ์ด๋ ๋ฐ๊ธ ๋ฐ์ refreshToken์ httpOnly cookie๋ก ์๋ฒ๋จ์์ ๋ฐ๋ก ์ ์ฅํด์ฃผ๊ณ , ์ดํ ํด.. #5. ์ฝ๊ด๋์ ์ฒดํฌ๋ฐ์ค ๊ธฐ๋ฅ ๊ตฌํ #5-0 ๋ค์ด๊ฐ๋ ๋ง ํ์๊ฐ์ ํ์ด์ง์ ๋ค์ด๊ฐ ์ฝ๊ด๋์ ์ฒดํฌ๋ฐ์ค ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. ์ฒ์์ ์ ์ง ์กฐ๊ธ ์ด๋ ค์ธ๊บผ ๊ฐ์์ ์ผ๋จ ํผ์ ์๋ํด๋ณด๊ณ ์๋๋ฉด ๊ตฌ๊ธ๋ง ํด๋ณด์ ์ถ์๋ค. ๊ทผ๋ฐ ์ฌ๊ฑธ ์ฑ๊ณตํ๋ค. ์ฝฉ๋๋ฌผ ์ฒ๋ผ ๋๋ ์กฐ๊ธ์ฉ ์๋ผ๊ณ ์๋๋ณด๋ค. ๋ฟ๋ฏ! #5-1 ์ฝ๊ด๋์ ์ฒดํฌ๋ฐ์ค ๊ธฐ๋ฅ ์ค๊ณ 1) ์ ์ฒด๋์ ์ฒดํฌ ์ ์ธ๋ถํญ๋ชฉ 3๊ฐ ๋ชจ๋ ์๋์ฒดํฌ 2) ์ ์ฒด๋์ ์ฒดํฌํด์ ์ ์ธ๋ถํญ๋ชฉ 3๊ฐ ๋ชจ๋ ์๋ ์ฒดํฌํด์ 3) ์ธ๋ถํญ๋ชฉ 3๊ฐ ๋ชจ๋ ์ฒดํฌ ์ ์ ์ฒด๋์ ์๋์ฒดํฌ 4) ์ ์ฒด๋์ + ์ธ๋ถํญ๋ชฉ 3๊ฐ ๋ชจ๋ ์ฒดํฌ๋ ์ํ์์ ์ธ๋ถํญ๋ชฉ 1๊ฐ ์ฒดํฌํด์ ์ ์ ์ฒด๋์ ์๋ ์ฒดํฌํด์ #5-2 ์ฝ๊ด๋์ ์ฒดํฌ๋ฐ์ค ๊ธฐ๋ฅ ๊ตฌํ 1) ์ฒดํฌ๋ฐ์ค์ checked ์์ฑ๊ฐ์ธ true / false ๋ฅผ useState๋ฅผ ์ด์ฉํ์ฌ ์ ์ฅ ๋ฐ ๋ณ๊ฒฝํจ. 2) ๊ธฐ๋ฅ 1๋ฒ๊ณผ .. ์ด์ 1 2 3 4 5 ๋ค์