Lerna(๐Ÿ‰)๋กœ ๋ชจ๋…ธ๋ ˆํฌ ํ•ด๋ณด๋Ÿฌ๋‚˜?

Lerna๋กœ mono-repo ๋งŒ๋“ค์–ด๋ณด๊ธฐ

Jung Han
Jung Han
Sep 1, 2019 ยท 17 min read

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ด ๊ธ€์€ FE๊ฐœ๋ฐœ๋žฉ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ mono-repo ๋„์ž…์„ ์œ„ํ•ด ์กฐ์‚ฌํ–ˆ๋˜ ๋‚ด์šฉ์„ ์กฐ๊ธˆ ๋‹ค๋“ฌ์–ด ๊ณต์œ ์šฉ์œผ๋กœ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ Mono-Repo๋ฅผ ์ ์šฉํ•ด์„œ ๋งŽ์€ ๊ฟ€ํŒ์„ ๊ฐ–๊ณ  ๊ณ„์‹œ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

`Multi Repo`์™€ `Poly Repo`๋Š” ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์–ด์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ข€ ๋” ๋ฒ”์šฉ์ ์œผ๋กœ ์“ฐ์ด๊ณ  ์žˆ๋Š” `Multi Repo`๋กœ ํ†ต์ผ ์‹œ์ผœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.


Mono-Repo์™€ Multi-Repo?

์‚ฌ์ „์  ์˜๋ฏธ

Mono๋Š” ๋‹จ์ผ์˜ ์˜๋ฏธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ ‘๋‘์‚ฌ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€์˜ ์˜๋ฏธ๋กœ๋Š” Multi, ๋ณต์ˆ˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, Repo๋Š” Repository์˜ ์ค„์ž„๋ง๋กœ ์ €์žฅ์†Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋‹จ์–ด๋ฅผ ํ•ฉ์ณ๋ณด๋ฉด Mono-Repo์˜ ๋ฒ”์šฉ์  ์˜๋ฏธ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Contains multiple packages or projects
Multi-Repo๋Š” ์—ฌ๋Ÿฌ ์ €์žฅ์†Œ์— ํ”„๋กœ์ ํŠธ, ํŒจํ‚ค์ง€๋ฅผ ๋ถ„์‚ฐํ•ด ๋‘๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ •๋ฐ˜๋Œ€๋กœ Mono-Repo๋Š” ํ•˜๋‚˜์˜ repository(์ €์žฅ์†Œ)์— ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ, ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ง„ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Mono-Repo์˜ ์žฅ์ ์ด์ž Multi-Repo์˜ ๋‹จ์ 

Multi-Repo๋Š” ์œ ์—ฐ์„ฑ, ๋ฐฐํฌ, ํ™•์žฅ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ •์ฑ…์„ ์ •ํ•˜๊ฑฐ๋‚˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒ€์›๋“ค์—๊ฒŒ ๋งž๊ฒŒ ๋ถ„๋ฐฐํ•  ๋•Œ ์ €์žฅ์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๊ฒฝ์šฐ ์ค‘๋ณต๋œ ์„ค์ •์„ ๋งค๋ฒˆ ํ•ด์ค˜์•ผ ํ•˜๋ฉฐ ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์šด์˜ํ•  ๋•Œ์—๋Š” ์ด์Šˆ๊ฐ€ ๋ถ„์‚ฐ๋˜๊ณ  ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ ๋ฐฐํฌ๊ฐ€ ์žฆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ Mono-Repo์˜ ์žฅ์ ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

# Common config
Multi-repo๋Š” ๋ชจ๋“  ์„ค์ •์„ ๊ฐ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Mono-repo์—์„œ๋Š” `ESLint`, `Prettier`, `Babel` ๋“ฑ์˜ ์„ค์ •์„ ๋ฃจํŠธ ๋ ˆ๋ฒจ์— ํ•  ์ˆ˜ ์žˆ์–ด ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€์—์„œ ํ•˜๋‚˜์˜ ์„ค์ •์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

babel ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. eslint๋‚˜ travis, flow ๋“ฑ ์—ฌ๋Ÿฌ ์„ค์ •์„ ๋ฃจํŠธ์— ๋‘๊ณ  ๊ณต์œ ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ

๋˜ํ•œ, ํŒจํ‚ค์ง€๋ฅผ ๋„˜๋‚˜๋“ค๋ฉฐ ๋ชจ๋“ˆํ™” ์‹œ์ผœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

babel์˜ ํŒจํ‚ค์ง€ ๋ชจ๋“ˆํ™”์ž…๋‹ˆ๋‹ค. babel์˜ ํŒจํ‚ค์ง€๋Š” ์•ฝ 150๊ฐœ ์ •๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ `babel/packages/babel-cli/src/babel/util.js` ๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด

// โ€ฆ ๋‹ค๋ฅธ ๋ชจ๋“ˆ import
import * as babel from โ€œ@babel/coreโ€;
export function transform(
filename: string,
code: string,
opts: Object,
): Promise<Object> {
opts = {
โ€ฆopts,
caller: CALLER,
filename,
};
return new Promise((resolve, reject) => {
babel.transform(code, opts, (err, result) => {
if (err) reject(err);
else resolve(result);
});
});
}

@babel/core ์˜์กด์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณธ Mono-Repo์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” core, util, routing ์ฝ”๋“œ๋“ค์„ ๊ฐ ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ด ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ํ•˜๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด core, util, routing์€ ์ด ์ž์ฒด๋กœ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ TOAST UI์˜ tui-code-snippet, tui-dom ์ฒ˜๋Ÿผ์š”!

# One PR

TOAST UI Application + TOAST UI Component + React Wrapper + Vue Wrapper ์˜ ๊ฐฏ์ˆ˜๋Š” ๋ช‡๊ฐœ์ผ๊นŒ์š”?

๋‹ต์€ 41๊ฐœ์ž…๋‹ˆ๋‹ค. ์–ผ๋งˆ ์ „ ์‹ค์ œ๋กœ ์žˆ์—ˆ๋˜ ์ผ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ช…์ด NHN Entertainment์—์„œ NHN์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์‚ฌ๋ช…์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ npm์— ๋ฐ˜์˜์‹œํ‚ค๋ ค๋ฉด 41๋ฒˆ์˜ ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.(repository์˜ ๋ณ€๊ฒฝ์€ ์กฐ๊ธˆ ๋” ๋’ค์— ์žˆ์—ˆ์œผ๋‹ˆ ๋” ๋งŽ์€ ํšŸ์ˆ˜์˜ ๋ฐฐํฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.) ๋ฌผ๋ก , ๋‹ค๋ฅธ ์˜คํ”ˆ์†Œ์Šค๋“ค์— ๋น„ํ•ด ๋งŽ์€ ๊ฐœ์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ์ ์ง€ ์•Š์€ ๊ฐฏ์ˆ˜์ด๊ธฐ๋Š” ํ•ฉ๋‹ˆ๋‹ค.(1000๊ฐœ ์ด์ƒ์˜ ๋ชจ๋“ˆ์„ npm์— ๋“ฑ๋กํ•˜์‹  ๋ถ„๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.) ์ ์–ด๋„ TOAST UI์˜ ๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ž˜ํผ๋“ค์„ ํ†ตํ•ฉ์‹œ์ผœ Mono-Repo ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค๋ฉด 10๊ฐœ์˜ ์ €์žฅ์†Œ ๊ด€๋ฆฌ ์ด์Šˆ๊ฐ€ ์ค„์–ด๋“ค๊ณ  ํ•˜๋‚˜์˜ PR๋กœ ๋งŽ์€ ๊ฒƒ์„ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TOAST UI Grid๋Š” ์ง€๊ธˆ ์–ด๋–ป๊ฒŒ ํ•˜๊ณ ์žˆ๋‚˜?

