The 5th Generation
โฐ 2024-06-01 (ํ ) 13:42:22
5๋ฒ ์งธ ๋ฆฌ๋ด์ผ
5๋ฒ ์งธ ๋ธ๋ก๊ทธ ๋ฆฌ๋ด์ผ์ด๋ค. 4๋ฒ ์งธ ๋ฆฌ๋ด์ผ์ด 23๋ 9์์ด๋, ๋ฐ ๋ ๋ง์ ๋ค์ ํ ๋ฒ ๋๊ณต์ฌ๋ฅผ ์ํํ๋ค.
4๋ฒ ์งธ ๋ธ๋ก๊ทธ๋ ๋ธ๋ก๊ทธ์ UI ๊ฐ์ ๋ฐ ํ์ ํ ์ฝ๋์ ๋ณด์์ด์๋ค๋ฉด, 5๋ฒ ์งธ๋ ํ๋ก์ ํธ์ ์ ๋ฐ์ ์ธ ๊ตฌ์กฐ ๊ฐ์ ๋ฐ ํตํฉ์ ํตํ ๊ณ ๋ํ๋ฅผ ์ค์ ์ผ๋ก ์ํํ๋ค.
์ฃผ์ ๊ฐ์ ์ ์ ์๋์ ๊ฐ๋ค.
- ๋ชจ๋ ธ๋ ํฌ ๋์
- ํ๋ก์ ํธ ๊ตฌ์กฐ ์ฌ์ค๊ณ
- ์ ๋๋ฉ์ด์ ๊ฐ์ ์ ํตํ UI/UX ๊ณ ๋ํ
์์ ์งํํ ๋ฆฌ๋ด์ผ์ ๋นํด, ์ด๋ฒ ๋ฆฌ๋ด์ผ์ ๊ฐ๋ฐ์์ ๊ด์ ์์ ํจ์ฌ ๋์ ์์ค์ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ก๋ค.
1. ๋ชจ๋
ธ๋ ํฌ ๋์
์ฒซ ๋ฒ์งธ๋ก, ํ๋ก์ ํธ์ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋์ ํ๋ค. ์ํํธ์จ์ด ์ํคํ ์ณ์์ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋ฐฉ์์ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ๊ตฌ๋ถ๋๋ฉฐ, ๊ฐ๊ฐ ๋ชจ๋๋ฆฌ์ค(Monolith), ๋ฉํฐ๋ ํฌ(Multi-Repo), ๋ชจ๋ ธ๋ ํฌ(Mono-Repo) ๋ช ์นญ์ผ๋ก ์ ์ํ๋ค.
๊ฐ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋ฐฉ์์ ๋์ํํ๋ฉด ์์ ๊ฐ๋ค.
- ๋ชจ๋๋ฆฌ์ค
- ๐ก ์ธ ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ๊ฑฐ๋ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค. ์ฌ๋ฌ ํ๋ก์ ํธ๊ฐ ๋ชจ์ฌ ํ๋์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ด๋ฃฌ๋ค. ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์๊ณ , ๋น ๋ฅธ ์๋๋ฅผ ์๊ตฌํ๋ ํ๋ก์ ํธ์ผ์๋ก ์ ์ฉํ๋ค.
- โ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋๋ค.
- โ ๊ฐ๋ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ํ๋ค.
- โ ๋น๋ ํ์ดํ๋ผ์ธ ๋ฐ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ๋ช ํํ๋ค.
- โ ํ๋ก์ ํธ ๋ถ์์ ๋ง์ ์๊ฐ์ด ์์๋๋ค.
- โ ์ฌ์ด๋ ์ดํํธ ์ํฅ๋๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์์ง๋ค.
- โ ๊ท๋ชจ์ ๋น๋กํ์ฌ ํ ์คํธ ๋ฐ ๋น๋ ์๊ฐ์ด ํฌ๊ฒ ์ฆ๊ฐํ๋ค.
- โ ๊ฐ ์ฝ๋์ ์์ง๋๊ฐ ๋งค์ฐ ๋๋ค.
- ๋ฉํฐ๋ ํฌ
- ๐ก ๊ฐ๊ฐ์ ํ๋ก์ ํธ๊ฐ ๋๋์ด ๊ฐ๊ฐ์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๊ฐ์ง๋ค. ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ํฌ๊ณ , ๊ฐ ํ๋ก์ ํธ์ ๋ฉ์ธํฐ๋์ค ํ๋ณด๊ฐ ๊ฐ๋ฅํ ํ๋ก์ ํธ์ ์ ์ฉํ๋ค. ๋๋ถ๋ถ์ ์๋น์ค์์ ์ผ๋ฐ์ ์ผ๋ก ์ฑํํ๋ค.
- โ ํ๋ก์ ํธ๋ณ ์ค๋์ญ ๋ฐ ์ ๋ฌธ์ฑ ํ๋ณด๊ฐ ์ฉ์ดํ๋ค.
- โ ๊ฐ ์ฝ๋์ ์์ง๋๊ฐ ๋ฎ์์ง๋ค.
- โ ๊ฐ ํ๋ก์ ํธ๋ง๋ค ์ต์ ํ๋ ์ค์ ๋ฐ ์ธํ๋ผ ๊ตฌ์ถ์ด ๊ฐ๋ฅํ๋ค.
- โ ๊ท๋ชจ๊ฐ ์๊ณ , ๋ ํฌ์งํ ๋ฆฌ ๋ณ ์ญํ ์ด ๋น๊ต์ ๋ช ํํ์ฌ ๋ถ์ฐ ์ ๋ฌด์ ์ฉ์ดํ๋ค.
- โ ํ ์คํธ ๋ฐ ๋น๋์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- โ ์ค๋ณต ์ฝ๋๊ฐ ๋ฐ์ํ๋ค.
- โ ํ๋ก์ ํธ๋ณ ์ค์ ์ด ์ธ๋ถํ๋ ์๋ก ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ๋ง์์ง๋ค.
- โ ๊ด์ฌ์ฌ์ ๋ฐ๋ผ ๋ ํฌ์งํ ๋ฆฌ์ ๊ฐ๋ผํ๊ณ ์คํ๊ฐ ์ผ์ด๋๊ธฐ ์ฝ๋ค.
- โ ๊ฐ ํ๋ก์ ํธ๋ณ๋ก ์์กด์ฑ์ด ๊ฐํด์ง ๊ฒฝ์ฐ, ๊ฐ ํ๋ก์ ํธ์ ๋ณํ์ ๋ฐ๋ฅธ ์ฆ๊ฐ์ ์ธ ๋์์ด ์ด๋ ต๋ค.
- ๋ชจ๋
ธ๋ ํฌ
- ๐ก ์ฌ๋ฌ ํ๋ก์ ํธ๊ฐ ๋ชจ์ฌ ํ๋์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ด๋ฃจ์ง๋ง, ๊ฐ ํ๋ก์ ํธ๊ฐ ๊ตฌ์กฐ์ ์ผ๋ก ๊ตฌ๋ถ๋์ด์๋ค. ๊ฐ๋ฐ์์ ์ญ๋๊ณผ ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ชจ๋๋ฆฌ์ค์ ๋ฉํฐ๋ ํฌ์ ์ฅ์ ์ ์ทจํด ๋๊ท๋ชจ ํ๋ก์ ํธ๋ฅผ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ์์ด๋ค.
- โ ์ ์ฒด ์ฝ๋๋ฅผ ๊ด๋ฆฌํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ผ๋ฉด์๋, ๊ตฌ์กฐ์ ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- โ ์๋น์ค ์ฝ๋ ์ ์ฒด์ ์ผ๊ด์ฑ์ ๋ถ์ฌํ ์ ์๋ค.
- โ ๊ฐ ํ๋ก์ ํธ ๋ณ ๋ณํ์ ๊ธฐ๋ฏผํ๊ฒ ๋์ํ ์ ์๋ค.
- โ ์ง์ ์ฅ๋ฒฝ์ด ๋๋ค. ๋ชจ๋ ธ๋ ํฌ์ ์ดํด๋๊ฐ ๋จ์ด์ง ๊ฒฝ์ฐ, ๋จ์ ๋ง์ ์ทจํ๋ ์ด๊ทน์ด ๋ฐ์ํ ์ ์๋ค.
- โ ๊ตฌ์กฐ๋ฅผ ๋๋๋ฟ, ํ๋ก์ ํธ์ ๊ท๋ชจ๋ ์ฌ์ ํ ๊ฑฐ๋ํ๋ฉฐ, ์ด๋ก์ธํ ๋จ์ ์ญ์ ๋ฐ๋ผ์จ๋ค.
1-1. Y?
๊ทธ๋ ๋ค๋ฉด ์ ๋๋ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋์ ํ๊ธฐ๋ก ํ์๊น? ๊ทธ ์ด์ ๋ ๐ ์ฐ๊ตฌ์์ ๐ ๋ธ๋ก๊ทธ์ ์๋ค.
๋ ์ฌ์ดํธ์ UI ๋ฐ ๋ ์ด์์ ๊ตฌ์กฐ๋ ๋งค์ฐ ํก์ฌํ๋ค. ๊ทธ ๋ฟ๋ง ์๋๋ผ, ๊ฝค๋ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง ๋ํ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค.
์ผ๋ก๋ก, ์ฐ๊ตฌ์ ํ๋ก์ ํธ ์ค๋ช ๊ณผ ๋ธ๋ก๊ทธ์ ๊ฒ์๊ธ์ ๋ชจ๋ ๋งํฌ๋ค์ด์ ํ์ฉํ๋ฉฐ, ์ด๋ฅผ ๋ณํํ๋ ๋ก์ง ๋ฐ ์ปดํฌ๋ํธ๊ฐ ํ์ํ๋ค. ๋น์ฐํ ๊ทธ ๋ถ๋ ๋ํ ์ ์ง ์์๋ฐ, ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ด ์์ ๋๋ง๋ค ์ผ์ผํ ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ณต์ ํด์ผํ๋ค.
๊ธ ์์ฑ์ด ๋น๋ฒํ ์ผ์ด๋๋ ๋ธ๋ก๊ทธ์ ๋นํด, ๋น๊ต์ ๋ณ๊ฒฝ์ ์ฌ์ง๊ฐ ์ ์ ์ฐ๊ตฌ์ ํ์ด์ง๋ ์๋์ ์ผ๋ก ๊ฐ๋ผํ๊ณ ์คํ๊ฐ ์ฝ๊ฒ ์ผ์ด๋๊ธฐ ์ผ์ค์๋ค.
์๊ฐํด๋ณด๋ฉด, ์ด๋ ๊ฒ๋ ๋น์ทํ ๋ ํ์ด์ง๋ฅผ ๊ตณ์ด ๋ ๋ ํฌ์งํ ๋ฆฌ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋ ๊ฑด ์ญ์ ๋ถํธํ๋ค.
์์ ํ๋์ ๋ ํฌ์งํ ๋ฆฌ๋ก ํฉ์ณ ์ ์ฒด์ ์ธ ํ๋ก์ ํธ์ ์ผ๊ด์ฑ์ ํ๋ณดํ๊ณ , ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๋ฉด ์ฐ๊ตฌ์์ ๋ธ๋ก๊ทธ ํ์ด์ง ๋ชจ๋์๊ฒ ์ ์ํ์ด ๋ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
์ด์ ํ์ฌ์์ ๋ชจ๋ ธ๋ ํฌ ๊ธฐ๋ฐ์ ํ๋ก์ ํธ๋ฅผ ๋ด๋นํ ๋๋ถ์ ๋์ถฉ ๊ฐ๋ ์ ์๊ณ ์๊ธฐ๋ ํ๊ณ , ์์ฆ ํธ๋ ํธ๋ผ ์ด ์ฐธ์ ์ ์ฉํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์๋ค.
1-2. How?
๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ธ ์ ์๋ ๋๊ตฌ๊ฐ ๋ช ๊ฐ์ง ์๋๋ฐ, ๋ํ์ ์ผ๋ก ๐ turborepo, ๐ Lerna, ๐ NX๊ฐ ์๋ค.
๊ทธ ์ค NX๋ฅผ ์ ํํ๊ธฐ๋ก ํ๋ค. ์ ํํ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
- turborepo๋ ์ง์ ์ฅ๋ฒฝ์ด ๋ฎ๋ค. ๋ฌผ๋ก ์ฅ์ ์ธ๋ฐ, ๋ณดํต ์ ๋ฌ๋ฉด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์๋์ ์ผ๋ก ๋น์ฝํ๋ค.
- ์ด์ ํ๋๊ฑฐ ์ด๋ ค์ด ๊ฑธ๋ก ํด๋ด์ผ์ง ํ๋ ์ผ์ข ์ ๊ฐ๊ธฐ๋ค. ์ด๋ ค์ด๊ฑธ ์๋ํ๋ฉด ๋์ค์ ์ด๋๊ฐ์ ํ ๋ง๋๋ผ๋ ๋ ํ ์ ์๋ค.
- ๋น์ทํ ์ด์ ๋ก, Hard -> Easy๋ ์ ๋นํ๋ฐ, Easy -> Hard๋ Nothing -> Hard ๋ณด๋ค ํจ์ฌ ์ด๋ ต๋ค.
- Lerna๋ ์ด์ ํ์ฌ์์ ์ ํด๋ณธ ๊ฒฝํ์ด ์์ง๋ง, NX๊ฐ ์ธ์ํ๋ค. ์ฆ, ๋ฏธ๋๊ฐ ๋ถํฌ๋ช ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- NX ์ญ์ ์ด์ ํ์ฌ์์ ์ ํด๋ดค๊ณ , ์ด๋ ต์ง๋ง ๊ทธ ๋งํผ ํ๊ตฌํ ์์๊ฐ ๋ง๋ค.
NX๋ VSCode์ ๋งค์ฐ ์นํ์ ์ด๋ค. VSCode๋ฅผ ํ์ฉํ๋ฉด ๐ Nx Console ํ๋ฌ๊ทธ์ธ์ ํตํด NX์ ๊ธฐ๋ฅ๊ณผ ๋ช ๋ น์ด๋ฅผ UI ๊ธฐ๋ฐ์ผ๋ก ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋ ๋ํ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ญ๋ถ ํ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ๋ค.
apps/
์ packages/
๋ก ํฐ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๋๋ด๋ค. apps/
์๋ ์ฑ ๊ตฌ์ถ๊ณผ ๊ด๋ จ๋ ์ฝ๋๋ค์ ๋๊ณ , packages/
๋ ํด๋น ์ฑ์ ๊ตฌํํ๋ ์ปดํฌ๋ํธ, API, ์ํ๊ด๋ฆฌ ํ๋ก์ ํธ๋ค์ด ์์นํ๋ ๊ตฌ์กฐ๋ค.
apps/
๋ ๋น๋ ๋์์ผ๋ก, apps/
ํ์์ ํ๋ก์ ํธ๋ค์ ๋ชจ๋ ๋น๋๋์ด ๋ฐฐํฌ๋ ์ฝ๋๋ค์ด๋ค.
turborepo๋ lerna์๋ ๋ค๋ฅด๊ฒ, package.json
๊ณผ node_modules
๊ฐ ์ต์๋จ ๋ฃจํธ์ ํ๋๋ง ์์นํ๋ค.
๊ณต์๋ฌธ์๋ฅผ ๊น๊ฒ ์ฐพ์๋ณด์ง ์์์ง๋ง, ํน๋ณํ ์ธ๊ธ์ด ์๋ ๊ฑธ๋ก ๋ณด์, ๋ชจ๋ ํ๋ก์ ํธ๋ค์ด ๋์ผํ ๋ฉํ, ๋์ผํ ๋ํ๋์ ๊ด๋ฆฌ ์ฒด๊ณ๋ฅผ ๊ฐ๋ ๊ฒ์ ๊ถ์ฅํ๋ ๋ฏ ํ๋ค.
์๊ฐํด๋ณด๋ฉด, ํ๋ก์ ํธ๋ง๋ค ๋ณ๋์ ๋ํ๋์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ, ๋์ผํ ๋ํ๋์์์๋ ๋ฒ์ ์ด ๋ค๋ฅด๊ฑฐ๋, ๋์ผํ ๋ํ๋์๋ฅผ ๊ฐ๊ฐ ์ค์นํ๊ธฐ๋ ํ๋ค.
๋ํ๋์๋ค์ Node.js์ React ๋ฑ ๋ง์ ๋ฒ์ ์ ์ํฅ์ ๋ฐ๋๋ค. ๋ํ๋์์ ์ผ๊ด์ฑ์ด ์ฝํด์ง ๊ฒฝ์ฐ, ํน์ ๋ํ๋์๋ฅผ A๋ ์ต์ ๋ฒ์ ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฐ, B๋ ๋ค๋ฅธ ์์ธ์ผ๋ก ์ธํด ๊ทธ ๋ณด๋ค ํ์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ์ผ์ด์ค๊ฐ ๋ฐ์ํ ์ ์๋ค.
NX๋ ๋ํ๋์์ ์ผ๊ด์ฑ์ ์งํด์ผ๋ก์จ ์ป๋ ์ด๋์ ์ข ๋ ์ด์ ์ ๋๋ ๋ชจ์์ด๋ค. ๋คํํ, ๋ ์ญ์ ์ผ๊ด์ฑ์ ํตํด ์ป๋ ์ด๋์ด ๋์ฑ ํจ์จ์ ์ด๋ผ ์๊ฐํ๋ค.
1-3. What the FXXX
๋ฌผ๋ก ๋จ์ ๋ ์๋๋ฐ, ๋ด ๊ฒฝ์ฐ ๋๋ถ๋ถ์ ํ๋ก์ ํธ๋ npm version
๋ช
๋ น์ด ๊ธฐ๋ฐ์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. npm version
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด, major
, minor
, patch
์ ๋ฐ๋ผ ๋ฒ์ ์ ์ฌ๋ฆฌ๊ณ ๊ทธ์ ๋ฐ๋ฅธ ์ปค๋ฐ๊ณผ ํ๊ทธ๋ฅผ ๋ง๋ค์ด์ค๋ค.
์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ทธ๊ฐ ์์ฑ๋ ๋, ์ด๋ฅผ ๊ฐ์งํ์ฌ ๋น๋ ํ์ดํ๋ผ์ธ์ ๊ตฌ๋ํ๋ ๋ฐฉ์์ด๋ค.
๋ฌธ์ ๋ 1 ๋ ํฌ์งํ ๋ฆฌ ๋น 1 package.json
์ด๋ผ๋ ์ ์ฑ
์ผ๋ก ์ธํด, ๊ธฐ ๋ฐฉ์์ผ๋ก๋ ๊ฐ๋ณ์ ์ธ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
์ผ๋จ์ ๋ฒ์ ์ ํ๋๋ก ๋์ด ๋ฒ์ ์ ๋ฐ์ดํธ ์, ์ฐ๊ตฌ์์ ๋ธ๋ก๊ทธ ํ์ด์ง ๋ ๋ค ๋ฐฐํฌ๋ฅผ ์ํํ๊ธฐ๋ก ํ๋ค.
ํ๊ทธ์ ์ถ๊ฐ ํ๋๊ทธ๋ฅผ ๋ถ์ฌ ํ๋๊ทธ์ ๋ฐ๋ผ ๋น๋ ํ์ดํ๋ฅผ ๊ตฌ๋ถํ ์ ์๊ฒ ์ผ๋, ์ด์ฐจํผ ๋น๋๋ ์ค๋ ๊ฑธ๋ฆฌ์ง ์๊ณ , ์ฃผ๊ธฐ์ ์ผ๋ก ์ต์ ํ๋ ์ฝ๋๋ก ๋น๋ํ๋ ๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค.
GitHub Actions์์ ๋น๋๋ฅผ ๋๋ฆฌ๋ค๊ฐ ๋ฐ๊ฒฌํ๊ฑด๋ฐ, ๋ก์ปฌ์์ ๋ฑํ ๋ณ ๋ง ์๋ Nx Cloud๊ฐ, GitHub Actions์์ ๋๋ฆฌ๋ฅผ ํ๋ค.
์๋ง ํน์ ํ๊ฒฝ์์ ๋น๋ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๊ฒฐํ๋๋ก ๊ฐ์ ํ๋ ์ฝ๋๊ฐ ์๋ ๋ชจ์์ด๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ด๋ฐ๊ฑธ ์ ์ผ ์ซ์ดํ๋ค. ๋ก์ปฌ์์ ๋ฌธ์ ๊ฐ ์๋๋ฐ ๋น๋ ์๋ฒ์ ๋น์ทํ๊ฒ ํ ํ๊ฒฝ์์๋ง ๋๋ ์ค๋ฅ๋ค. ๋๋ฒ๊น
ํ๊ธฐ๋ ๋๊ฐํ๋ค.
๋น๋ ์ NX_NO_CLOUD=true
๋ช
๋ น์ด๋ฅผ ์ถ๊ฐํ์ฌ Nx Cloud ์ฐ๊ฒฐ์ ๋ ์ ์๋ค.
BASH
1
NX_NO_CLOUD=true pnpm nx build {name}
์ ๋ช ๋ น์ด๋ก Nx Cloud๋ฅผ ๋นํ์ฑํํ๊ณ ๋น๋ํ ์ ์์๋ค.
2. ํ๋ก์ ํธ ๊ตฌ์กฐ ์ฌ์ค๊ณ
์์ ์ค๋ช ํ ๋ชจ๋ ธ๋ ํฌ์ ํน์ง์ฒ๋ผ, ๋ชจ๋ ธ๋ ํฌ๋ ์ด๋ป๊ฒ ์ค๊ณํ๋์ ๋ฐ๋ผ ๋ชจ๋๋ฆฌ์ค์ ๋ฉํฐ๋ ํฌ์ ์ฅ์ ์ ๋ชจ๋ ์ทจํ ์๋ ์๊ณ , ๋ฐ๋๋ก ๋จ์ ๋ง ์ทจํ ์๋ ์๋ค. ์ด๋ค๊ฑธ ์ทจํ ์ง๋ ์ ์ ์ผ๋ก ๊ตฌ์ฑํ ๊ฐ๋ฐ์์ ๋ชซ์ด๋ค.
๋ชจ๋ ๊ฒ ๊ทธ๋ ๋ฏ์ด, ํ์ ํ๊ฒ ์ค๊ณ๋ ๋ชจ๋ ธ๋ ํฌ๋ ์คํ๋ ค ๋ ์ด ๋ ์ ์๋ ์ ์ด๋ค. ๋๋ฌธ์ ๋ ์ญ์๋, ๋ชจ๋ ธ๋ ํฌ์ ์ฅ์ ์ ์ต๋ํ ์ฑ๊ธฐ๊ธฐ ์ํด, ๊ทธ์ ๊ฑธ๋ง๋ ๊ตฌ์กฐ ์ค๊ณ๊ฐ ํ์ํ๋ค.
๋ด๊ฐ ์๊ฐํ ๊ตฌ์กฐ์ ํฐ ํ์ ๋์ํํ๋ฉด ๋๋ต ์์ ๊ฐ์ ๊ทธ๋ฆผ์ด ๋์จ๋ค.
- Application - ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋. ๋น๋๋ ์๋น์ค๋ค์ด ์์นํ๋ค. Next.js ์ฑ ์ฝ๋ ๋ฑ์ด ์์นํ๋ค.
- Business Module - ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ ํ ์ฐ๊ด์ ๊ฐ์ง ๋ชจ๋์ด๋ค. API, ์ํ๊ด๋ฆฌ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ์ฑ ๋์์ธ ํฉ ๋ฑ์ด ์์นํ๋ค.
- Global Module - ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์กด์ฑ์ด ์๋ ๊ณตํต ๋ชจ๋์ด๋ค. ๋์์ธ ์์คํ , ๊ณตํต ์ฝ๋ ๋ฑ์ด ์์นํ๋ค.
API, State ๋ชจ๋์ ๊ณตํต ๋ชจ๋์ ์ํ๋ฉฐ, ๋น์ฆ๋์ค ๋ชจ๋๊ณผ์ ๊ด๊ณ๋ฅผ ๊ฐ์กฐํ๊ธฐ ์ํด ๋ณ๋๋ก ํ๊ธฐํ ๊ฒ์ด๋ค.
๊ฐ ๊ด์ฌ์ฌ ๋ฐ ์ญํ ์ ๋ฐ๋ผ ํจํค์ง๋ฅผ ๊ตฌ๋ถํ๊ณ ๋๋์ด ์ฐ๊ฒฐํ๋ค. ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ํ์ธํ๋ฉด ์๋์ ๊ฐ๋ค.
์ฌ๊ธฐ์ NX๊ฐ ๊ฐ์ง๋ ๊ฐ์ ํ๋๊ฐ ๋์จ๋ค. nx graph
๋ฅผ ํตํด ํ๋ก์ ํธ ์ฐธ์กฐ ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์๋ค. ํ์ดํ๊ฐ ์ด์ด์ง ํ๋ก์ ํธ๋ ์๋ก ์์กด ๊ด๊ณ์ ์์์ ์๋ฏธํ๋ค.
ํ์ดํ๊ฐ ๋์จ ํ๋ก์ ํธ๊ฐ ํด๋น ํ์ดํ๋ก ์ฐ๊ฒฐ๋ ํ๋ก์ ํธ๋ฅผ ์ฐธ์กฐํ๋ค๋ ์๋ฏธ์ด๋ค.
์ฆ, global-ui-pack
์ api
, ui-pack
, common
, state
ํ๋ก์ ํธ๋ฅผ ์ฐธ์กฐํ๋ค.
๊ฐ ํ๋ก์ ํธ๋ ์๋์ ๊ฐ์ ์ญํ ์ ๊ฐ์ง๋ค.
root
- ์๊ฐ ํ์ด์ง Next.js ์ฝ๋blog
- ๋ธ๋ก๊ทธ Next.js ์ฝ๋root-ui-pack
- ์๊ฐ ํ์ด์ง ๋์์ธ ํฉblog-ui-pack
- ๋ธ๋ก๊ทธ ๋์์ธ ํฉglobal-ui-pack
- ๊ณตํต ๋์์ธ ํฉ. ๊ณตํต ๋์์ธ์ด๋ฉด์ ๊ณตํต ๋น์ฆ๋์ค ๋ก์ง์ด ํ์ํ ์ปดํฌ๋ํธ๋ค์ด ์ฃผ๋ฅผ ์ด๋ฃฌ๋ค.ui-pack
- ๋์์ธ ์์คํ . ๋น์ฆ๋์ค ๋ก์ง, API, ์ํ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.api
- API ๋ชจ๋common
- ๊ณตํต ๋ชจ๋markdown-kit
- ๋งํฌ๋ค์ด ๋ชจ๋. ์๊ฐ ํ์ด์ง ๋ฐ ๋ธ๋ก๊ทธ์์ ์ฌ์ฉํ๋ ๋งํฌ๋ค์ด์ ๋ณํํ๋ ๋ฒ์ฉ ์ฝ๋๊ฐ ํฌํจ๋๋ค. ๊ฐ ์๋น์ค ๋ณ ๋งํฌ๋ค์ด์ ํน์ฑ์ ๋ฐ์ํ ์ฝ๋๋, ํด๋น ์๋น์ค์ ๋น์ฆ๋์ค ์์ญ์์ ๊ตฌํํ๋ค.state
- ์ํ๊ด๋ฆฌ ๋ชจ๋
์์ ๊ฐ์ ๊ตฌ์กฐ์ ์ญํ ์ ๊ฐ์ง๋ค.
๋ฌผ๋ก , ํ๋ก์ ํธ์ ์ฐธ์กฐ ๊ท์น์ ์ ์ํ๋ค๊ณ ํด๋, ๊ฐ๋ ์ ์ธ ํํ๋ก๋ ํ๊ณ๊ฐ ์๋ค. ์ธ์ ๋ ์ง ํด๋จผ ์๋ฌ๋ก ์ธํด ๊ท์น์ด ํผ์๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋์ ์ํด ๋ชจ๋ ๊ฒ ์ด๋ฃจ์ด์ง๋ ํ๋ก์ ํธ์์๋, ๊ฐ๋ ๊ท์น์ ๋ง๊ฐํ ๋๊ฐ ์๋ค. ํ๋ฌผ๋ฉฐ ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ณ ์ธ์์ด ๋ง์์ง์๋ก ์ด๋ฐ ํ์์ ํจ์ฌ ๋๋๋ฌ์ง๊ฒ ๋๋ค.
NX๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ESLint์ ๊ท์น์ ํตํด ๊ฐ์ ์ฑ์ ๊ฐ์ง ์ ์๋๋ก ๊ด๋ จ ESLint ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.
JSON
1 2 3 4 5 6 7 8 9 10 11 12
{ "name": "blog", "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/blog", "projectType": "application", "tags": [ "app:blog", "name:blog" ], "// targets": "to see all targets run: nx show project blog --web", "targets": {} }
๊ฐ ํ๋ก์ ํธ๋ project.json
์ด๋ผ๋ ๋ฉํ ํ์ผ์ ๊ฐ์ง๋ค. ํด๋น ํ์ผ์ ํ๊ทธ์ ์ํ๋ ํ
์คํธ๋ฅผ ๋ฐฐ์ด๋ก ์ง์ ํ ์ ์๋ค.
์ํ๋ ํ์์ผ๋ก ํ๋ก์ ํธ์ ํ๊ทธ๋ฅผ ์ง์ ํ๋ค. ์ด ํ๊ทธ๋ ์ถํ ESLint์ ๋ฃฐ์์ ๊ฐ ํ๋ก์ ํธ์ ์ฐธ์กฐ๋ฅผ ์ ์ํ๋ ๊ธฐ์ค์ด ๋๋ค.
์ฌ๋ฌ ํ๋ก์ ํธ์ ๋์ผํ ํ๊ทธ๋ฅผ ์ฃผ์ด ๊ทธ๋ฃน ํ์์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
{ "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "name:blog", "onlyDependOnLibsWithTags": [ "lib:blog", "lib:shared", "lib:shared-ui" ] } ] } ] } }
@nx/enforce-module-boundaries
๊ท์น์ผ๋ก ์ฐธ์กฐ ๊ท์น์ ์ ์ํ ์ ์๋ค. ํ๋ก์ ํธ ์ต์๋จ์ ./eslintrc.json
์ ๊ฐ๋จํ ํ์ด ์ ์๋์ด ์๋ค.
allow
์ ์ด๋์๋ ์ฐธ์กฐ ๊ฐ๋ฅํ ํ๋ก์ ํธ๋ฅผ ์ ์ํ ์ ์๋ค. ์ด๋ฅผํ
๋ฉด, common
๊ฐ์ด ์ด๋์๋ ์ฐธ์กฐํด๋ ๋ฌธ์ ๊ฐ ์๋ ๋ชจ๋์ allow
๋ก ํ ๋ฒ์ ์ ์ฉํ๋ ๊ฒ์ด ๊ด๋ฆฌ ์ธก๋ฉด์์ ์ด๋ก์ธ ์ ์๋ค.
depConstraints
์ ๋ฐฐ์ด๋ก ์ํ๋ ์ฐธ์กฐ ๊ท์น์ ์ง์ ํ ์ ์๋ค. sourceTag
์ ์ํ๋ ํ๊ทธ ์ด๋ฆ์ ํ๊นํ๊ณ onlyDependOnLibsWithTags
์ ์ฐธ์กฐ ๊ฐ๋ฅํ ํ๊ทธ ๋ชฉ๋ก์ ์ง์ ํ๋ค. ์ฆ name:blog
ํ๊ทธ๋ฅผ ๊ฐ์ง ํ๋ก์ ํธ๋ lib:blog
, lib:shared
, lib:shared-ui
๋ฅผ ํ๊ทธ๋ฅผ ๊ฐ์ง ํ๋ก์ ํธ๋ง์ ์ฐธ์กฐํ ์ ์์ผ๋ฉฐ, ๊ทธ ์ด์ธ ํ๋ก์ ํธ๋ ์ฐธ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค. ์ ์ํ ์ฐธ์กฐ ๊ท์น์ ์ค์ง์ ์ผ๋ก ๊ตฌํํ ์ ์๋ ๊ฒ์ด๋ค.
3. ์ ๋๋ฉ์ด์
๊ณ ๋ํ
๊ธฐ์กด์ ์ ๋๋ฉ์ด์ ๋ค์ ๐ framer-motion์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด์์๋ค. ๋ํ๋์๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋, ํฌ๊ณ ์์ ์ฑ๋ฅ์ ํ๊ฐ ์์์ผ๋ฉฐ, ๋ํ๋์ ์ฝ๋๋ฅผ ๊ฑด๋๋ฆด ์ ์์ด ํธ๋ฌ๋ธ์ํ ์ด ์ด๋ ค์ ๋ค. ํนํ ์๊ฐํ์ด์ง์ ํ์ด ๋ ๋๋ง ์ด์๊ฐ ๋งค์ฐ ์ฌ๊ฐํ๋ ๊ฑธ๋ก ๊ธฐ์ตํ๋ค. (์๋ง ๋ํ๋์ ๋ด๋ถ์ useLayoutEffect๊ฐ ๋ง์ด ์ฐ์์ ๊ฑฐ๋ผ ์ถ์ธก๋๋ค.)
๋๋ฌธ์ ์ด๋ฒ ๋ฆฌ๋ด์ผ์์ ์ฌ๋ฌ ์ ๋๋ฉ์ด์ ์ ์ง์ ๊ตฌํํ๋ ๊ฒ์ ์ด์ ์ ๋ง์ท๋ค. ํธํธ, ํ์ด๋, ๋ทฐํฌํธ์ ๋ฐ๋ฅธ ์ ๋๋ฉ์ด์ ์คํ ๋ฑ ์ฌ๋ฌ ์ ๋๋ฉ์ด์ ์์๋ค์ ์ง์ ๊ฐ๋ฐํ๋ค. ์ด ์์๋ค์ ์ถํ ๊ฒ์๊ธ๋ก ์์ธํ๊ฒ ํ์ด๋ณผ ์์ ์ด๋ค.
๋ง์น๋ฉฐ
์ด๋ฒ ๋ฆฌ๋ด์ผ์ ์ค๋ฌด์์ ์ป์๋ ๋ง์ ์ธ์ฌ์ดํธ๋ฅผ ๋ฐ์ํ๊ณ ํผํฌ๋จผ์ค๋ฅผ ๊ฐ์ ํ ์ ์์๋ ๋ป ๊น์ ๋ฆฌ๋ด์ผ์ด์๋ค.
ํนํ ์ ๋๋ฉ์ด์ ์ ์ง์ ๊ฐ๋ฐํ๋ฉฐ UX์ ์ํธ์์ฉ์ ์๊ฐํด๋ณผ ์ ์๋ ๊ณ๊ธฐ๊ฐ ๋์๋ค. ์ ๋ง์ ๊ฒ์๊ธ ์ฃผ์ ๋ ๋ค...
๋ฆฌ๋ด์ผ ๋ฒํ๋ก ํ ๋์์ ๋ค์ ๋ธ๋ก๊ทธ ์ด์์ ์ง์คํ ์ ์์ ๋ฏ ํ๋ค.
๐ท๏ธ ํ๊ทธ
์ฝ์ด์ฃผ์ ์ ๊ณ ๋ง์์!
๋์์ด ๋์ จ๋ค๋ฉด, ๊ณต๊ฐ์ด๋ ๋๊ธ์ ๋ฌ์์ฃผ์๋ ๊ฑด ์ด๋ค๊ฐ์?
๋ธ๋ก๊ทธ ์ด์์ ํฐ ํ์ด ๋ฉ๋๋ค.