monorepo์ ๋ ํ๋์ ์ฅ์ ์ด๋ผ๋ฉด , ์ฌ๋ฌ project์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ํ์ผ์ ์์ฑ ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ์ ์ ๋๋ค. ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ hook , component ๋ฅผ ์์ฑํด๋๊ณ ์ํ๋ ํ๋ก์ ํธ์์ ๊ฐ์ ธ๋ค ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ถํ์ํ๊ฒ ์ฝ๋๊ฐ ๋ญ๋น๋์ง ์๊ณ , ๊ด๋ฆฌ๋ ํธ๋ฆฌํด์ง๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ hook ๊ณผ component ๋ฅผ ์์ฑํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก yarn create vite ๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋ฉด , ๋ฒํผ๊ณผ ๊ทธ ๋ฒํผ์ ๋๋ ์ ๋ count๊ฐ ์ฆ๊ฐํ๋ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฐ๋ผ์ ๊ธฐ๋ณธ Button component ์ count ๋ฅผ ์ฆ๊ฐ์ํค๋ useCount hook ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
๊ทธ ์ ์ common project๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๊ฐํธํ ์์ฑํ๊ธฐ ์ํด ๋จผ์ packages ๋ด๋ถ์ yarn create vite ๋ก common ํด๋ ์์ฑ ํ , ์๋ ํ์ผ์ ์ ์ธํ๊ณ ์ญ์ ํฉ๋๋ค.

src ์์ hooks ํด๋๋ฅผ ์์ฑํ๊ณ , useCount ํด๋๋ฅผ ์์ฑํฉ๋๋ค.

๊ทธ ํ ์๋์ ๊ฐ์ด count ๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ๋ hook ์ ์์ฑํฉ๋๋ค.
ts
// index.ts
import { useState } from 'react';
export const useCount = () => {
const [count, setCount] = useState(0);
const handleCount = () => {
setCount((prev) => prev + 1);
};
return {
count,
handleCount,
};
};
common project์ ๊ฒฝ์ฐ , library ๋ก์จ์ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ฐ๋ฅธ ์ค์ ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ณต์ ๋ฌธ์
๊ฐ์ฅ ๋จผ์ vite.config.ts ํ์ผ์ ์๋์ ๊ฐ์ด ์์ ํด์ค๋๋ค.
ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import dts from 'vite-plugin-dts';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react(), dts()],
build: {
lib: {
entry: {
hooks: './src/hooks/index.ts',
},
formats: ['es', 'cjs'],
},
rollupOptions: {
external: ['react'],
output: {
globals: {
react: 'React',
},
},
},
},
});
์ฌ๊ธฐ์ ์ค์ํ๊ฒ ๋ด์ผ ํ๋ ๊ฒ์ vite-plugin-dts , entry ์
๋๋ค.
vite-plugin-dts : ํ์
์คํฌ๋ฆฝํธ ๋ชจ๋๋ก์จ ํ์
์ ์๋ ค์ฃผ๊ธฐ ์ํ library์
๋๋ค.entry : ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ํ ์์
์
๋๋ค. hooks ์ components ๋ฅผ ์ฌ์ฉํ ๋ , common/hooks common/components ๋ฑ์ผ๋ก ๋๋๊ธฐ ์ํด ๊ฐ๊ฐ ์ค์ ํด ์ฃผ์์ต๋๋ค.์ด์ yarn common build ๋ฅผ ์งํํ๋ฉด ์ ์์ ์ผ๋ก build ๋๊ณ , dist ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
๊ทธ ๋ค์์ผ๋ก๋ ํ์
์ง์ ํ์ผ์ ์์ฑํฉ๋๋ค. root ์์น์ index.d.ts hook.d.ts ํ์ผ์ ์์ฑํฉ๋๋ค.
ts
// hook.d.ts
export * from './dist/hooks';
ts
// index.d.ts
import './hooks.d.ts';
hook.d.ts ๋ hook ์ ๋ํ ํ์
์ , index.d.ts ๋ hook ๊ณผ ์ถํ ์ถ๊ฐ๋ component ์ ํ์
์ ๋ํ๋
๋๋ค.
๋ค์์ผ๋ก๋ package.json ํ์ผ๋ ์๋์ ๊ฐ์ด ์์ ํด์ค๋๋ค.
json
{
"name": "common",
"type": "module",
"version": "0.0.0",
...
"exports": {
"./hooks": {
"import": "./dist/hooks.js",
"types": "./dist/hooks/index.d.ts"
}
},
"files": [
"dist/*",
"index.d.ts",
"hooks.d.ts"
]
...
}
type : ์ด package๊ฐ module ๋ก์จ ์๋ํ๋๋ก module ์ ์ถ๊ฐํด ์ค๋๋ค.version : package์ ๋ฒ์ ์
๋๋ค. ๋ณ๊ฒฝ์๋ง๋ค ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํฉ๋๋ค.types : ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด์ types ๋ฅผ ์ง์ ํด ์ค๋๋ค.exports : ๋ชจ๋์ ํ์ ๊ฒฝ๋ก๋ฅผ ๋ํ๋
๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ import ์ , {libraryName}/hooks ์ ํํ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
import : library ์์ ๊ฐ์ ธ์ฌ ํ์ผ์ ์ ํํฉ๋๋ค.types : ๊ฐ์ ธ์จ ํ์ผ์ ํ์
์ ์ง์ ํด์ค ํ์ผ์
๋๋ค.files : ํจํค์ง๊ฐ ์ค์น๋ ๋ , ํฌํจ๋ ํ์ผ์ ์ ํํฉ๋๋ค. ์ฌ๊ธฐ์์๋ ๋น๋ ํ์ผ , ํ์
ํ์ผ์ด ํฌํจ๋ฉ๋๋ค.๋ค๋ฅธ project ๋ก ๋์์์ , package.json ์ dependency์ common ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
json
// package.json
...
"dependencies": {
...
"common": "workspace:^",
...
},
...
๋ฒ์ ์ ์ง์ ์ ๋ ฅํด์ฃผ์ด๋ ๋๊ณ , ์์ฒ๋ผ ์ํฌ์คํ์ด์ค์์ ๋ฐ๋ก ๊ฐ์ ธ์๋ ๋ฉ๋๋ค.
์ดํ App.tsx ์์ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก import๊ฐ ๊ฐ๋ฅํฉ๋๋ค.