toast ui grid ๊ด€๋ จ ๋ ˆํฌ๋“ค

TOAST UI Application์€ ์ง€๊ธˆ multi-repo์˜ ํ˜•ํƒœ๋ฅผ ๋„๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. TOAST UI Grid๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด(๋‚˜๋จธ์ง€ Application ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.) tui.grid, toast-ui.vue-grid, toast-ui.react-grid ์„ธ๊ฐœ์˜ ์ €์žฅ์†Œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

# ๊ด€๋ฆฌ์˜ ๋ถˆํŽธํ•จ

  1. ๐ŸŒŸ์ด์Šˆ์˜ ๋ถ„์‚ฐ๐ŸŒŸ: ์ด์Šˆ๊ฐ€ ๋ถ„์‚ฐ๋˜๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. TOAST UI Grid๋ฅผ vue-wrapper๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ์–ด๋Š ์ €์ •์†Œ์— ์ด์Šˆ๋ฅผ ์˜ฌ๋ ค์•ผ ํ•˜๋Š”์ง€ ์‚ฌ์šฉ์ž๋Š” ์ถฉ๋ถ„ํžˆ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ง€์ผœ๋ด์•ผ ํ•  ์ €์žฅ์†Œ๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ๋น ๋ฅธ ๋Œ€์‘์ด ํž˜๋“ค์–ด์ง€๋Š” ๊ฒƒ ๋˜ํ•œ ํ˜„์‹ค์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ๋งค๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ •์ ๋ถ„์„๋„๊ตฌ๋‚˜ ์Šคํƒ€์ผ ๊ทœ์น™์„ ๋งค๋ฒˆ ์„ค์ •ํ•ด์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.(Prettier, Eslint, Cypress, storybookโ€ฆ)
  3. ์˜์กด์„ ๊ฐ–๊ณ ์žˆ๋Š” ๋ ˆํฌ๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ๋ชจ๋‘ ํ•œ๊บผ๋ฒˆ์— ์ˆ˜์ •ํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ธฐ์— ์–ด๋ ค์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ถˆํŽธํ•œ ์ ์€ ์ •ํ™•ํ•˜๊ฒŒ mono-repo์˜ ์žฅ์ ๊ณผ ๋งค์นญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Mono-Repo์˜ ํ•„์š”์„ฑ๊ณผ ์žฅ์ ๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ดค์œผ๋‹ˆ ์ €์žฅ์†Œ ๊ตฌ์„ฑ์„ ๋„์™€์ฃผ๋Š” ํ•œ ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์†Œ๊ฐœํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


Lerna ๋ž€?

Lerna์˜ ํžˆ๋“œ๋ผ. Lerna์˜ ์ƒ์ง•์ž…๋‹ˆ๋‹ค. ๐Ÿ‰

Lerna๋Š” ๋Ÿฌ๋‚˜ ํ˜น์€ ๋ ˆ๋ฅด๋‚˜๋กœ ์ฝํž™๋‹ˆ๋‹ค. ํ•œ๊ตญ์—์„œ๋Š” ๋ ˆ๋ฅด๋‚˜๋กœ ๋” ๋งŽ์ด ์ฝํžˆ๋Š”๋ฐ์š”. (๋กœ๊ณ ์˜ ํžˆ๋“œ๋ผ๊ฐ€ ๊ถ๊ธˆํ•˜์‹œ๋ฉด ์œ„ํ‚ค๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.)
Lerna๋Š” ๋‹จ์ผ ์ €์žฅ์†Œ(Repository)์—์„œ ๋‹ค์–‘ํ•œ packages๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ „์ฒด๋ฅผ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜, ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ํŒจํ‚ค์ง€๋“ค์„ ๋ฐฐํฌํ•  ๋•Œ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

Lerna๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋‚˜?

Lerna์—์„œ ๊ณต์‹์‚ฌ์ดํŠธ์—์„œ ์–ธ๊ธ‰ํ•˜๊ธฐ๋กœ๋Š” lerna publish, lerna bootstrap ๋‘๊ฐ€์ง€๊ฐ€ ์ฃผ์š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด์™ธ์— ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํ•œ๋ฒˆ์— ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์—ฌ๋Ÿฌ ์ปค๋งจ๋“œ๋“ค๋„ ๊ฐ™์ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์ปค๋งจ๋“œ ์„ค๋ช…์ด๋‚˜ ์—ฌ๊ธฐ ๋“ฑ์žฅํ•˜์ง€ ์•Š๋Š” ์ปค๋งจ๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ๋‹ค์Œ ๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

# lerna init

$ lerna init
$ lerna init โ€” independent

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— lerna repo๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. โ€” independent ์˜ต์…˜์„ ๋ถ™์ผ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๋“ค์˜ ๋ฒ„์ €๋‹ ์ •์ฑ…์„ ๋…๋ฆฝ์œผ๋กœ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค.

# lerna version

$ lerna version 1.0.1 # explicit
$ lerna version patch # semver keyword
$ lerna version # select from prompt(s)

์ด์ „ ๋ฐฐํฌ ๋ฒ„์ „์—์„œ ๋ณ€๊ฒฝ์ด ์กด์žฌํ•˜๋Š” pacakge๋“ค์˜ ๋ฒ„์ „์„ ๋ณ€๊ฒฝ์‹œ์ผœ์ค๋‹ˆ๋‹ค. semver ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅ์‹œํ‚ค๊ฑฐ๋‚˜ ๋ฒ„์ „์„ ๋ช…์‹œํ•ด์ฃผ๊ฑฐ๋‚˜, ์„ ํƒํ•ด์„œ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# lerna diff

$ lerna diff [package]

ํ•ด๋‹น ํŒจํ‚ค์ง€์˜ ์ง€๋‚œ ๋ฐฐํฌ ์ดํ›„ ๋ณ€๊ฒฝ์ ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

# lerna bootstrap

$ lerna bootstrap

lerna bootstrap์„ ํ†ตํ•ด ๊ฐ ํŒจํ‚ค์ง€๋“ค์˜ ์˜์กด์„ ์„ค์น˜ํ•˜๊ณ  cross-dependencies๋ฅผ ์—ฐ๊ฒฐ, ์žฌ์ •๋น„ ํ•ด์ค๋‹ˆ๋‹ค. ์˜์กด์ด ์žˆ๋Š” ํŒจํ‚ค์ง€๋Š” ์„ค์น˜ ๋Œ€์‹  Symlink๋ฅผ ์ •๋น„ ํ•ฉ๋‹ˆ๋‹ค.

# lerna run

$ lerna run <script>
$ lerna run test
$ lerna run build
# my-component ํŒจํ‚ค์ง€๋งŒ test
$ lerna run โ€” scope my-component test

๊ฐ ํŒจํ‚ค์ง€๋“ค์˜ npm ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. scope๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ scope๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ „์ฒด ํŒจํ‚ค์ง€์— ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

# lerna publish

$ lerna publish

ํ”„๋กœ์ ํŠธ์—์„œ ์ง€๋‚œ ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„ ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ๋˜ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

# lerna clean

$ lerna clean

๊ฐ ํŒจํ‚ค์ง€๋“ค์˜ node_modules ํด๋”๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. workspaces๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ์„ค์ •์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

# lerna link convert

$ lerna link convert

lerna link convert๋ฅผ ํ†ตํ•ด ๊ฐ ํŒจํ‚ค์ง€์˜ devDependencies๋ฅผ ๋ฃจํŠธ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

lerna link convert ์ „ package.json
lerna link convert ํ›„ package.json

Mono-Repo ์ ์šฉ ํ•ด๋ณด๊ธฐ

