์ฃผ์ ์์
- ๊ธฐ๋ณธ์ ์ธ ui ์ ์์ค
- ์์ด์ฝ ์ปดํฌ๋ํธ๋ค ์ ์
- ui ์ ์ ๊ณผ์ ์์ ํ์ํ ๋๋ฏธ ๋ฐ์ดํฐ ์ ์
- ์ ๋๋ฉ์ด์ ์กฐ๊ธ ํ๋ค๊ฐ ๋ฏธ๋ฃฌ์ด..ใ
ํ์ต ํค์๋
- Fsd
- css grid
- animation
- tailwindcss
๊ณ ๋ฏผ ๋ฐ ํด๊ฒฐ๊ณผ์
์์ด์ฝ์ ์ปดํฌ๋ํธํ
<svg
width="24"
height="22"
viewBox="0 0 24 22"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M19.0554 2.41708C19.7228 2.69364 20.3292 3.099 20.84 3.60999C21.351 4.12075 21.7563 4.72718 22.0329 5.39464C22.3095 6.0621 22.4518 6.77751 22.4518 7.49999C22.4518 8.22248 22.3095 8.93789 22.0329 9.60535C21.7563 10.2728 21.351 10.8792 20.84 11.39L19.78 12.45L12 20.23L4.22 12.45L3.16 11.39C2.1283 10.3583 1.54871 8.95903 1.54871 7.49999C1.54871 6.04096 2.1283 4.64169 3.16 3.60999C4.19169 2.5783 5.59096 1.9987 7.05 1.9987C8.50903 1.9987 9.9083 2.5783 10.94 3.60999L12 4.66999L13.06 3.60999C13.5708 3.099 14.1772 2.69364 14.8446 2.41708C15.5121 2.14052 16.2275 1.99817 16.95 1.99817C17.6725 1.99817 18.3879 2.14052 19.0554 2.41708Z"
stroke="black"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>๊ธฐ์กด์ svg๋ ์ด์ ๊ฐ์ ํํ๋ก ๋์ด์๋ค.
svg๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ค.
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ img ํ๊ทธ์ src ์์ฑ์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค.
img ํ๊ทธ์ src ์์ฑ์ผ๋ก ํด๋น svg๋ฅผ ๊ทธ๋๋ก import ํด์๋ ์์ด์ฝ์ ์ ์ ์๋ํ๋ค. ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ฏธ์ง๋ก svg๊ฐ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ tint-color ์ ๊ฐ์ ๋ถ๋ถ์ ๋ฐ๊ฟ ์ ์๋ ๋ฐฉ๋ฒ์ด ์ด๋ ต๋ค. filter๋ก ์์์ ์กฐ์ ํ ์๋ ์์ง๋ง ์ด์ ๊ฐ์ ๊ฒฝ์ฐ ๋ฐ๋ก ์ค์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฒ๊ฑฐ๋กญ๋ค๊ณ ์๊ฐํ๋ค.
๋๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ด ๋ฒ๊ฑฐ๋กญ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ฐจ๋ผ๋ฆฌ ์ด๋ฅผ ์ปดํฌ๋ํธํ์ํค๋ฉด ์ด๋จ๊น? ํ๊ณ ์๊ฐํด๋ณด์๋ค.
import { IconProps } from "./iconPropsType";
export const NewspaperIcon = ({ className, size }: IconProps) => {
return (
<svg
width={size === "l" ? "24" : "16"}
height={size === "l" ? "24" : "16"}
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M20 3.75V18.5C19.9998 18.6249 20.0463 18.7455 20.1305 18.8378C ... 75 6.497Z"
fill="#14212B"
className={className}
/>
</svg>
);
};
์ด์ ๊ฐ์ด ์ฌ์ด์ฆ๋ ๊ธฐํ์์ ๋ช
์๋ ๋๋ก 16px๊ณผ 24px๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ด์ฆ๋ฅผ ๋๊ฐ์ง๋ก ๋๋์ด ์ผํญ์ฐ์ฐ์๋ฅผ ํตํด ๊ตฌ๋ถํด์ค๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ๊ฐ ์ปดํฌ๋ํธ์ ๋ํด์ ๊ตณ์ด ํ๋์ฉ ๋ง๋ค์ด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ถํธํ๋ค๋ ๋๋์ด ์์์ ์์๋ค. ํ์ฌ๋ ๊ทธ๋ ๊ฒ ๋ง์ง๋ ์์์ ๊ด์ฐฎ์์ง๋ง ๋์ค์ ์์ด์ฝ๋ค์ด ํจ์ฌ ๋ง์์ง๋ค๋ฉด enum์ฒ๋ผ ๊ด๋ฆฌํ๋ฉด์ ๊ฐ ์์ด์ฝ์ path attribute์ธ d๋ง ๊ด๋ฆฌํด์ ์ฌ์ฉํ ์ ์์ง ์์๊น? ํ๋ ์๊ฐ์ด ์๋ค .
๋ฆฌ๋ทฐ ์์ฒญ
์๋ ํ์ธ์ ๋ฉํ ๋! ๊ณ ์ ๋ง์ผ์ญ๋๋คใ ใ ์ค๋์ ui ๊ตฌ์ฑํ๋ฉด์ ์ ๋๋ฉ์ด์ ์ด ๋ฏ์ค์ด์ ๊ณ์ ํค๋งค๋ค๊ฐ ํฌ๊ฒ ์ง์ ๋๊ฒ ์๋ค์ใ ใ .. ๊ธ์ผ ๋ฆฌ๋ทฐ ์์ฒญ๋๋ฆฌ๊ณ ์ถ์ ๊ฒ์ ํด๋ ๊ตฌ์กฐ์ ๋๋ค.
client
โโ .prettierrc
โโ README.md
โโ eslint.config.js
โโ index.html
โโ package-lock.json
โโ package.json
โโ postcss.config.js
โโ public
โ โโ fonts
โโ src
โ โโ app
โ โ โโ App.tsx
โ โโ entities
โ โ โโ PressItem
โ โ โ โโ api
โ โ โ โโ index.tsx
โ โ โ โโ lib
โ โ โ โโ model
โ โ โ โโ ui
โ โ โ โโ pressItem.tsx
โ โ โโ article
โ โ โ โโ api
โ โ โ โโ lib
โ โ โ โโ model
โ โ โ โโ ui
โ โ โ โโ article.tsx
โ โ โโ autoRollingNews
โ โ โ โโ api
โ โ โ โโ index.tsx
โ โ โ โโ lib
โ โ โ โ โโ dummy.ts
โ โ โ โโ model
โ โ โ โ โโ useNewsData.ts
โ โ โ โโ ui
โ โ โ โโ autoRollingNews.tsx
โ โ โ โโ autoRollingNewsItem.tsx
โ โ โ โโ shortNews.tsx
โ โ โโ category
โ โ โ โโ api
โ โ โ โโ lib
โ โ โ โโ model
โ โ โ โโ ui
โ โ โโ mainArticle
โ โ โ โโ api
โ โ โ โโ lib
โ โ โ โโ model
โ โ โ โโ ui
โ โ โโ newsHeader
โ โ โ โโ api
โ โ โ โโ index.tsx
โ โ โ โโ lib
โ โ โ โโ model
โ โ โ โโ ui
โ โ โ โโ newsHeader.tsx
โ โ โโ subArticle
โ โ โโ api
โ โ โโ lib
โ โ โโ model
โ โ โโ ui
โ โโ features
โ โโ index.css
โ โโ main.tsx
โ โโ shared
โ โ โโ lib
โ โ โ โโ getToday.ts
โ โ โ โโ index.ts
โ โ โโ ui
โ โ โโ alert.tsx
โ โ โโ badge.tsx
โ โ โโ button.tsx
โ โ โโ header.tsx
โ โ โโ icons
โ โ โ โโ chevron-right.tsx...
โ โ โโ index.tsx
โ โ โโ logo.tsx
โ โ โโ todaysDate.tsx
โ โโ vite-env.d.ts
โ โโ widgets
โ โโ articles
โ โ โโ api
โ โ โโ lib
โ โ โโ model
โ โ โ โโ dummy.json
โ โ โ โโ dummy.ts
โ โ โโ ui
โ โ โโ ariticles.tsx
โ โโ subArticles
โ โโ api
โ โโ lib
โ โโ model
โ โโ ui
โโ tailwind.config.js
โโ tsconfig.app.json
โโ tsconfig.json
โโ tsconfig.node.json
โโ vite.config.tsํ์ฌ ์ ์ ํด๋๊ตฌ์กฐ์
๋๋ค.
์ ๋ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด์ ๋น์ฆ๋์ค ๋ก์ง, ๋ฐ์ดํฐ, ui๋ฑ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด fsd ํจํด์ ์์๋ฅผ ์ผ๋ถ ๊ฐ์ ธ์ ํ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
ํ์ง๋ง ๋ง์ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฅํ๋ผ! ๋ผ๊ณ ํ์ ๋ ๋ฌด์์ ์ด๋ป๊ฒ ๋๋์ด์ผ ํ ๊น?์ ๋ํ ๊ณ ๋ฏผ์ด ๊ณ์ ๋ญ๋๋ค. ์์ง์ ๊ด์ฌ์ฌ์ ๋ํ ๊ฐ๋
์์ฒด๊ฐ ๋ถ์กฑํ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์ฌ ์ ๊ฐ ๊ณํํ๊ณ ์๋ ๋ฐ๋ก๋ ํฌ๊ฒ ๋ณด์์ ๋(layer)
- entities : ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๊ณ ์๋ ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํฐ๋ค์ ๋ค๋ฃจ๋ ์ปดํฌ๋ํธ(api fetch)
- widget: entities๋ค์ด ๋ชจ์ฌ ํ๋์ ์น์ , ์ฆ ํ์ด์ง์์ ํ์ฉํ๋ ํฐ ๋จ์์ ๋ ๋ฆฝ์ ์ปดํฌ๋ํธ๋ค. entities๋ค์ ๋ฌถ๊ณ ํ์ entites๋ก ํ์ํ state๋ฅผ ๋ด๋ ค์ฃผ๋ ์ญํ
- feature: ๊ฐ ์ปดํฌ๋ํธ์ ๋ถ์ฌ๋ ์ ์๋ ์ด๋ฒคํธ๋ค์ ๋๋ฉ์ธ๋ณ๋ก ๋ฌถ์ด ๋๋ ๋๋ ํ ๋ฆฌ
- app : ์ํธ๋ฆฌ ํฌ์ธํธ์ด์ ์ ์ญ ์คํ์ผ, ํ์ฌ๋ ๋จ์ผ ํ์ด์ง๋ฏ๋ก ํด๋น app์ ์์ชฝ ์์๋ฅผ ์ฑ์๋ฃ์ ์์
- shared: ๊ณตํต์ ์ผ๋ก ์ด๋์๋ ์ฐ์ผ ์ ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ง ์๋ ์ปดํฌ๋ํธ๋ค ์ด ์ ๋๋ก ๋๋ ํ ๋ฆฌ๋ฅผ ๋๋์๊ณ , entitie๋ widgets์ ๊ฒฝ์ฐ๋ ์ปดํฌ๋ํธ๋ณ๋ก ๋๋ ํ ๋ฆฌ๋ฅผ ๋๋์์ต๋๋ค.
ํ์ ๋๋ ํ ๋ฆฌ๋ก๋
- ui: ๊ธฐ๋ณธ์ ์ธ ๋์์ธ ์์
- api: ํ์ํ api fetchingํ๋ ํจ์๋ค
- lib: ์ปดํฌ๋ํธ์์ ํ์ํ ์ ํธํจ์๋ค
- model: ๋น์ฆ๋์ค์ ์ธ ๋ก์ง ์ ๋ด๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ง๋ฌธ๋๋ฆฌ๊ณ ์ถ์ ์ ์
์ ์ฒด์ ์ธ ๋๋ ํ ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ํตํด ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๊ฐ ์ ์ด๋ฃจ์ด์ง๊ณ ์๋์ง ๊ถ๊ธํฉ๋๋ค.- ์ด ๋ถ๋ถ์ ์์ง ์ ๋๋ก ์์ฑ๋ ๊ฒ ์๋ค๋ณด๋ ๋์ค์ ๋ค์๊ธ ํผ๋๋ฐฑ ์์ฒญ๋๋ฆฌ๊ฒ ์ต๋๋ค.
- ๋น์ฆ๋์ค์ ์ธ ๋ก์ง์ api์๋ ๋ค๋ฅธ๊ฐ?
- ์ฌ๋ฌ ์๋ฃ๋ค์ ์ฐพ์๋ณด์์์๋ ์์ง๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ api ํธ์ถ์ ๊ณผ์ ์ ๋ช ํํ๊ฒ ๊ตฌ๋ถ์ง๋ ๊ฒ์ด ๋จธ๋ฆฟ์์์๋ ์ด๋ ต์ต๋๋ค.
- fsd ํจํด๋๋ก๋ผ๋ฉด, ๋ง์ฝ ๋ธ๋ก๊ทธ ์๋น์ค์์ ์ด๋ค ๊ธ์ ์์ฑํ๋ค๊ณ ์น ๋,
- ์์ฑ ๋ฒํผ์ ๋๋ ์ ๋ ์คํ๋์ด์ผ ํ๋ ํจ์ โ feature์ ํจ์
- ์์ฑ ๋ฒํผ์ ๋๋ ์ ๋ ์คํ๋ ํจ์ ์์์ api ํธ์ถ ๋ฐ ์๋ฌ์ ๋ํ ์ฒ๋ฆฌ, navigate ๋ฑ โ ๋น์ฆ๋์ค ๋ก์ง
- state๋ก ๊ด๋ฆฌํ๋ ์์ฑํ๋ ๊ธ์ ๋ฐ์ดํฐ(์ ๋ชฉ, ๋ณธ๋ฌธ ๋ฑ) โ model
- ์ค๋ก์น fetch๋ง ํ๋ ํจ์ โ api
- ์ด๋ฐ ์์ผ๋ก ์ดํดํ๋๋ฐ, ์ ๊ฐ ์ดํดํ ๋น์ฆ๋์ค ๋ก์ง๊ณผ api, ๋ชจ๋ธ์ ๋ฐฉํฅ์ด ๋ง๋์ง ๊ถ๊ธํฉ๋๋ค.
์ค๋์ ๋ง์ด ํ ๊ฒ์ด ์์ด ์ด๊ฒ๋ง ๋ฐ๋ก ์ง๋ฌธ๋๋ฆฝ๋๋คใ .ใ ๋ค์๋ฒ์ ์กฐ๊ธ ๋ ์ค๋นํด์ ๊ฐ์ ธ์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค..! ๊ฐ์ฌํฉ๋๋ค ์ข์ ํ๋ฃจ ๋์ธ์โบ๏ธ