common/hooks ์์ useCount hook ์ ๊ฐ์ ธ์ค๊ณ , ์๋์์ ๋ถ๋ฌ์จ ๋ชจ์ต์
๋๋ค. ๊ทธ ํ , ์คํํด์ ๋ฒํผ์ ๋๋ฌ๋ณด๋ฉด ์ด์ ์ฒ๋ผ ์ ์์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ด์ ์๋ ์ฝ์ง ์์๋๋ฐ , ์ด๋ฒ์๋ ์ฝ์ง ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋น๋ ํ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ํ๋ค์๊ณ , ์๊ฐ๋ณด๋ค ๋์ถฉ ์๊ณ ์๋ ๋ถ๋ถ๋ ๋ง์ด ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ ๋ถ๋ถ๋ค์ ์กฐ๊ธ์ฉ ๋ ์ถ๊ฐํด์ ์์ฑํด๋์ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
์ถ๊ฐ๋ก , ์ด์ ๊ฒฝํ์ผ๋ก ์ ๋ฐฉ๋ฒ์ ์ต์ข ์ ์ผ๋ก ์ฌ์ฉํ์ง๋ ์์๋๋ฐ , ๊ทธ ์ด์ ๋ common ์์ ์์ ์ด ์ผ์ด๋๋ฉด , ๋ชจ๋ ํ๋ก์ ํธ์ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค. common ์์ ์์ ์ด ์ผ์ด๋๋ฉด ๋ค๋ฅธ ๊ณณ์์ ๋ฒ์ ์ ๋ฐ๋ผ์ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ , ๋ค์ ๊ฒ์๊ธ์์๋ ํด๋น common ์ publish ํด ๋๊ณ , ๋ฒ์ ์ ๋ง์ถฐ์ ์ฌ์ฉํ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์์ฑํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์๋ชป๋ ๋ถ๋ถ, ์ถ๊ฐํด์ผ ํ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋ง์ํด์ฃผ์๋ฉด ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค . ํด๋น repo๋ ์ฌ๊ธฐ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค .