TodoList Project ๋?
๐ ๋ฐฐํฌ ๋งํฌ
https://joeunji0119.github.io/loginTodo/
ํ์
FE : ์กฐ์์ง
BE : ์ด์์ฐ
๊ธฐ์ ์คํ
FE
BE
ํ๋ก์ ํธ ์ค๋ช
ํ๋ฆฌ์จ ๋ณด๋ฉ ์๋ฃ ํ ๋ฐฐ์ด typeScript, ReactQuery, emotion.js ๋ฅผ ํ์ตํ๊ธฐ ์ํด ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๋๋ฃ์ ํจ๊ป TodoList ํ๋ก์ ํธ๋ฅผ ๊ธฐํํ์์ต๋๋ค
๊ตฌํ ๊ธฐ๋ฅ
๋ก๊ทธ์ธ / ํ์๊ฐ์ / TodoList
์ด๋ฒ ํ๋ก์ ํธ๋ ์ง๋ ํ๋ก์ ํธ๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ํ์ต์ ๋ชฉ์ ์ด ์ปธ๊ณ ํ๋ก ํธ, ๋ฐฑ์๋ ๊ฐ๊ฐ ํ๋ช ์ฉ ๊ตฌํํ ํฐ๋ผ ์์ ๋ ๋๊ฒ ์์ ํ ์ ์์๋ค. ํ๋ฆฌ์จ๋ณด๋ฉ์ ์๋ฃํ๋ฉฐ ๋ง์ ๊ฐ๋ฐ์ ๋ถ๋ค์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฐฐ์ด ์ ์ด ์ ๋ง ๋ง์๋๋ฐ, ์ด๋ฅผ ์ฝ๋๋ก ํ์ตํ๊ธฐ์ CRUD๊ฐ ๊ฐ์ฅ ์ ํฉํ๋ค๊ณ ์๊ฐํด, ๊ฐ์ ์๊ธฐ์ ํ๋ฆฌ์จ๋ณด๋ฉ์ ์๋ฃํ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋๊ณผ ํจ๊ป ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค.
ํ๋ฆฌ์จ๋ณด๋ฉ ๋๋ ์ฃผ์ด์ง api ๋ง์ ์ฌ์ฉํด ๊ณผ์ ๋ฅผ ๊ตฌํํด์ผํ๋๋ฐ, ์ด๋ฒ ๊ธฐํ์ ์ค๋๋ง์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋๊ณผ ํจ๊ป ์์ ํ ์ ์์ด์ ๊ตฌํ ํ๊ณ ํ ๊ธฐ๋ฅ์ ๋ง์ด ์ ์ ๋๋ ธ๋ค. ํนํ ํ์๊ฐ์ ์ฐฝ ๊ด๋ จํด์ ๋ง์ด ์์ด๋์ด๋ฅผ ๋๋๋ฐ, usehookForm์ ์จ์ ๋ง์ input ์ฐฝ์ ์ ํด๋ณด๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ํ์๊ณผ ํ์๋ฅผ ๊ฑฐ์ณ ํ์๊ฐ์ ์ฐฝ์์ ์ฌ์ง, ์ด๋ฆ, ์๋ ์์ผ, ์ฑ๋ณ, ์ด๋ฉ์ผ, ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ๊ธฐ๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์๋๋ ๋ค๋ฅผ๊น, ํ์๊ฐ์ ํ์ด์ง ๊ตฌํ ์ด๋ฐ์ useHookForm๊ณผ ํผ๋ฐ์ดํฐ๋ก ์ฌ์ง์ ๋ณด๋ด๋ ์์ ๋ ์ฒ์์ด์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ์ ์ ๋ฅผ ๋ง์ด ๋จน์๋ค. hookForm ๊ธฐ๋ณธ ์ค์ ์ด ํผ๋ฐ์ดํฐ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด
formData.append(name, value);
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋๋ฐ, formData ๋ฉ์๋๋ฅผ ๋ฃ์ง ์์ผ๋ ์ฌ์ง๋ง ๋ฐ์ดํฐ๊ฐ ๊ฐ์ง ์์๋ค. ์ฝ์์ ์ ์ฐํ๋๋ฐ ํ์ด๋ก๋์๋ ๋ด๊ธฐ์ง ์์๋ค. ๊ฒฐ๊ตญ formData ๋ก์ง์ ๋ฃ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ, ์ฝ๋๋์ด ํ ๋๊ฒ ๋ ์ ์ด ํฌ๊ฒ ์์ฌ์ ๋ค. ํ์ง๋ง ํ์๊ฐ์ ์ฐฝ์์๋ ๋์ด์ ์์ ์๊ฐ์ ์ง์ฒดํ ์ ์์๊ณ hookForm + formData ๋ก ์ฒ์ ๊ตฌํํ ์์ ๋ฌผ์ด๋ผ๋๋ฐ์ ์์์ ์ฐพ๊ณ ๋ค์ ๊ตฌํ ํํธ๋ก ๋์ด๊ฐ๋ค. ์ง๊ธ๋ ๋ฌผ๋ก ์์ฝ์ง๋ง ์ด๋์ ๊ฒฐ์ ์ด ์ณ์๋ค๊ณ ์๊ฐํ๋๋ฐ, ์ด๋ ๋์ฑ ์์ฌ์ ๋ถ๋ ค ๊ณ์ ํ์๊ฐ์ ํ์ด์ง๋ฅผ ์์ ํ๊ณ ์์๋ค๋ฉด ๊ตฌํ ๊ธฐ๊ฐ ๋์ด์ ธ ํ๋ก์ ํธ ๋ถ์๊ธฐ๊ฐ ๋ฃจ์ฆํด์ ธ ์์นซ ์์ฑ์ ๋ชปํ์ ์๋ ์๋ค๊ณ ์๊ฐํ๋ค.
todo ํ์ด์ง๋ reactQuery๋ฅผ ์ค์ ์ ์ผ๋ก ์ฐ๊ณ ์ํ๋ค. ์ข ๋ ์ ํ์ฉํ ์ ์์ ๊ฑฐ ๊ฐ์๋ฐ, ์ด๋ ๊ฒ ์ฐ๋ ์ปจ์ ์ด ์๋ ๊ฑฐ ๊ฐ์๋ฐ, ํ๋ ์์ฌ์ด ์ ์ด ๋จ๋ ์์ ์ด์๋๋ฐ ์ฌ์ค ํ์ต์ ์งํํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ todoList๋ฅผ ๊ตฌํํ๋๋ฐ reactQuery๋ ๋งค์ฐ ์ค๋ฒ ์คํ์ด๋ผ๊ณ ์๊ฐํ๋ค.
todoList๋ useQuery๋ฅผ ์ฌ์ฉํด ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ด์ ๋ ์์๊ณ error๋ loading ์ฒ๋ฆฌ๋ ํฌ๊ฒ ํ์ํ์ง ์์๋ค. CRUD(read ์ ์ธ) ๋ถ๋ถ์ useMutation ์ ์ฌ์ฉํด api ๋ฅผ ๋ถ๋ฌ์๋๋ฐ onSuccess ๋ก ์ ์ฒด list๋ฅผ ๋ค์ ๋ถ๋ฌ์ค๊ฒ๋ํ๋ค. ์ด๋ฐ ๋ฐฉํฅ์ผ๋ก ๋ก์ง์ ์ง๋ ๊ฒ ๋ฆฌ์กํธ ์ฟผ๋ฆฌ์ ์ปจ์ ์ ๋ง๋ค๊ณ ํ๋จํด์ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง, ์์ ๋ด๋ด ์คํ๋ ค ๋ถํ์ํ๊ฒ ํต์ ์ด ์ด๋ฃจ์ด์ง๋ค๋ ๋๋์ ๋ง์ด ๋ฐ์๋ค. ๊ฐ๋จํ todoList๋ ์คํ๋ ค UI์ ์ธ ๋ถ๋ถ์ ์ ๊ฒฝ์ ํฌ๊ฒ ์ฐ๋๊ฒ ๋ง๋ค๊ณ ๋๊ผ๋ค.
CSS-in-JS๋ก ์ด๋ฒ์ emotion.js ๋ฅผ ์ ํํด ์ฌ์ฉํ๋๋ฐ, ์ด ๋ํ ๋๋ฌด styled-component์ฒ๋ผ ์ฌ์ฉํด์ ์์ฌ์์ด ๋จ๋๋ค. ์ด๊ธฐ global, theme ์ค์ ๋๋ฌธ์ ์๊ฐ์ ๋ง์ด ์์ํ๋๋ฐ ํ์๋ <div css={styeld}> ํํ๊ฐ ๋ถํธํ๋ค๊ณ ๋๊ปด
import styled from "@emotion/styled"
๋ก ์ญ ์์ ํ๊ณ , ๊ฒฐ๊ตญ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ์ฃผ๋๋ฐ์ ๋งํ ํฌ๊ฒ ์ ๋ฅผ ๋จน์๋ค. styled-component ๋ ํจ์๋ฅผ props๋ก ๋๊ฒจ ์คํ์ผ.tx ๋ด์์ ๋ฐ๋ก ์ฒ๋ฆฌํ๋ฉด ๋์๋๋ฐ @emotion/styled ๋ ์ข ๋ค๋ฅธ ๊ฑฐ ๊ฐ์๋ค. ๊ฒฐ๊ตญ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ํจ์๋ก ๋บ๋๋ฐ ์ด ๋ถ๋ถ์ ๋ํด์๋ ํฌ๊ฒ ์์ฌ์์ด ๋จ์๋ค.
๊ณต์ ํด
Swagger
์ ๋ง ํธ๋ฆฌํ๊ฒ ์ธ ์ ์์๋ Swagger. ํ์ ํ์์ด ์ฐ๋ Swagger ํด์ ๋์ฌ๊ฒจ ๋ณด๊ณ ์์๊ธฐ ๋๋ฌธ์ ๊ผญ ๋ฐ์๋ณด๊ณ ์ถ์๋๋ฐ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์ฒ์์ผ๋ก ๋ฐ์๋ณด๊ฒ๋์๋ค. api๊ฐ ํ ๋์ ๋ค์ด์์ ๊ฐ์ฅ ์ข์๊ณ ๊ฐ ์ฐ์ธก์ ํ ๊ธ์ ํด๋ฆญํ๋ฉด ์๊ตฌํ๋ ๋ฐ์ดํฐ๋ค์ ๋ณผ ์ ์์๋๋ฐ, postman์ฒ๋ผ ๋ชจ๋ method๋ฅผ ํ ์คํธ ํด ๋ณผ ์ ์์ด ํธ๋ฆฌํ๋ค.
๊ทธ ์ธ์ ๊ณต์ ํด๋ก๋ ์ฌ๋์ ์ผ๊ณ ๊ฐ์ ๊ธฐ๊ฐ์ ๋ฐฑ์๋ ํ์๋ catBow ํ๋ก์ ํธ์ ํจ๊ป ์ฐธ์ฌํ์๊ธฐ ๋๋ฌธ์ ์คํ๋ผ์ธ์์์ ์ํต์ด ๋ง์ ๊ณต์ ํด์ ๋๋ฆฌ์ง ์์๋ค. ๊ฒ๋ค๊ฐ ์ด์ ๊ป ํด์๋ ํ๋ก์ ํธ์๋ ๋ฌ๋ฆฌ ์ด๋ฒ ํ๋ก์ ํธ๋ ๊ท๋ชจ๊ฐ ์์ ํ๋ก์ ํธ์๊ณ , ์๋ก ๊ฐ์ ๊ณต๊ฐ์์ ๋น ๋ฅธ ์๊ฐ ๋ด์ ํผ๋๋ฐฑ์ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด์ ํฐ ๋ถํธํจ ์์ด ์์ ํ ์ ์์๋ค.
๋๋ ์
์ด๋ฒ ํ๋ก์ ํธ๋ Catbow ํ๋ก์ ํธ์ ๊ธฐ๊ฐ์ด ๊ฒน์ณ ์จ์ ํ ์๊ฐ์ ์์ง ๋ชปํด ์์ฌ์์ด ๋จ์ง๋ง (๋ฐฑ์๋ ํ์๋ถ๋ catbow ํ๋ก์ ํธ๋ฅผ ํจ๊ปํ๊ธฐ ๋๋ฌธ์ ๋ณ๋ค๋ฅธ ์ด์๋ ์์๋ค.) ์ฐ๊ณ ์ถ์๋ ์คํ์ผ๋ก CRUD๋ฅผ ํ๋ค๋ ์ ์์ ์ฆ๊ฒ๊ณ ํ๋ณตํ๊ฒ ์์ ํ๋ค. ํ๋ฆฌ์จ๋ณด๋ฉ์ ์งง์ ๊ธฐ๊ฐ ๋ด์ ๊ณผ์ ๋ฅผ ์ํํด์ผํด์ ์๋ก์ด ์คํ๋ค์ ์ผ์ง๋ง ๊ณผ์ฐ ์ดํดํ๊ณ ์ด ๊ฒ์ด ๋ง๋๊ฐ ํ๋ ์๋ฌธ์ด ํฌ๊ฒ ๋ค์์๋๋ฐ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด ์ฒ์ฒํ ๊ณต์๋ฌธ์๋ฅผ ์ฝ๊ณ ๋ฐ๋ผ ์จ๋ณด๋ ์ถฉ๋ถํ ํ์ต ์๊ฐ์ด ์์๊ธฐ์ ๊ทธ๊ฑธ ์กฐ๊ธ์ด๋๋ง ํด์ํ๋ค๊ณ ๋๋๋ค. ์ด๋ฒ ํ๋ก์ ํธ๋ ์ด๋ ๊ฒ ๋ง๋ฌด๋ฆฌ ์ง์์ง๋ง, ๊ฐ๋จํ todoList์ธ ๋งํผ ๊ณ์ํด์ ๋ฆฌํฉํ ๋ง์ด ์ด๋ฃจ์ด์ง ๊ฑฐ ๊ฐ๋ค.
๋, ์ด๋ฒ์ ์ฌํ ๋ค๋ฅธ ํ๋ก์ ํธ๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ํ๋ก ํธ 1๋ช , ๋ฐฑ์๋ 1๋ช ์ผ๋ก๋ง ํ๋ก์ ํธ๋ฅผ ์งํํด ๋ฃจ์ฆํด์ง ์๋ ์์๋๋ฐ ์ด ์ ์ ๋งค์ผ ์คํ๋ผ์ธ์ผ๋ก ์๋ก ์์ด๋์ด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ ์งํ ์ํฉ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ๊ฐ ํ์ง๋ถ์ง ๋๋ ์ผ ์์ด ์ ๋ง๋ฌด๋ฆฌ ๋์๋ค๊ณ ์๊ฐํ๋ค. ๊ฐ๋ฐ์๋ฅผ ๊ฟ๊พธ๊ณ ๊ฐ๋ฐ์ ํ์ตํ์ง ๋ฒ์จ 5๊ฐ์์ด ํ๋ฌ๊ฐ๊ณ ์๋ค. ๊ทธ ๋์ 3-4๊ฐ์ ํ๋ก์ ํธ๋ฅผ ๊ฑฐ์น๋ฉด์ ์์ ์ํฉ์ ๊ณต์ ํ๊ณ ํ์๊ณผ ์ปค๋ฎค๋์ผ์ด์ ์ ํ๋๋ฐ ์์ด์ ์์ฐ์ค๋ฌ์์ก๋ค๊ณ ๋๋๋ค. ์ํ๋ ํผ์ ์ ์ํ๊ณ ํ์์ ์์ด๋์ด๋ฅผ ๋ฃ๊ณ ์์ฉํ๊ณ ํํํ๋ ๊ณผ์ ์ด ๋งค์ฐ ์ฆ๊ฑฐ์ ๋๋ฐ, ํนํ ์ด๋ฒ์ ๋ฐฑ์๋ ํ ๋ถ์ด ๋ง๋์ ๋ฐ์ดํฐ๋ฅผ UI๋ก ๊ทธ๋ ค ๋์ผ๋ก ๋ณด์ฌ์คฌ๋ค๋ ๋ง์กฑ๊ฐ๋ ๋๋ฆ ๋จ์๋ค.
์ฒซ ํ๋ก์ ํธ ๋์ '๋'์ ์ง๊ธ์ '๋'๋ฅผ ๋น๊ตํ์๋ฉด ๊ธฐ์ ์ ์ธ ๋ฉด๋ ๋ง์ด ๋ฐ์ ํ์ง๋ง ์ด์ฟํ ๊ฐ๋ฐ์๋ก์ ์ ์ฒด์ ์ธ ํ์ ์ดํดํ๊ณ ์์ด๋์ด๋ฅผ ์ ์ํด ์์ฐ์ค๋ฌ์ด ์ปค๋ฎค๋์ผ์ด์ ์ ํ๋ค๋ ์ ์ ์์ด์ ํฌ๊ฒ ์ฑ์ฅํ๋ค๊ณ ๋๋๋ค. ์ด๋ ๊ตฌํํ๊ณ ์ถ์๋ ์ ์ ํ์พํ ์์ฉํด์ฃผ์ ๋ฐฑ์๋ ํ์๋ถ์ด ์์๊ธฐ์ ๊ฐ๋ฅํ ์ผ์ด๋ผ ์๊ฐํ๋ค. ๐ช
์์ผ๋ก ์ธ๊ฒฉ์ ์ผ๋ก๋ ๊ธฐ์ ์ ์ผ๋ก ๋์์์ด ๋ฐ์ ํด ๋๊ฐ๋ ํ๋ก ํธ ๊ฐ๋ฐ์๊ฐ ๋์ด์ผ๊ฒ ๋ค๋ ๋ค์ง์ ๋ค์ ๊ตณ๊ฒ ์๊ธฐ๊ฒ ๋๋ ํ๋ก์ ํธ์๋ค.
๐ ๊ด๋ จ ํฌ์คํ
https://0119eunji.tistory.com/71
๋๊ธ