๐น B-tender
- ๋ค์ํ ์นตํ ์ผ ๋ ์ํผ ์ถ์ฒ ๋ฐ ์ ๋ณด ์ ๊ณต
- ๋๋ง์ ์นตํ ์ผ ๋ ์ํผ ๊ณต์
- ๋๋ง ์๋ ๋ถ์๊ธฐ ์ข์ ๋ฐ ์ถ์ฒ ๋ฐ ๊ณต์
- ์นด์นด์ค๋ฅผ ํตํ ์์ ๋ก๊ทธ์ธ ๋ฐ ๊ธฐ๋ณธ ํ์๊ฐ์ ์ผ๋ก ๊ฐ๋จํ๊ณ ์์ ํ๊ฒ ํ์๊ฐ์ ํ ์ ์์ด์!
- ๋ง์ดํ์ด์ง์์ ๋ด๊ฐ ์์ฑํ ๊ธ์ ๊ฐ์, ๋๋ค์ ๋ณ๊ฒฝ, ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ, ๊ณ์ ํํด ๋ฑ์ ๊ฐ๋ฅ์ ์ด์ฉํ ์ ์์ด์!
- ์ ๋ชฉ๋ก์์ ํ๋ฌ์ค ๋ฒํผ์ผ๋ก ๋ฉ์ธํ์ด์ง ์ ์ฅ๊ณ ์ ๋ด๊ฐ ๊ฐ์ง ์ ์ ๋ฑ๋กํ ์ ์์ด์!
- ๊ธฐ์กด์ ์กด์ฌํ๋ ์นตํ ์ผ ๋ ์ํผ๋ฅผ ์ถ์ฒ ๋ฐ์ ์ ์์ด์!
- ๋ด๊ฐ ๋ง๋ ๋๋ง์ ์นตํ ์ผ ๋ ์ํผ๋ฅผ ๊ธ์์ฑ์ ํตํด ๊ณต์ ํ ์ ์์ด์!
- ๋๋ง ์๊ณ ์๋ ๋ถ์๊ธฐ ์ข์ ๋ฐ๋ฅผ ๊ธ์์ฑ์ ํตํด ๊ณต์ ํ ์ ์์ด์!
- ๋ง์ดํ์ด์ง์์ ๋ด๊ฐ ์ข์์ ๋๋ฅธ ๋ชจ๋ ์ปจํ ์ธ ๋ฅผ ํ์ธํ ์ ์์ด์!
- Back-end Tech Stack
- Front-end Library
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ช | ๋ด์ฉ | ์ฐธ๊ณ |
---|---|---|
axios | ์๋ฒํต์ | |
typescript | ํ์ ์คํฌ๋ฆฝํธ | |
react-router-dom | ๋ ๋๋ง | |
react-query | ์๋ฒ๋ฐ์ดํฐ๊ด๋ฆฌ | |
recoil | ์ ์ญ์ํ๊ด๋ฆฌ | |
react-hook-form | ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ํผ ์์ฑ | |
react-cookie | ์ฟ ํค ์ฌ์ฉ ์ํ ์ปค์คํ ํ ์์ฑ | |
react-slick | ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋ | |
slick-carousel | ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋ | |
@ant-desingicons | ์์ด์ฝ ํดํท | |
react-icons | ์์ด์ฝ ํดํท | |
styled-components | css | |
react-modal | ๋ชจ๋ฌ์ฐฝ ์์ฑ | |
@types/react-dom | ํ์ ์คํฌ๋ฆฝํธ ๊ด๋ จ | |
@types/react | ํ์ ์คํฌ๋ฆฝํธ ๊ด๋ จ | |
@types/node | ํ์ ์คํฌ๋ฆฝํธ ๊ด๋ จ | |
@types/jest | ํ์ ์คํฌ๋ฆฝํธ ๊ด๋ จ |
- TypeScript (TypeScript vs JavaScript)
TypeScript๋ ์ ์ ํ์ ์ธ์ด์ด๊ธฐ์ js๋ณด๋ค ์ปดํ์ผ์ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฌ์ง๋ง, ์์ ์ฑ๋ณด์ฅ๊ณผ ์๋ฌ๋ฅผ js๋ฅผ ์ฌ์ฉํ ๋๋ณด๋ค ์์ํ๊ฒ ์ก์ ์ ์์ด์ ์ ์ ํ์ต๋๋ค.
- React-query (React-query vs Redux-toolkit vs Redux)
React-qeury๋ ์๋ฒ์ ๊ฐ์ ํด๋ผ์ด์ธํธ์ ๊ฐ์ ธ์ค๊ฑฐ๋, ์บ์ฑ, ๊ฐ ์ ๋ฐ์ดํธ, ์๋ฌํธ๋ค๋ง ๋ฑ ๋น๋๊ธฐ ๊ณผ์ ์ ๋์ฑ ํธ๋ฆฌํ๊ฒ ํด์ค์ ์ฌ์ฉํ์ต๋๋ค.
- Recoil (Recoil vs Redux toolkit vs Redux)
Recoil์ Redux์์ ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ ๊ฒฝ์ฐ์ Redux thunk ๋ฑ์ ์์กดํ์ฌ ์ฒ๋ฆฌ๋ฅผ ํด์๋๋ฐ, Recoil์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์ด ์๊ณ useState์ ์ ์ฌํ์ฌ ์ฌ์ฉํ๊ธฐ์ ํธ๋ฆฌํ๋ค๊ณ ํ๋จํ์ฌ ์ฌ์ฉํ์ต๋๋ค.
## ๐ฌ ์์ฐ์์
-
Back-end(Nodejs) : Back-end repo
-
Designer : DE-Figma
- ๊น์์ง
-
ํ notion : https://vine-sound-ddd.notion.site/Btender-7-D-2-74e39aa8b6714332aaf6afc6b66b2f69
- CloudFront ๋ฐฐํฌ ๊ด๋ จ ๋ฌธ์
โS3 ๋ฒํท์ ๋ด์ฉ์ ๋ค์ ์ ๋ก๋ํ์ฌ๋ ์บ์๊ฐ ์ ์ง๋์ด ์ผ์ ์๊ฐ์ด ์ง๋๋ ํด๋น ๋ณ๊ฒฝ ๋ด์ฉ์ด CloudFront์ ์ฆ์ ๋ฐ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
โ๏ธ์์ธ์ CloudFront์ ์บ์ ์ญ์ ์ ์ฑ ์ ์๊ฐ ์ค์ ์ด ๊ธธ๊ฒ ์ค์ ๋ ๊ฒ์ ์ถ์ ํ์๊ณ , ํ์ธํด๋ณธ ๊ฒฐ๊ณผ TTL ์ค์ ์ด 24 ์ค์ ๋์ด ์์์ต๋๋ค. ์์ธ์ ํ์ ํ ํ CloudFront์ ์ ์ฑ ์ ๋ง๋ค์ด TTL์ค์ ์ 1์ด๋ก ์ค์ ํ๊ณ , Invalidations(๋ฌดํจํ)์ ๋ง๋ ์ ์ฑ ์ ๋ฐ์ํ์ฌ Edge Location์ ์ ์ฅ๋ ์บ์๋ฅผ ์ญ์ ํ์ฌ S3 ๋ฒํท์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋๋ฉด ์ฆ์ ๋ฐ์๋๋๋ก ํ์์ต๋๋ค.
- ์์ ๋ก๊ทธ์ธ ๊ด๋ จ ๋ฌธ์
โ์์ ๋ก๊ทธ์ธ ์งํ์ ๋ฆฌ๋ค์ด๋ ํธ๋๋ฉด์ ํ ํฐ๊ฐ์ url๋ก ๋ฐ์์ค๋๋ฐ, ๋ฆฌ๋ค์ด๋ ํธ๊ฐ ์๋๋ ๋ฌธ์ , ํ ํฐ๊ฐ์ ๋ชป ๋ฐ๋ ๋ฌธ์ ๋ฐ์ํ์ต๋๋ค.
โ๏ธํ ํฐ๊ฐ์ ์ฟผ๋ฆฌ ์คํธ๋ง์ผ๋ก ๋ฐ์์ค์ง ์์์ ์ฃผ์์ ํ์ฑ params๋ก ๋ชป ๋ฐ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ฌ ์์ ์ ํ์์ผ๋, ์๋ก๊ณ ์นจ ์์๋ง ์ฟ ํค์ ํ ํฐ์ด ์ ์ฅ๋๋ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์๊ณ , ์ปดํฌ๋ํธ๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ ํ ํฐ์ ๋ฐ๋ ๋ถ๋ถ๊ณผ ์๋ฒ์ ์ ์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ ๋ถ๋ถ์ ๋๋์ด์ ์ ์ฅํ๋๋กํ์ฌ ํด๊ฒฐํ์์ต๋๋ค.
- react-query ๋ฐ์ดํฐ reading ๊ด๋ จ ๋ฌธ์
โreact-query๋ฅผ ํตํด ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ์ธํ์ ํ๋ ์ด์คํ๋์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฃ์ด์คฌ๋๋ฐ query์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ ์ ์คํ๋์ด undefined๋ map์ ๋๋ฆด ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํํ ํด๊ฒฐ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ ์ต์ ๋์ฒด์ด๋๊ณผ isLoading์ ์ฌ์ฉํ์ง๋ง ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
โ๏ธ
const titleData: string = query.isLoading
? "loading"
: `${query.data[0].title}`;
์ด์ ๊ฐ์ด ์์ ์์๋ก ์ง์ ํด์ค์ ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฌ์์ง์ง ์์์ ๋ loading์ ์ถ๋ ฅํด์ฃผ๊ณ ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฐํ๋๋ก ๋ง๋ค๊ณ
useEffect(() => {
setTitle(titleData);
setContent(contentData);
setAddress(addressData);
}, [titleData, addressData, contentData]);
useEffect๋ก ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฌ์์ง๋ฉด ์๋์ผ๋ก ๋ ๋๋ง ๋๋๋ก ํด์ค.
B-tender๋ 7/29 ๋ถํฐ 8/1๊น์ง 4์ผ๊ฐ ์ฌ์ฉ์ ํ ์คํธ๋ฅผ ์งํํ๊ณ , ์ด 211๋ช ์ด ์ ํฌ ์๋น์ค๋ฅผ ์ฌ์ฉํด์ฃผ์ จ์ต๋๋ค.
์ ๋ฐ์ ์ธ ์ฌ์ฉ๊ฒฝํ ๋ง์กฑ๋๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ๊ณ ,
์ ์ ๋ถ๋ค์ด ๊ฐ์ฅ ๋ง์ด ์ด์ฉํ์ ์๋น์ค๋ก๋ ์นตํ ์ผ ๋ ์ํผ ํ์ธ, ์ถ์ฒ ๋ฐ ํ์ธ, ๊ฒ์๊ธ ์ข์์, ๋ง์ดํ์ด์ง์์ ์ข์์ ๋ชฉ๋ก ํ์ธ์ด์์ต๋๋ค.