* ํ…Œ์ŠคํŠธ ๊นƒํ—™ ๋งํฌ: https://github.com/jung-han/tt-grid-test

๊ฐ ์ปค๋งจ๋“œ๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ์ง€ ๋Š๋‚Œ์ด ์˜ค์‹œ๋‚˜์š”? ๊ทธ๋Ÿผ ํ•œ๋ฒˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ๋ฒ„์ „

lerna๋ฅผ ์„ค์น˜ํ•˜๊ณ  independent๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

$ lerna init โ€” independent

lerna.json ํŒŒ์ผ์€ lerna init์„ ํ•œ ์ƒํƒœ ๊ทธ๋Œ€๋กœ ์ž…๋‹ˆ๋‹ค.

{
โ€œpackagesโ€: [
โ€œpackages/*โ€
],
โ€œversionโ€: โ€œindependentโ€
}

๊ฐ ํŒจํ‚ค์ง€๋“ค์˜ ๊ฒฝ๋กœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€, version์€ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

# ํด๋” ์ˆ˜์ •ํ•˜๊ธฐ

packages ํด๋”์— ๊ฐ ํŒจํ‚ค์ง€๋“ค์„ ์œ„์น˜ ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋•Œ ๊ณตํ†ต์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” docs ํŒŒ์ผ์ด๋‚˜ ์„ค์ •ํŒŒ์ผ๋“ค์„ root๋กœ ์œ„์น˜ ์‹œํ‚ต๋‹ˆ๋‹ค.

# ๋ฐฐํฌํ•˜๊ธฐ

npm publish๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด ๋ณด๊ฒŒ ๋˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. CLI๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ฒ„์ „์„ ๋ฐฐํฌํ•  ๊ฒƒ์ธ์ง€ ๊ฐ๊ฐ ํŒจํ‚ค์ง€๋“ค ๋ณ„๋กœ ๋ฒ„์ „์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ์˜ ํ˜•ํƒœ

๋…๋ฆฝ๋ฒ„์ „ ๋ฐฐํฌํ›„ ํƒœ๊ทธ์˜ ํ˜•ํƒœ๋Š” ๋ฐฐํฌ๋œ ํŒจํ‚ค์ง€์˜ ์ด๋ฆ„@๋ฒ„์ „์˜ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. lerna publish๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

# bower ์‚ฌ์šฉํ•˜๊ธฐ

bower๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

bower.json

์„ค์ • ํŒŒ์ผ์„ packages์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒˆ๋“คํŒŒ์ผ ์œ„์น˜๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ `bower`์˜ ๊ธฐ์ค€์€ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์ด๋ฉฐ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ๊ฐ bower๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.(๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค๋ฉด..๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹คใ… ใ… )

ํ†ตํ•ฉ๋ฒ„์ „

independent ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด์ „๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ฒ„์ „์— ์ˆซ์ž๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ํ˜•ํƒœ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ semver๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์ด ์ „์ฒด package๋“ค์˜ ํ†ตํ•ฉ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

{
โ€œpackagesโ€: [
โ€œpackages/*โ€
],
โ€œversionโ€: โ€œ0.0.0โ€
}

# ๋ฐฐํฌํ•˜๊ธฐ

์ด์ „ ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ณ€ํ™”๊ฐ€ ์กด์žฌํ•˜๋Š” ์ „์ฒด ํŒจํ‚ค์ง€๋“ค์„ ๋ฒ„์ „์— ๋งž์ถฐ ํ•œ๋ฒˆ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ ๋˜ํ•œ ์ด์ „์ฒ˜๋Ÿผ ํ•˜๋‚˜๋กœ ๊ด€๋ฆฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ๋ฒ„์ „ ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ

๋งŒ์•ฝ react wrapper์— ๋ณ€ํ™”๋ฅผ ์ฃผ๊ณ  ๋ฐฐํฌ๋ฅผ ํ•œ๋‹ค๋ฉด ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€๋งŒ ๋ฐฐํฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

yarn workspace๋ฅผ ํ†ตํ•œ code sharing

# ํ™˜๊ฒฝ ์„ค์ •

  • lerna.json
{
โ€œpackagesโ€: [
โ€œpackages/*โ€
],
โ€œversionโ€: โ€œ0.0.0โ€,
โ€œnpmClientโ€: โ€œyarnโ€,
โ€œuseWorkspacesโ€: true
}

๊ฐ pacakge์˜ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” yarn์„ npm client๋กœ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ useWorkspaces ์˜ต์…˜์„ true๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • root packages.json
{
โ€œworkspacesโ€: [
โ€œpackages/*โ€
]
}

์ตœ์ƒ๋‹จ packages.json์—๋Š” workspaces์˜ ์œ„์น˜๋ฅผ ๋ช…์‹œํ•ด์ค๋‹ˆ๋‹ค.

yarn workspace๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ๋ชจ๋“ˆ๋“ค์„ ์ค‘๋ณต์œผ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ์ƒ๋‹จ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

root ๊ฒฝ๋กœ์˜ node_modules์— ์ •๋ฆฌ๋œ ์˜์กด๋“ค

์ค‘๋ณต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ ์™ธ์— ํŒŒ์ผ๋“ค์€ ๊ฐ ํŒจํ‚ค์ง€๋“ค์— ์œ„์น˜ํ•˜์—ฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜์กด์„ package.json์— ๋ช…์‹œํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • yarn workspace๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  lerna bootstrap์„ ํ†ตํ•ด์„œ๋งŒ cross-dependency๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • npm 7 roadmap์„ ํ™•์ธํ•ด ๋ณด๋ฉด 7๋ฒ„์ „๋ถ€ํ„ฐ workspace๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. yarn์„ ๊ตณ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. (์กด๋ฒ„ํ•ฉ์‹œ๋‹ค)

์˜คํ”ˆ์†Œ์Šค๋“ค์˜ ๋ฒ„์ „ ์ •์ฑ…

๋งŒ์•ฝ Mono-Repo๋ฅผ ๋„์ž…ํ•œ๋‹ค๋ฉด ๊ฐ€์žฅ ํฌ๊ฒŒ ๊ณ ๋ คํ•  ์ ์€ ๋ฒ„์ „ ์ •์ฑ…์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ์˜คํ”ˆ์†Œ์Šค๋“ค์€ ๊ฐ์ž์˜ ์„œ๋น„์Šค์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ๋ฒ„์ „ ์ •์ฑ…์„ ์ •ํ•œ ๋’ค ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜คํ”ˆ์†Œ์Šค๋“ค์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„์ „ ์ •์ฑ…์„ ๊ฒ€ํ† ํ•ด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ ์˜คํ”ˆ์†Œ์Šค๋“ค์˜ ๋ฒ„์ „ ์ •์ฑ…๊ณผ ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์„ฑ๋˜๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ •์ฑ…์„ ์„ ํƒํ•ด ๋ณผ ์ˆ˜ ์žˆ์„์ง€ ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

babel/babel

๋จผ์ €, ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๊ฐ€์žฅ ์—ด์‹ฌํžˆ ์ ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฐ”๋ฒจ์ž…๋‹ˆ๋‹ค.

* ๋งํฌ: https://github.com/babel/babel

# ๋ฒ„์ „ ์ •์ฑ…์€?

๋ฐ”๋ฒจ์€ ํ•œ๊ฐ€์ง€ ๋ฉ”์ธ๋ฒ„์ „์„ ๋‘๊ณ  ์ปค๋ฐ‹ ๋””ํ”„๊ฐ€ ์กด์žฌํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ๋ฒ„์ „์ด ํ•˜๋‚˜ ์กด์žฌํ•˜๋ฉฐ ๋ฐฐํฌ๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€๋Š” ๊ทธ ๋ฒ„์ „์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

babel-noe์˜ ๋ฒ„์ „์ด ์‘ฅ!

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด babel-node๊ฐ€ 7.4.5 ๋ฒ„์ „์ด ๋‚˜๊ฐ”์„ ๋•Œ์˜ diff ์ž…๋‹ˆ๋‹ค. ๋ฒ„์ „์ด ๋ฐ”๋กœ 7.2.2์—์„œ 7.4.5 ๋กœ ๋›ด ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ ํŒจํ‚ค์ง€๋“ค์„ ๋…๋ฆฝ๋œ ํ”„๋กœ์ ํŠธ๋กœ ๋ณธ๋‹ค๋ฉด semver๋ฅผ ์ง€ํ‚ค์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ•˜๋‚˜์˜ ํฐ ํ”„๋กœ์ ํŠธ๋ผ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋งค์šฐ ํŽธํ•œ ์ •์ฑ…์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋Š”?

babel์˜ ๋ฆด๋ฆฌ์ฆˆ๋…ธํŠธ

๋ณ€๊ฒฝ์ด ๋˜๋Š” ๋‚ด์šฉ๊ณผ ์˜ํ–ฅ์„ ๋ฐ›์€ ํŒจํ‚ค์ง€๋“ค์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

facebook/react

* ๋งํฌ: https://github.com/facebook/react

# ๋ฒ„์ „ ์ •์ฑ…์€?

babel๊ณผ ๋น„์Šทํ•œ ์ •์ฑ…์„ ์ถ”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์ •์ฑ…์€ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ์ฃผ์š”ํ•œ ๊ธฐ๋Šฅ์ด ๋˜๋Š” ํŒจํ‚ค์ง€๋“ค์€ ํ•˜๋‚˜์˜ ๋ฉ”์ธ ๋ฒ„์ „์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ๋…๋ฆฝ์ ์œผ๋กœ ๋ฒ„์ „์„ ์ฃผ๋Š” ํŒจํ‚ค์ง€๋“ค ๋˜ํ•œ ๋”ฐ๋กœ ์กด์žฌ ํ•ฉ๋‹ˆ๋‹ค.

# ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋Š”?

๋ณ€๊ฒฝ์ด ๋˜๋Š” ๋‚ด์šฉ๊ณผ ์˜ํ–ฅ์„ ๋ฐ›์€ ํŒจํ‚ค์ง€๋“ค์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

facebook/jest

* ๋งํฌ: https://github.com/facebook/jest

# ๋ฒ„์ „ ์ •์ฑ…์€?

์•„๋ฌด๊ฒƒ๋„ ์ž‘์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค.

react, babel๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ๊ฐ™์€ ๊ณ„์—ด์˜ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๊ฒ ์ฃ ?

  1. ๋ชจ๋“  ํŒจํ‚ค์ง€๋“ค์ด ๋ฒ„์ „์„ ๋”ฐ๋ผ๊ฐ€์ง€๋Š” ์•Š๋Š”๋‹ค.
  2. ๋‹น์‹œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ๋Š”(commit์— diff ๊ฐ€ ์žˆ๋Š”) ํŒจํ‚ค์ง€๋งŒ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉฐ ๋ฒ„์ „์€ lerna.json์„ ๋”ฐ๋ผ๊ฐ„๋‹ค.
  3. patch ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์œผ๋ฉฐ ์ฃผ๋กœ minor ๋ฒ„์ „์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  4. major ๋ฒ„์ „์ด ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ์ด์œ ๋„ ์ด๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

# ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋Š”?
๊นƒํ—™์—๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋งˆ์ด๋„ˆ ๋ฒ„์ „, ํŒจํ‚ค์ง€ ๋‹จ์œ„์˜ ์—…๋ฐ์ดํŠธ๋Š” ๋”ฐ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฉ”์ด์ € ๋ฒ„์ „์˜ ์—…๋ฐ์ดํŠธ๋Š” ๊ณต์‹ ์‚ฌ์ดํŠธ์˜ Blog ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

airbnb/enzyme

* ๋งํฌ: https://github.com/facebook/jest

react adapter๋ฅผ react์˜ ๋ฒ„์ „๋ณ„๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ž˜ํผ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

# ๋ฒ„์ „ ์ •์ฑ…์€?

independent ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋ณ„๋กœ ๋…๋ฆฝ๋œ ๋ฒ„์ „์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

independent๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ

# ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋Š”?

๊ณต์‹ ์‚ฌ์ดํŠธ์˜ Change Log

๊นƒํ—™์—๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ์‚ฌ์ดํŠธ์— Change Log์— ๋ณ€๋™ ์‚ฌํ•ญ์„ ๊ฐ๊ฐ ์–ด๋–ค ๋ณ€๋™์ด ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ฒ„์ „ ์ •์ฑ…์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด?

๊ทธ๋ฆผ์€ Application์— ๋ž˜ํผ๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ์„ ํŒจํ‚ค์ง€๋กœ ๋ด์ฃผ์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ํ˜•ํƒœ์˜ ๋ชจ๋ธ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฉ”์ธ ๋ฒ„์ „์„ ๋‘๊ณ  ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€๋งŒ ๋ฐฐํฌํ•˜๋Š” ๋ชจ๋ธ, ์ „์ฒด๋ฅผ ๋ชจ๋‘ ๋ฐฐํฌํ•˜๋Š” ๋ชจ๋ธ, ๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€๊ฐ€ ๋…๋ฆฝ๋œ ๋ฒ„์ „์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์„ธ ๊ฐ€์ง€ ๋ชจ๋ธ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋ฐ”๋ผ๋ณด๋Š”๊ฐ€์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ชจ๋ธ์€ lerna์˜ ๊ธฐ๋ณธ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ๊ฐ pacakge์—์„œ ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ๋ธŒ๋žœ์น˜๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ ๋ชจ๋ธ์€ ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ๋ธŒ๋žœ์น˜์— ๋งž์ถฐ ๋ฒ„์ „์„ ๊ฐ™์ด ์˜ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ์ธ๋ฐ ์ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ• ๋•Œ๋Š” ์ฃผ๋กœ ์˜์กด์„ ๊ฐ–๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€์˜ `package.json` ํŒŒ์ผ์— ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ๋ช…์‹œํ•ด ๋ณ€ํ™”๋ฅผ ์ค˜ ๊ฐ™์ด ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์„ธ๋ฒˆ์จฐ ๋ชจ๋ธ์€ independent๋กœ ๋ณ€ํ™”๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ ๊ฐ๊ฐ ๋ฐฐํฌํ•˜๊ฒŒ ๋˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.


์ค€๋น„ํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๊นŒ์ง€ ์ž…๋‹ˆ๋‹ค. TOAST UI๋Š” Mono-Repo ๋„์ž…์„ ์ค€๋น„ ์ค‘์ด๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์–ด๋–ค ์žฅ๋‹จ์ ์„ ์–ป๋Š”์ง€ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•˜์—ฌ ์ดํ›„์— ๊ณต์œ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Mono-Repo๋Š” ์˜คํ”ˆ์†Œ์Šค์—์„œ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๊ฐ€๋Š” ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Lerna๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ Mono-Repo๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ๋˜ํ•œ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ Mono-Repo ์ ์šฉ์— ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ƒ


Jung-han

๐ŸคŸ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” FE ๊ฐœ๋ฐœ์ž

Jung Han

Written by

Jung Han

๊ฐœ์ธ์šฉ ๋ธ”๋กœ๊ทธ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฟˆ์ž…๋‹ˆ๋‹ค. https://jung-han.github.io/

Jung-han

Jung-han

๐ŸคŸ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” FE ๊ฐœ๋ฐœ์ž

More From Medium

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and weโ€™ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium โ€” and support writers while youโ€™re at it. Just $5/month. Upgrade