Monorepo? Yarn Workspace!
๐ธ ๋ชจ๋ ธ๋ ํฌ. Lerna? Yarn Worksapce!
์๋ก
๋ชจ๋ ธ๋ ํฌ๋ผ๊ณ ๋ค์ด๋ณธ์ ์๋ค๋ฉด ๊ฑฐ์ณ์จ ๋จ์ด๋ค์ด ์์๊บผ๋ผ ์๊ฐ๋๋ค.
Lerna, Git repo, Git submoduleโฆ
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ ๋์ง ์๋๋ค. ๋ชจ๋ ธ๋ ํฌ๊ฐ ๋์๋ค ํ๋ค ๋ฒ์กํ๋ค. ์ด์ ๋ํ ๋ด๊ฐ ๋์ฐฉํ ํด๋ฒ์ ๋ํด ๊ธ์ ๋จ๊ธฐ๊ณ ์ ํ๋ค.
์ฝ๋ ํํธํ
์ฝ๋๋ฅผ ์ง๋ค๋ณด๋ฉด ๋งค ํ๋ก์ ํธ๋ง๋ค ๋น์ทํ ์ฝ๋๋ฅผ ๋ง์ด ์ง๊ฒ ๋๋ค. npm์ ๋ฐฐํฌํ๊ธด ๋ญํ๊ณ , ๊ทธ๋ฌ๋ค๋ณด๋ ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ๋ค์ ์ง์ ์กฐ๊ธ ๊ฐ์ ๋๊ฑฐ๋ ์๋ ์ด์ ์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ ํํธํ๋๋ ๊ฒฝ์ฐ๊ฐ ๊ฝค ์์๋ค.
ํ์ฌ๋ ๋ณดํต ํ๊ฐ์ง ๋๋ฉ์ธ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ทธ ๋๋ฉ์ธ์ ๋ง๋ ๋ชจ๋์ด ํ์ํ๊ฒ ๋๋๋ฐ ์ด๊ฒ ํ์ฌ๋ด์์์ ์ฌ๋ฌ ํ๋ก์ ํธ์ ์ฐ์ด๊ฒ๋๋ค. ์ด ๋ชจ๋์ ํ๋ก์ ํธ๊ฐ ์งํ๋์ด๊ฐ์ ๋ฐ๋ผ ํจ๊ป ์ฑ์(๊ฒ์ฆ๋์ด)ํด ๊ฐ๋๋ฐ ์ฒ์๋ถํฐ ์ด๊ฒ ๊ณตํต ๋ชจ๋์ด ๋ ๊ฒ์ด๋ผ๋ ๊ฑธ ์๊ณ ์์ผ๋ฉด ๋ ํฌ ๊ตฌ์ฑ์ ๊ณ ๋ฏผ์ด ์๊ธฐ๊ฒ๋๋ค. ์ฒ์๋ถํฐ ๋ ํฌ๋ฅผ ๋ถ๋ฆฌํด ๋ฒ๋ฆฌ๋ฉด ๋ฒ์กํ๋ค. ์์ฐ์ฑ์ด ํฌ์๋๋ค๋ฉฐ ์ฃผ๊ฐ์ด ์ ๋๋๊ฒ ์๋๊ฒ ๋๊ฐ. ๋ชจ๋ ธ๋ ํฌ ๋์ฆ์ ๋ฐ์์ด๋ค.
๋ชจ๋ ธ๋ ํฌ
๋ด๊ฐ ์๋(์ฝ์ ๋ ๋ณธ) ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์๋ 3๊ฐ์ง ์ ๋๊ฐ ์์๋ค.
Lerna
๋ฌ๋๋ ๋ชจ๋ ธ๋ ํฌ์ ํจ๊ป ๊ฐ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ์์ญ๊น์ง๋ฅผ ์ปค๋ฒํ๋ค. ์ฌ๋ฌ๊ฐ์ ๋ ํฌ๊ฐ ํจ๊ป ์ฎ์ฌ์ ๊ฐ๋ฐ์ ์งํํ๊ณ ํ๋์ ๋ฒ์ ์ผ๋ก ๊ฐ ๊ฒ์ธ์ง, ํจํค์ง๋ง๋ค ๋ค๋ฅธ ๋ฒ์ ๋์ ๊ฐ๊ฒ ํ ๊ฒ์ธ์ง.
์ค๋๋์ ๊ธฐ์ต์ ์ ๋์ง ์์ง๋ง ๋ญ๊ฐ ๊ณ์์ ์ผ๋ก npm install
์ ํด์ผํ๋ ๋ฑ ๋๋จํ ์ง์ฆ๋๋ ์ผ์ด ๋ง์๋ ๊ฒ์ผ๋ก ๊ธฐ์ต๋๋ค.
๋ฌ๋๋ Yarn workspace ์ค๋ช ์๋ ๋์์๋ฏ์ด ํจ๊ป ์ธ ์ ์์ผ๋ฉฐ ๋ฐฐํฌ ๋ ๋ฒจ์์ ์ฝ๋ผ๋ณด๋ฅผ ํ ์ ์๋ค. ๋ฐฐํฌ๋ ๋ ๋ค๋ฅธ ์ฃผ์ ์ด๋ฏ๋ก ์ด ๊ธ์์๋ ์ ์ธ๋๋ค.
Git-repo
๊ตฌ๊ธ์์ ๊ด๋ฆฌํ๋ CLI ํด, ์ง์ธ์ ํตํด ๋ค์๋๋ฐ ์จ๋ณด์ง ์๋ค. ์ปจ์ ์์ฒด๋ ์ฌ๋ฌ ๋ ํฌ๋ฅผ ํ๋ฒ์ ๋ก๊ธฐ๊ณ ํธ์ ํํ๋ ๋ฑ, ํ๋์ ๋ ํฌ์ฒ๋ผ ์ฌ์ฉํ๋ ์ปจ์ ์ผ๋ก ์ดํดํ๋ค. ์ด์ฐ๋ณด๋ฉด ์ง์ ํ ์๋ฏธ์ ๋ชจ๋ ธ๋ ํฌ์ผ์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ ๋๋ฌด ๋ชจ๋ ธ๋ ํฌ๋ค(?).
Git Submodule
๊น์ ์ปค๋งจ๋์ submodule์ ํตํด ํน์ ๋๋ ํ ๋ฆฌ์ ์์น๋ฅผ ํน์ ๋ ํฌ๋ก ๋งคํํ๋ค. ์์์์ git submodule init
๋ฑ์ ๋ช
๋ น์ด๋ฅผ ํตํด submodule ์ ํด๋ก ํ๊ฒ ๋๋ค.
IDE ๊ฐ ๊ทธ ๋๋ ํ ๋ฆฌ์ ๋ํ ํ์ผ์ ๋ค๋ฅธ ๋ ํฌ๋ผ๋ ๊ฒ์ ์ธ์ํด์ค์ผํ๋ค. ๊ทธ๋ผ ๋ฉ์ธ ๋ ํฌ์ submodule ์ ๋ ํฌ์ ์๋ ํ์ผ์ด ๋์์ ์์ ์ด ๋์๋ค๊ณ ๊ฐ์ ํด๋ณด์ ์ฐ๋ฆฌ๋ ์ปค๋ฐ์ ํ ํ ๋ฐ ์์๋ ์ด๋ ๊ฒ ์งํ ๋์ด์ผํ๋ค.
- ์๋ธ ๋ชจ๋์ ์ปค๋ฐ์ ํ๋ค
- ์๋ธ ๋ชจ๋์ ๊ฐ๋ฆฌํค๋ ๋๋ ํ ๋ฆฌ์ ์ปค๋ฐ ID๊ฐ ๋ฐ๋๋ค.
- ๋ฐ๋ ๋๋ ํ ๋ฆฌ์ ์ปค๋ฐ ID๋ฅผ ๋ฉ์ธ ๋ ํฌ์์ ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์์ ๋ ํ์ผ๊ณผ ํจ๊ป ์ปค๋ฐํ๋ค.
์ด๋ฐ ์ํ๊ฐ ๋์ด์ผํ๋๋ฐ ์ด๊ฒ ์ ์๋์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ ์ ๋ฆฌํ๋ ๊ธ์ ์ฐพ์๋ดค๋ค.
2016๋ 4์ 12์ผ ์ธ๊ฑธ ๋ณด๋ ํ์ฌ๋ฅผ ๊ทธ๋ง๋๊ณ 8๊ฐ์๋์ ์ ๋ง์๋ค ์ผ์ด๋์ ์ฌ์ทจ์ ์ ํ๋ ๊ทธ ๋์ธ ๊ฒ ๊ฐ๋ค. ๊น์ ์ฒ์ ์ค๋ฌด์์ ์จ๋ณด๋ ๋์ธ๋ฐ ํ๋ก์ ํธ ์์ํ๋ฉด์ ๋ ํฌ ๊ตฌ์ฑ์ ๋ํด์ ๊ณ ๋ฏผํ์๋ ๋ณด๋ค.
์ฌํผ ๋น์ ๊ธฐ์ต์ผ๋ก๋ IDE์์ ์ง์์ด ๋ญ๊ฐ ์๋ฒฝํ์ง ์์๊ณ ํฐ๋ฏธ๋์ ํตํด์ ์์
์ ํด์ผํ์ผ๋ฉฐ ๋ค๋ฅธ ํ๊ฒฝ์์ ์์
ํ ๋ git submodule init
์ ์์ด์ ์ ์๋๋์ง ์ฐพ์๋ ์ ๋ ์๋ค.
๐ธ Yarn Workspace
์๋ง๋ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๋น์ทํ ๊ณ ๋ฏผ์ ๊ฐ์ด ํ์ํ ๋ฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ด ํจํค์ ๋งค๋์ ๋ ๋ฒจ์์ ์ง์๋๊ธฐ ์์ํ๋ค. Yarn Workspace๋ค.
Yarn
Yarn์ ๋ ธ๋ ํจํค์ง ๋งค๋์ ์ธ npm์ ๋ณด์(?) ํด์ ํ์ด์ค๋ถ์์ ๊ด๋ฆฌํ๋ ํจํค์ง ๋งค๋์ ๋ค. ์ง๋ ์ ๋ฆฌ ๊ธ์ ์ฐพ์๋ณด๋ 2016๋ ์ ๋์จ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
1.0๋์ ์ฒ์ workspace ๊ธฐ๋ฅ์ด ์ถ๊ฐ ๋์๋ค(๊ธ์ ์ฐ๊ณ ์๋ ์์ ์ 1.6) .
Workspace
๋ชจ๋
ธ๋ ํฌ์ ๊ฐ ํจํค์ง๋ง๋ค ๊ฐ์ง๊ณ ์๋ node_module
๊ฐ ๋ฃจํธ์ node_modules
๋ฅผ ์ฐธ์กฐํ๋๋ก ๋์์ผ๋ฆฌ๋ผ. ๋ด๋ถ ๊ตฌํ์ ์ดํด๊ฐ ๋ชฉ์ ์ด ์๋๋งํผ ์ฌ์ฉ๋ฒ์ ์ด์ฒจ์ ๋ง์ถ๊ณ ๊ธ์ ์จ๋ด๋ ค๊ฐ๊ฒ ๋ค.
์ฌ์ฉ๋ฒ
Init
์ฒ์๋ถํฐ ์ค๋ช
์ ํ๋ค๋ ๊ฐ์ ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋ ๋ฐ๋์ private: true
๊ฐ ํฌํจ๋์ด์ผํ๋ค.
๊ทธ๋ฆฌ๊ณ workspace ๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
Workspace
package.json
์ ์ด๊ณ workspace
ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํํ์ ์ด๋ ๋ก ํจํด์ ์ถ๊ฐํ๋ค. glob ํจํด(ํ์ธํด๋ณด์ง ์์) ์ ์ง์ํ๋ ์๋์ ๊ฐ์ด ์ถ๊ฐ๋ฅผ ํ์ ํจํค์ง๋ค์ด ๋ค์ด๊ฐ ๋๋ ํ ๋ฆฌ์ ์ด๋ฆ์ packages
๋ก ๊ฐ์ ํ๋ค.
workspace ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๊ฐ ๋์๋ค.
ํจํค์ง ์์ฑ
packages
๋๋ ํ ๋ฆฌ ๋ฐ์ ํจํค์ง์ ์ด๋ฆ์ ์์ฑํ๊ณ ํ๋ก์ ํธ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก package.json
์ ์์ฑํ์. ์ด ํจํค์ง๋ private
์ด ํ์์๋ ์ผ๋ฐ์ ์ธ ํจํค์ง๋ค.
ํจํค์ง ๊ด๋ฆฌ
์์ฑ์ ํ ํ์๋ ํจํค์ง๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ๊ทธ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ๋ค์ด๊ฐ ํ์์์ด ํ๋ก์ ํธ ๋ฃจํธ์์ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค.
์ด๋ฐ์์ผ๋ก yarn์ ์ปค๋งจ๋ ์ดํ์ workspace [ํจํค์ง๋ช
]
์ ๋ถ์ด๊ณ ์์
์ ํ๋ฉด๋๋ค. ๋ชจ๋ ํ๋ก์ ํธ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ์ ํด๋ ๋ฐฐํฌ์ ์ด์๊ฐ ๋ถ๋ฆฌ๋๋ค๋ผ๊ณ ํ๋ฉด workspace ์์ฒด์ ํจํค์ง๋ฅผ ์ถ๊ฐ ํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด typescript ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์ฌ๊ธฐ์ ํด๋นํ๋ค. typescript๋ก ์์ฑ๋ ๋ชจ๋์ ๊ฒฝ์ฐ์๋ ์ปดํ์ผ ์ดํ js๋ก ๋ฐฐํฌ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ -W
์ต์
์ ์ถ๊ฐํ๋ฉด ํ๋ก์ ํธ ๋ฃจํธ์ package.json
์ ํตํด ๊ด๋ฆฌ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ฃจํธ package.json ์ dependency ๊ฐ ๊ธฐ๋ก๋๊ณ ๊ด๋ฆฌ๋๋ค.
ํจํค์ง ์ฐธ์กฐ
๊ทธ๋ผ ์ด์ ์ํธ ํจํค์ง๋ ์ด๋ป๊ฒ ์ฐธ์กฐํ๋๋ ์ ๋์ ๋ฌธ์ ๊ฐ ๋จ์๋ค. ์๊ฐ๋ณด๋ค ๋จ์ํ๋ฉฐ ์ด ์์ ์ ๋ํด yarn ์ปค๋งจ๋๊ฐ ์กด์ฌํ๋์ง ์ฐพ์๋ณด์ง ์์์ ๋ชจ๋ฅด๊ฒ ๋ค.
์๋ค๋ฉด ํผ๋๋ฐฑ์ ๋ถํ๋๋ฆฐ๋ค.
์๋ฅผ ๋ค์ด ํจํค์ง ๊ตฌ์กฐ๊ฐ ์๋์ ๊ฐ์ด ์๋ค. readme ํจํค์ง์์ speech ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ผ๊ณ ํ๋ค๋ฉด readme/package.json
ํ์ผ์ ์ด๊ณ ์์กด์ฑ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
์ฃผ์ํ ์ ์ ์์กด์ฑ ์ถ๊ฐ์ ์ฌ์ฉ๋๋ ์ด๋ฆ์ด package.json
์ ์ฌ์ฉ๋ ํจํค์ง์ name
๊ณผ ๊ฐ์์ผ๋ง ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฃจํธ์์ ๋ค์ yarn
์ ํตํด ์ธ์คํจ์ ๋ค์ํ๋ฉด node_modules
๋ฅผ ์ ๋๋ก ์ฐธ์กฐํ๊ฒ ๋๋ค.
๊ธ์ ์ํด ์ํ ๋ ํฌ๋ฅผ ๋ง๋ค์ง ์์์ผ๋ ์ต๊ทผ ์งํํ ํซ ํ๋ก์ ํธ์์ ์ด๊ธฐ์ ๊ตฌ์กฐ๋ฅผ ์ก์๋ ์ปค๋ฐ ์์ด๋๋ฅผ ์ฐธ์กฐํ๋ค.
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ๋์ถฉ ์๋์ ๊ฐ๋ค.
๋ง๋ฌด๋ฆฌ
TypeScript ๊น์ง์ ์ฐ๊ณ๋ฅผ ์ค๋ช ํ๋ ค ํ์์ผ๋ ์ฝ๋๋ฅผ ์ ๊ณตํ๊ณ ์๊ฐ๋ณด๋ค ์๊ฐ์ด ์๋ชจ๋์ด ์ฌ๊ธฐ์ ๋ง๋ฌด๋ฆฌํ๋ค. ๊ฐ์ ๊ณ ๋ฏผ์ ํ๋ ๋ค๋ฅธ ๋ถ๋ค๋ ๋ณผ ์ ์๋๋ก ๐ ๋ถํ๋๋ฆฐ๋ค.