Yarn Berry Workspace
Yarn Berry WorkSpace๋?
๋ชจ๋ ธ๋ ํฌ ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ ํ๋ก์ ํธ(ํจํค์ง)๋ฅผ ๋จ์ผ ๋ ํฌ์งํ ๋ฆฌ์์ ๊ด๋ฆฌํ๋ ๋ฐฉ์
์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ํ ๊ณณ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๊ณตํต๋ ์์กด์ฑ ๋ชจ๋์ ์ฌ์ฌ์ฉํ๊ณ , ์ค๋ณต๋๋ ์์กด์ฑ ์ค์น ๋ฌธ์ ๋ฅผ ํผํ ์ ์๋ค.
workspace: ๋ชจ๋ ธ๋ ํฌ์ ํจํค์ง๋ฅผ ์๋ฏธ
Yarn Berry
Yarn v2 ์์ ์ฌ์ฉํ๋ ํจํค์ง ๋งค๋์
๊ธฐ๋ณธ์ ์ผ๋ก ๋ช ์์ ์ธ ์์กด๊ด๊ณ๋ฅผ ๋ํ๋ด์ผ ์ฌ์ฉ ๊ฐ๋ฅ
node_modules
์ ํจํค์ง๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด ์๋ ํจํค์ง๋ฅผ ์์ถํ์ฌ ํ๊ฐ์ ํ์ผ์.yarn/cache/
ํด๋์ ์ํ์ ์ผ๋ก ์ ์ฅํ๋ค. ์ด๋ฌํ ๋ฐฉ์์ Plug'n'Play(PnP) ๋ผ ํ๋ค.์ํ์ ์ผ๋ก ์กด์ฌํ์ฌ ๋น ๋ฅด๊ฒ ํ์ ๊ฐ๋ฅ
์์ถํ์ผ์ ์ค์นํ๊ธฐ ๋๋ฌธ์ ํ์ผ ๊ฐ์๊ฐ ๊ฐ์ํ์ฌ ์ค์น๊ฐ ๋น ๋ฆ
Zero Install์ ์ด์ฉํ์ฌ ์ ์ฅ์์์ ํจ๊ป ๊ด๋ฆฌ ๊ฐ๋ฅ
์ ์ฅ์์ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ์ ์ฅ์ ์์ฒด๊ฐ ๋งค์ฐ ์ปค์ง๊ฒ ๋ ์ ์์ (push, pull๋ฑ ๋๋ฆฌ๊ฒ ๋จ)
Zero Install์ด ์์ ์ค์นํ์ง ์๋๊ฒ์ ์๋, ์ฌ๋ฌ ํ๊ฒฝ์์ ์๋ก์ด ํ์ผ์ ๋ง๋ค์ด๋ด๋ ๊ฒฝ์ฐ ๋๋ฌธ์ ์ค์น ํ์
Phantom Dependency๊ฐ ๋ฐ์ํ์ง ์์
PnP ๋ชจ๋๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์
PnP ๋ฐฉ์์ IDE์์ ์ง์ ์ฌ์ฉํ๋ ๋ง์ ๋๊ตฌ๋ค์
SDK
๋ฅผ ํตํด ์ฐํ ํธ์ถํ ์ ์๋๋ก ์ถ๊ฐ์ ์ธ ์ค์ ํ์
workspaces plugin
์ง์
node_modules ๋ฌธ์ ์
์์กด์ฑ ํ์ ์๊ณ ๋ฆฌ์ฆ ๋นํจ์จ
๋ชจ๋์ ๊ฒ์ํ ๋ ์์กด์ฑ ๊ฒฝ๋ก์ ๊น์ด ๋งํผ ์์
node_modules
๋ฅผ ๊ฒ์ํ๊ฒ ๋๋ค.
node_modules
ํด๋ ์๋์ ์ ๋ง์ ํจํค์ง๊ฐ ์ ์ฅ๋์ด ๊ณต๊ฐ์ ๋ง์ด ์ฐจ์งํ๊ฒ ๋๊ณ ๊ทธ๋งํผ ์ค์นํ๋๋ฐ ์ค๋ ๊ฑธ๋ฆฐ๋ค.์ ๋ น ์์กด์ฑ์ด๋ ํ๋ก์ ํธ์ ์ค์ ๋ก ์ฌ์ฉํ์ง ์์ง๋ง lock ํ์ผ์๋ ์กด์ฌํ๋ ์์กด์ฑ ํจํค์ง
์์กด์ฑ ์ค๋ณต ๋ฐฉ์ง๋ฅผ ์ํ ํธ์ด์คํ ๊ธฐ๋ฒ์ Side Effect
๋ถํ์ํ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ๋๋ฆฌ๊ฒ ๋ง๋ ๋ค.
Plug & Play
ํจํค์ง ์์กด์ฑ์ ์ค์นํ ๋,
node_modules
ํด๋๋ฅผ ์์ฑํ์ง ์๊ณ , ์์กด์ฑ ํจํค์ง๋ค์.yarn/cache
์ ์ํ์ ์ผ๋ก ์์ถํ์ผ๋ก ์ค์นํ์ฌ ํ์ํ ํจํค์ง๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ ๋ฐฉ์
์ฌ๋ฌ ํจํค์ง์์ ์ค๋ณต๋๋ ์์กด์ฑ ํจํค์ง๋ค์ ์ ์ญ์ผ๋ก ์ค์นํด์ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์
ํด๋น ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ ์ ๋ฉ๋ชจ๋ฆฌ์์ ZipFS๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ ์์ถ์ ํด์ ํ๊ณ ํ์ํ ๋ถ๋ถ๋ง ์ถ์ถํ์ฌ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ผ๋ก ํจ์จ์ ์ผ๋ก ์ ๊ทผํ๋ค.
์์กด์ฑ์ด
.yarn/cache
์ ์ํ์ ์ผ๋ก ์ค์น๋๋ฏ๋ก ๋ชจ๋ ํจํค์ง์ ๋ํ ์ ๊ทผ ์๊ฐ์ด O(1)ํธ์ด์คํ ๋ฐฉ์์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ น ์์กด์ฑ์ด ๋ฐ์ํ์ง ์๋๋ค.
์์ถํ์ผ๋ก ๋ ์์กด์ฑ์ git์ผ๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ฉด ์ค์น ๊ณผ์ ์ ์๋ต(zero-install)ํ ์ ์๋ค.
Monorepo ํ๊ฒฝ ์ธํ
ํ๊ธฐ
NVM
Node Version Manager, ์ฌ๋ฌ ๋ ธ๋ ๋ฒ์ ์ ์ค์์นญํ์ฌ ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์ฃผ๋ ๋๊ตฌ
์ฌ๋ฌ ํ๋ก์ ํธ์์ ์๋ก ๋ค๋ฅธ Node ๋ฒ์ ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ค๋ค.
๊ฐ ํ๋ก์ ํธ๋ง๋ค Node๋ฅผ ๊ด๋ฆฌํ ํ์๊ฐ ์๊ฒ ๋๋ค.
brew install nvm
ํ๊ฒฝ๋ณ์ ์ค์ ํ๊ธฐ
mkdir ~/.nvm
vi ~/.zshrc
export NVM_DIR="$HOME/.nvm"
[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh" # This loads nvm
[ -s "/usr/local/opt/nvm/etc/bash_completion" ] && . "/usr/local/opt/nvm/etc/bash_completion" # This loads nvm bash_completion
source ~/.zshrc
์ค์น๋ Node version list ํ์ธ
nvm ls
'abumalick.vscode-nvm' vscode extension ์ถ๊ฐ
vscode์์ nvm์ ์ฌ์ฉํ๊ธฐ ์ฝ๋๋ก ๋์์ฃผ๋ ํ์ฅ ํ๋ก๊ทธ๋จ
ํ๋ก์ ํธ ๋ฃจํธ๊ฒฝ๋ก์ .nvmrc
์ค์ ํ์ผ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ๋
ธ๋ ๋ฒ์ ์ ์ง์ ํ๋ฉด nvm use
๋ช
๋ น์ด๋ฅผ ์คํํ์ง ์๊ณ ๋ ํน์ ๋
ธ๋ ๋ฒ์ ์ ์๋์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๊ด๋ฆฌํด์ค๋ค.
.nvmrc
.nvmrc
// galium ์ด๋ ๋ณ์นญ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฒ์ 16.20.0์ ์ฌ์ฉํ๊ฒ ๋ค ์ ์ธ
lts/gallium
ํด๋น ํ๋ก์ ํธ์ vscode๊ฐ ์ด๋ฆฌ๋ฉด ์๋์ผ๋ก nvm use ๋ช ๋ น์ด๊ฐ ์คํ๋์ด ์ง์ ํ ๋ ธ๋๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํด์ค๋ค.
nvm use
๋ ๋ก์ปฌ์ ์ค์น๋ ํน์ ๋
ธ๋ ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ์ค์ ํ๋ ๋ช
๋ น์ด์ด๋ค.

.vscode/extensions.json
์ ์ถ๊ฐ
.vscode/extensions.json
์ ์ถ๊ฐ
.vscode/extension.json
์ ์ถ๊ฐํ์ฌ ์๋์ผ๋ก ํด๋น ์ต์คํ ์ ์ ์ค์นํ ์ ์๋๋ก ์ค์ ํ์.
{
"recommendations": ["abumalick.vscode-nvm"]
}
Yarn Berry Workspace
yarn์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋์ด ์๋ค๊ณ ๊ฐ์
yarn version ๋ณ๊ฒฝํ๊ธฐ
// yarn ๋ฒ์ ํ์ธ
yarn -v
// yarn berry ๋ฒ์ ํ์ฑํ
yarn set version berry
// yarn ๋ฒ์ ํ์ธ
yarn -v // ํ ์์ 4.0.2
Yarn workspace ์์ฑํ๊ธฐ
๋ฃจํธ ์ํฌ์คํ์ด์ค๋ ๋ชจ๋ ํ๋ก์ ํธ์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํจํค์ง ์์กด์ฑ์ ํ๋ฒ์ ๊ด๋ฆฌํ ์ ์๋ค.
์ฆ, ํ์ ์ํฌ์คํ์ด์ค์์
yarn install
๋ช ๋ น์ด๋ฅผ ํตํด ๋ฃจํธ์ ์ค์น๋ ํจํค์ง๋ค์ ์ฌ์ฉํ ์ ์๋ค.
yarn init -w
๋ช
๋ น์ด๋ yarn์ ์ด์ฉํด์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๋ช
๋ น์ด์ด๋ค.
-w
์ต์
์ ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ฃจํธ ์ํฌ์คํ์ด์ค ๋๋ ํ ๋ฆฌ๋ก ์ค์ (package.json ์์ฑ๋จ)
yarn berry cli ๋ช ๋ น์ด ์ฐธ๊ณ
yarn init -2 -w
yarn cache ํ์ธํ๊ธฐ
yarn config enableGlobalCache

yarn config set enableGlobalCache false

enableGlobalCache
์ค์ ์.yarnrc.yml
ํ์ผ ๋ด๋ถ์ ์ค์ ๋์๋๊ฒ์ ํ์ธํด ๋ณผ ์ ์๋ค.
apps/ ๋๋ ํ ๋ฆฌ ์์ฑ
์ค์ ๋ก ์๋น์คํ ์ดํ๋ฆฌ์ผ์ด์ ๋ค์ ๋ชจ์๋๋ ๋๋ ํ ๋ฆฌ
mkdir apps
package.json
์ถ๊ฐํ apps ๋๋ ํ ๋ฆฌ๋ฅผ ์ํฌ์คํ์ด์ค ๋๋ ํ ๋ฆฌ์ package.json์ ๋ฑ๋ก
{
"name": "mono-test",
"packageManager": "yarn@3.5.1",
"private": true,
// ์ํฌ์คํ์ด์ค์์ ๊ด๋ฆฌํ ํจํค์ง ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ค์
"workspaces": [
"apps/*", // ์์ฑํ apps/ ๋๋ ํ ๋ฆฌ๋ฅผ ์ถ๊ฐ
"packages/*"
]
}
ํ๋ก์ ํธ ํจํค์ง ์ถ๊ฐํด๋ณด๊ธฐ
apps/
๋๋ ํ ๋ฆฌ ๋ด์์ ํ๋ก์ ํธ๋ฅผ ์์ฑํด๋ณด์.
yarn init
ํ๋ก์ ํธ ์์ฑ์ด ์๋ฃ๋์๋ค๋ฉด ํด๋น ํ๋ก์ ํธ์ package.json
์ ์์
package.json
ํจํค์ง์ ๋ฒ์๋ฅผ ์ค์ ํ๊ธฐ ์ํด ํ๋ก์ ํธ์ ๋ค์์
@
์ ๋์ด๋ฅผ ๋ถํ@org/package
ํ์์ผ๋ก ๋ณ๊ฒฝ
{
"name": "@jtwjs/web",
"version": "0.1.0",
"private": true,
//...//
}
์ํฌ์คํ์ด์ค๋ก ๋์๊ฐ์ ์ํ๋ฅผ ๊ฐฑ์
ํ๋ก์ ํธ๊ฐ ์ถ๊ฐ๋๋ฉด ์ํฌ์คํ์ด์ค๋ก ๋์๊ฐ์ ์ํ๋ฅผ ๊ฐฑ์ ํด์ฃผ์ด์ผ ํ๋ค.
ํด๋น ์ ๋ณด๋
.pnp.cjs
์์ ๊ด๋ฆฌ ๋๋ค.
yarn workspace [package name] [scripts]
๋ก ์ํฌ์คํ์ด์ค ํน์ ํจํค์ง์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ์คํํ ์ ์๋ค.
cd ../../
yarn // ์ํ ๊ฐฑ์
yarn workspace @jtwjs/web run dev // ์คํ ํ์ธ
Typescript ์ค์ ํ๊ธฐ
ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋์ ๋นจ๊ฐ์ค์ด ์๊ธฐ๋ฉด์ ์ธ์์ ๋ชปํ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
yarn berry๋
node_modules
๋์ ํจํค์ง ์์กด์ฑ์zip
ํ์ผ ํํ๋ก.yarn/cache
์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํ๋plugin & play
๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค.์ด๋ฐ ๋ฐฉ์์ ์ฐจ์ด ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์ค์ ์ด ํ์ํ๋ค.
yarn add -D typescript
yarn dlx @yarnpkg/sdks vscode
'arcanis.vscode-zipfs' vscode extension ์ถ๊ฐ
Yarn SDK์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์บ์์์ ํ์ผ์ ์ํํ๊ฒ ์ด๊ณ ํธ์งํ ์ ์๋ค.
.vscode/extensions.json
์ ์ถ๊ฐ
.vscode/extensions.json
์ ์ถ๊ฐ{
"recommendations": [
"abumalick.vscode-nvm",
"arcanis.vscode-zipfs"
]
}
๊ณตํต ํจํค์ง๋ฅผ ๋ง๋ค์ด๋ณด๊ธฐ
์ฌ๋ฌ ํจํค์ง์์ ๊ณต์ ํ์ฌ ์ฌ์ฉํ ์ ํธ ํจ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด
packages/lib
ํด๋๋ฅผ ์์ฑ
// lib ํด๋ ์ด๋
cd packages/lib
// pacakge.json ํ์ผ ์์ฑ
yarn init
// typescript ์ค์น
yarn add typescript
package.json
name ์์
package.json
name ์์ {
"name": "@jtwjs/lib",
"main": "./src/index.ts",
}
tsconfig.json ์ค์
touch tsconfig.json
{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"strict": true,
"useUnknownInCatchVariables": true,
"allowJs": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true,
"newLine": "lf",
"module": "ESNext",
"moduleResolution": "node",
"target": "ESNext",
"lib": ["ESNext", "dom"],
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"baseUrl": "./src",
"noEmit": false,
"incremental": true,
"resolveJsonModule": true,
"paths": {}
},
"exclude": ["**/node_modules", "**/.*/", "./dist", "./coverage"],
"include": ["**/*.ts", "**/*.js", "**/.cjs", "**/*.mjs", "**/*.json"]
}
๋ค๋ฅธ ํจํค์ง์ ์์กด์ฑ ์ถ๊ฐํ๊ธฐ
๋ฃจํธ ์ํฌ์คํ์ด์ค ๊ฒฝ๋ก๋ก ๋์๊ฐ์ A ํจํค์ง์ B ํจํค์ง ์์กด์ฑ์ ์ถ๊ฐํด๋ณด์.
// @jtwjs/web ํจํค์ง์ @jtwjs/lib ํจํค์ง๋ฅผ ์ถ๊ฐ
yarn workspace @jtwjs/web add @jtwjs/lib
@jtwjs/web ํจํค์ง๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์์กด์ฑ์ด ์ถ๊ฐ๋๊ฑธ ํ์ธํ ์ ์๋ค.
๊ฐ๋ฐํ๊ฒฝ ์ค์ ๊ณต์ ํ๊ธฐ
tsconfig ์ค์ ๊ณต์ ํ๊ธฐ
ํ๋ก์ ํธ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํ์ ์คํฌ๋ฆฝํธ ์ค์ ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ์ฌ ์ค๋ณต๋๋ ์ค์ ์ ์ต์ํํ๋ค.
์ํฌ์คํ์ด์ค ๊ฒฝ๋ก์
tsconfig.base.json
ํ์ผ์ ์์ฑํ์ฌ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ค์ ๊ฐ ํ๋ก์ ํธ ํจํค์ง์
tsconfig.json
์์ extends ์์ฑ์ ์ฌ์ฉํ์ฌ ์ฌ์ฌ์ฉํ๋ค."extends": "../../tsconfig.base.json",
// tscofnig.base.json
{
"compilerOptions": {
"strict": true,
"useUnknownInCatchVariables": true,
"allowJs": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"incremental": true,
"newLine": "lf"
},
"exclude": ["**/node_modules", "**/.*/"]
}
eslint & prettier ์ค์ ๊ณต์ ํ๊ธฐ
์ฌ๋ฌ ํจํค์ง์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ eslint & prettier ๊ท์น์ ๊ณต์ ํ์ฌ ์ฌ์ฌ์ฉํ์.
yarn add prettier eslint eslint-config-prettier eslint-plugin-import eslint-plugin-react eslint-plugin-react-hooks eslint-import-resolver-typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser -D
yarn dlx @yarnpkg/sdks
๊ธฐํ vscode ์ค์ ์ถ๊ฐ
Eslint & Prettier์ค์
๋ชจ๋ ํ๋ก์ ํธ์ ๊ณตํต์ ์ผ๋ก ์คํํ ๋ช
๋ น์ด
workspace-tools
ํ๋ฌ๊ทธ์ธ ์ค์น๊ฐ ํจํค์ง ๋ง๋ค ๊ณตํต์ ์ผ๋ก ๋์ผํ ๋ค์ด๋ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ผ๊ด์ ์ผ๋ก ์คํ ์ํฌ ์ ์๋ค.
yarn plugin import workspace-tools
"scripts": {
//g:๋ global ๊ด๋ก์ด๋ค.
"g:typecheck": "yarn workspaces foreach -pv run typecheck"
},
typecheck
"scripts": {
"typecheck": "tsc --project ./tsconfig.json --noEmit"
},
Deploy
Github actions
.github/workflows
๋๋ ํ ๋ฆฌ ๋ด์์ ์ํฌํ๋ก์ฐ(.yml
)๋ฅผ ์์ฑํ์ฌ ๋ฐฐํฌ ์์ ์ ์ ์ํ๋ค.๋ชจ๋ ธ๋ ํฌ์ ๊ฒฝ์ฐ ๊ฐ ํ์ ํ๋ก์ ํธ์ ๋ํด ๋ฐฐํฌ ์์ ์ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ํด์ผ ํ๋ค.
๋ฐฐํฌํ๊ธฐ ์ ๊ด๋ จ ์์กด์ฑ์ ๋ชจ๋ ์ค์นํ๋ ์์ ์ด ์ถ๊ฐ ๋์ด์ผ ํ๋ค.
๊ด๋ จ ์์กด์ฑ์ ์ค์นํ๋ ์์ ์ ๊ฐ ๋ฐฐํฌ ์ํฌํ๋ก์ฐ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ composite actions๋ฅผ ์ฌ์ฉํ์ฌ ์ก์ ์ ์ฌ์ฌ์ฉํด๋ณด์.
Menual Deploy (์๋์ผ๋ก ๋ฐฐํฌํ๊ธฐ)
workflow dispatch๋ฅผ ์ฌ์ฉํ์ฌ ๊นํ ์ ์ฅ์์์ ์๋์ผ๋ก workflow๋ฅผ ์คํํ ์ ์๋ค.
์ฌ๋ฌ ์ํฌ์คํ์ด์ค๋ฅผ ๊ด๋ฆฌํ๋ ์ํฉ์์๋ ์๋์ผ๋ก ๋ฐฐํฌํ ์ํฌ์คํ์ด์ค๋ฅผ ์ ํํ๋ ๋ฐฉ์๋ ๊ฝค ์ ์ฉํด ๋ณด์ธ๋ค.

default branch์ ์ ์ฉ๋์์ด์ผ๋ง ์๋ํ๋ค.
Last updated