๐Ÿš€ Rollup์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒˆ๋“ค๋งํ•˜๊ธฐ ๐ŸŽ‰

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ Rollup์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒˆ๋“ค๋งํ•˜๊ธฐ ๐ŸŽ‰

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ์žฌ๋ฐŒ๊ณ  ์œ ์šฉํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด. ๋ฐ”๋กœ Rollup์„ ์ด์šฉํ•ด์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๐Ÿ˜Ž ์ด ๊ธ€์„ ์ฝ๊ณ  ๋‚˜๋ฉด ๋„Œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์˜ ๋‹ฌ์ธ์ด ๋  ๊ฑฐ๋ผ๊ณ !

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ฉ‹์ง„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์„ธ์ƒ์— ๊ณต๊ฐœํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ๊ทธ๋ƒฅ ๋˜์ ธ์ฃผ๋ฉด ๋ ๊นŒ? ์•„๋‹ˆ์ง€! ์šฐ๋ฆฌ๋Š” ๊น”๋”ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฒˆ๋“ค๋กœ ๋งŒ๋“ค์–ด์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์•ผ ํ•ด. ์—ฌ๊ธฐ์„œ Rollup์ด ๋“ฑ์žฅํ•˜๋Š” ๊ฑฐ์ง€! ๐Ÿฆธโ€โ™‚๏ธ

๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ Rollup์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋ณผ๊นŒ? ์ค€๋น„๋์–ด? ์ž, ์ถœ๋ฐœ~! ๐Ÿš—๐Ÿ’จ

๐Ÿค” Rollup์ด ๋ญ๊ธธ๋ž˜?

Rollup? ๋กค์—…? ๋ญ”๊ฐ€ ๋ง›์žˆ๋Š” ๊ณผ์ž ์ด๋ฆ„ ๊ฐ™์ง€ ์•Š์•„? ๐Ÿ˜‹ ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” Rollup์€ ๋จน๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. Rollup์€ JavaScript ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์•ผ. ๋ญ” ์†Œ๋ฆฌ๋ƒ๊ณ ? ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ฝ”๋“œ ์กฐ๊ฐ๋“ค์„ ๋ญ‰์ณ์„œ ํ•˜๋‚˜์˜ ํฐ ๋ฉ์–ด๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ๋ผ๊ณ  ๋ณด๋ฉด ๋ผ.

๐ŸŽญ Rollup์˜ ํŠน์ง•:

  • ์ž‘๊ณ  ๊ฐ€๋ฒผ์šด ๋ฒˆ๋“ค ์ƒ์„ฑ ๐Ÿ‘Œ
  • ํŠธ๋ฆฌ ์‰์ดํ‚น ์ง€์› (์•ˆ ์“ฐ๋Š” ์ฝ”๋“œ๋Š” ์ณ๋‚ด๋ฒ„๋ ค!) ๐ŸŒณ
  • ES ๋ชจ๋“ˆ ์ง€์› (์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์„ ๋งˆ์Œ๊ป ์จ๋ด!) ๐Ÿ†•
  • ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ (ํ™•์žฅ์„ฑ ์งฑ์งฑ!) ๐Ÿ”Œ

Rollup์€ ํŠนํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ ์•„์ฃผ ์œ ์šฉํ•ด. ์™œ๋ƒ๊ณ ? ์ž‘๊ณ  ํšจ์œจ์ ์ธ ๋ฒˆ๋“ค์„ ๋งŒ๋“ค์–ด์ฃผ๋‹ˆ๊นŒ! ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‰ฝ๊ฒŒ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ์ง€.

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ, ์šฐ๋ฆฌ๋Š” ๊ทธ๋ƒฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์ž–์•„? ๊ฑฑ์ • ๋งˆ! Rollup์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ž‘๋„ ์ฐฐ๋–ก๊ถํ•ฉ์ด์•ผ. ์–ด๋–ป๊ฒŒ ๊ทธ๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€ ๊ณง ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๐Ÿ˜‰

Rollup ์ž‘๋™ ์›๋ฆฌ ๋ชจ๋“ˆ 1 ๋ชจ๋“ˆ 2 ๋ชจ๋“ˆ 3 Rollup ๋ฒˆ๋“ค๋œ ํŒŒ์ผ

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด Rollup์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ์ง€? ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ชจ๋“ˆ๋“ค์ด Rollup์ด๋ผ๋Š” ์š”๋ฆฌ์‚ฌ์˜ ์†์„ ๊ฑฐ์ณ ํ•˜๋‚˜์˜ ๋ง›์žˆ๋Š”(?) ๋ฒˆ๋“ค๋กœ ํƒ„์ƒํ•˜๋Š” ๊ฑฐ์•ผ. ๐Ÿ‘จโ€๐Ÿณโœจ

์ž, ์ด์ œ Rollup์ด ๋ญ”์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์™”์ง€? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•ด์„œ ์šฐ๋ฆฌ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž๊ณ !

๐Ÿ› ๏ธ Rollup ์„ค์น˜ํ•˜๊ณ  ์„ค์ •ํ•˜๊ธฐ

์ž, ์ด์ œ ์ง„์งœ ์‹ค์ „์ด์•ผ! Rollup์„ ์„ค์น˜ํ•˜๊ณ  ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ์— ๋งž๊ฒŒ ์„ค์ •ํ•ด๋ณผ ๊ฑฐ์•ผ. ๊ธด์žฅํ–ˆ์–ด? ๊ดœ์ฐฎ์•„, ์ฒœ์ฒœํžˆ ๋”ฐ๋ผ์™€! ๐Ÿ˜Š

1. Rollup ์„ค์น˜ํ•˜๊ธฐ

๋จผ์ €, ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— Rollup์„ ์„ค์น˜ํ•ด์•ผ ํ•ด. ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ด:

npm install rollup --save-dev

์ด ๋ช…๋ น์–ด๋Š” Rollup์„ ๊ฐœ๋ฐœ ์˜์กด์„ฑ์œผ๋กœ ์„ค์น˜ํ•ด. ์™œ ๊ฐœ๋ฐœ ์˜์กด์„ฑ์ด๋ƒ๊ณ ? ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•  ๋•Œ๋งŒ ํ•„์š”ํ•˜๊ณ , ์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๋“ค์€ ํ•„์š” ์—†๊ฑฐ๋“ .

2. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ด€๋ จ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ํ•˜๊ธฐ

์šฐ๋ฆฌ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ, Rollup์ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค๋„ ํ•„์š”ํ•ด:

npm install @rollup/plugin-typescript @rollup/plugin-node-resolve @rollup/plugin-commonjs tslib --save-dev

์šฐ์™€, ๋ช…๋ น์–ด๊ฐ€ ์ข€ ๊ธธ์ง€? ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • @rollup/plugin-typescript: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์ค˜.
  • @rollup/plugin-node-resolve: node_modules์—์„œ ์™ธ๋ถ€ ๋ชจ๋“ˆ์„ ์ฐพ์•„์ค˜.
  • @rollup/plugin-commonjs: CommonJS ๋ชจ๋“ˆ์„ ES6๋กœ ๋ณ€ํ™˜ํ•ด์ค˜.
  • tslib: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ—ฌํผ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•ด.

3. Rollup ์„ค์ • ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

์ด์ œ Rollup์—๊ฒŒ ์–ด๋–ป๊ฒŒ ๋ฒˆ๋“ค๋งํ• ์ง€ ์•Œ๋ ค์ค˜์•ผ ํ•ด. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— rollup.config.js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ด๋ด:

import typescript from '@rollup/plugin-typescript';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';

export default {
  input: 'src/index.ts',
  output: {
    file: 'dist/bundle.js',
    format: 'esm',
  },
  plugins: [
    typescript(),
    resolve(),
    commonjs(),
  ],
};

์ด ์„ค์ • ํŒŒ์ผ์ด ํ•˜๋Š” ์ผ์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • input: ์šฐ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ง„์ž…์ ์ด์•ผ. ์—ฌ๊ธฐ์„œ๋Š” src/index.ts ํŒŒ์ผ์ด ์‹œ์ž‘์ ์ด ๋ผ.
  • output: ๋ฒˆ๋“ค๋ง๋œ ๊ฒฐ๊ณผ๋ฌผ์˜ ์œ„์น˜์™€ ํ˜•์‹์„ ์ง€์ •ํ•ด. ์—ฌ๊ธฐ์„œ๋Š” dist/bundle.js ํŒŒ์ผ๋กœ ES ๋ชจ๋“ˆ ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์–ด์งˆ ๊ฑฐ์•ผ.
  • plugins: ์šฐ๋ฆฌ๊ฐ€ ์„ค์น˜ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ด.

์™€! ์ด์ œ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์€ ๋๋‚ฌ์–ด. ๊ทผ๋ฐ ์ž ๊น, ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์˜ package.json ํŒŒ์ผ๋„ ์กฐ๊ธˆ ์ˆ˜์ •ํ•ด์•ผ ํ•ด. ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์ค˜:

"main": "dist/bundle.js",
"module": "dist/bundle.js",
"types": "dist/index.d.ts",
"files": ["dist"]

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด npm์— ์šฐ๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ–ˆ์„ ๋•Œ, ์‚ฌ์šฉ์ž๋“ค์ด ์˜ฌ๋ฐ”๋ฅธ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด.

๐ŸŽˆ ๊ฟ€ํŒ: package.json์— build ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋” ํŽธ๋ฆฌํ•ด! ๋‹ค์Œ ๋‚ด์šฉ์„ "scripts" ์„น์…˜์— ์ถ”๊ฐ€ํ•ด๋ด:

"build": "rollup -c"

์ด์ œ npm run build ๋ช…๋ น์–ด๋กœ ์‰ฝ๊ฒŒ ๋ฒˆ๋“ค๋งํ•  ์ˆ˜ ์žˆ์–ด!

์ž, ์ด์ œ Rollup ์„ค์ •์€ ๋๋‚ฌ์–ด! ์–ด๋•Œ, ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ง€? ๐Ÿค“ ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ฒˆ๋“ค๋งํ•ด๋ณผ ๊ฑฐ์•ผ. ์žฌ๋ฐŒ์–ด์งˆ ๊ฑฐ์•ผ, ๊ธฐ๋Œ€ํ•ด!

๐Ÿ’ป ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

์ž, ์ด์ œ ์ง„์งœ ๊ฟ€์žผ ํƒ€์ž„์ด์•ผ! ์šฐ๋ฆฌ๋งŒ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์•ผ. ๋ญ˜ ๋งŒ๋“ค๊นŒ? ์Œ... ์žฌ๋Šฅ๋„ท์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„์„œ ๊ฐ„๋‹จํ•œ ์žฌ๋Šฅ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฑด ์–ด๋•Œ? ๐ŸŽจ๐ŸŽธ๐Ÿ‹๏ธโ€โ™€๏ธ

๋จผ์ € src ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— index.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค˜. ์ด ํŒŒ์ผ์ด ์šฐ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‹œ์ž‘์ ์ด ๋  ๊ฑฐ์•ผ.

๊ทธ๋ฆฌ๊ณ  talent.ts์™€ talentManager.ts ํŒŒ์ผ๋„ ๋งŒ๋“ค์–ด์ค˜. ์ด ํŒŒ์ผ๋“ค์— ์šฐ๋ฆฌ์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ๋‹ด์„ ๊ฑฐ์•ผ.

1. talent.ts

์ด ํŒŒ์ผ์—๋Š” ์žฌ๋Šฅ์„ ํ‘œํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๊ฑฐ์•ผ:

// talent.ts

export interface ITalent {
  id: number;
  name: string;
  category: string;
  description: string;
}

export class Talent implements ITalent {
  constructor(
    public id: number,
    public name: string,
    public category: string,
    public description: string
  ) {}

  toString(): string {
    return `Talent: ${this.name} (${this.category})`;
  }
}

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์žฌ๋Šฅ์„ ํ‘œํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์–ด. ๊ฐ ์žฌ๋Šฅ์€ ๊ณ ์œ ํ•œ ID, ์ด๋ฆ„, ์นดํ…Œ๊ณ ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์„ค๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€.

2. talentManager.ts

์ด์ œ ์žฌ๋Šฅ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋งค๋‹ˆ์ € ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์•ผ:

// talentManager.ts

import { Talent, ITalent } from './talent';

export class TalentManager {
  private talents: Talent[] = [];

  addTalent(talent: ITalent): void {
    const newTalent = new Talent(talent.id, talent.name, talent.category, talent.description);
    this.talents.push(newTalent);
  }

  getTalent(id: number): Talent | undefined {
    return this.talents.find(talent => talent.id === id);
  }

  getAllTalents(): Talent[] {
    return this.talents;
  }

  updateTalent(id: number, updatedTalent: Partial<italent>): void {
    const talent = this.getTalent(id);
    if (talent) {
      Object.assign(talent, updatedTalent);
    }
  }

  deleteTalent(id: number): void {
    const index = this.talents.findIndex(talent => talent.id === id);
    if (index !== -1) {
      this.talents.splice(index, 1);
    }
  }

  searchTalents(keyword: string): Talent[] {
    return this.talents.filter(talent =>
      talent.name.toLowerCase().includes(keyword.toLowerCase()) ||
      talent.category.toLowerCase().includes(keyword.toLowerCase()) ||
      talent.description.toLowerCase().includes(keyword.toLowerCase())
    );
  }
}
</italent>

์šฐ์™€, ์ฝ”๋“œ๊ฐ€ ์ข€ ๊ธธ์ง€? ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • addTalent: ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด.
  • getTalent: ID๋กœ ํŠน์ • ์žฌ๋Šฅ์„ ์ฐพ์•„์ค˜.
  • getAllTalents: ๋ชจ๋“  ์žฌ๋Šฅ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ด.
  • updateTalent: ๊ธฐ์กด ์žฌ๋Šฅ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•ด.
  • deleteTalent: ์žฌ๋Šฅ์„ ์‚ญ์ œํ•ด.
  • searchTalents: ํ‚ค์›Œ๋“œ๋กœ ์žฌ๋Šฅ์„ ๊ฒ€์ƒ‰ํ•ด.

์ด TalentManager ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿ˜‰

3. index.ts

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ง„์ž…์ ์ธ index.ts ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด๋ณผ๊ฒŒ:

// index.ts

export { Talent, ITalent } from './talent';
export { TalentManager } from './talentManager';

// ์‚ฌ์šฉ ์˜ˆ์‹œ
import { TalentManager, Talent } from './index';

const manager = new TalentManager();

manager.addTalent({
  id: 1,
  name: "์›น ๊ฐœ๋ฐœ",
  category: "ํ”„๋กœ๊ทธ๋ž˜๋ฐ",
  description: "HTML, CSS, JavaScript๋ฅผ ์ด์šฉํ•œ ์›น์‚ฌ์ดํŠธ ์ œ์ž‘"
});

manager.addTalent({
  id: 2,
  name: "์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ด์…˜",
  category: "๋””์ž์ธ",
  description: "๋””์ง€ํ„ธ ์•„ํŠธ์™€ ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ด์…˜ ์ž‘์—…"
});

console.log(manager.getAllTalents());
console.log(manager.searchTalents("์›น"));

// ์ถœ๋ ฅ:
// [Talent: ์›น ๊ฐœ๋ฐœ (ํ”„๋กœ๊ทธ๋ž˜๋ฐ), Talent: ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ด์…˜ (๋””์ž์ธ)]
// [Talent: ์›น ๊ฐœ๋ฐœ (ํ”„๋กœ๊ทธ๋ž˜๋ฐ)]

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

๐ŸŒŸ ์žฌ๋Šฅ๋„ท ์—ฐ๊ฒฐ๊ณ ๋ฆฌ: ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์žฌ๋Šฅ๋„ท์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ๋งŒ๋“ค์–ด์กŒ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ž–์•„? ์šฐ๋ฆฌ์˜ TalentManager๋„ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ, ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ์•ผ. ์ด๋Ÿฐ ์‹์œผ๋กœ ์‹ค์ œ ์„œ๋น„์Šค์˜ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งŒ๋“ค๋ฉด, ๋” ์‹ค์šฉ์ ์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด!

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์™„์„ฑ๋์–ด! ์–ด๋•Œ, ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ง€? ์ด์ œ ์ด ์ฝ”๋“œ๋ฅผ Rollup์œผ๋กœ ๋ฒˆ๋“ค๋งํ•ด๋ณผ ์ฐจ๋ก€์•ผ. ๋‹ค์Œ ์„น์…˜์—์„œ ๊ณ„์†ํ•ด๋ณด์ž๊ณ ! ๐Ÿš€

๐ŸŽญ Rollup์œผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๊ธฐ

๋“œ๋””์–ด ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋˜ ์ˆœ๊ฐ„์ด ์™”์–ด! ์ง€๊ธˆ๋ถ€ํ„ฐ Rollup์„ ์‚ฌ์šฉํ•ด์„œ ์šฐ๋ฆฌ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ฉ‹์ง„ ๋ฒˆ๋“ค๋กœ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋์–ด? ๊ฐ€์ฆˆ์•„~! ๐Ÿš€

1. ๋ฒˆ๋“ค๋ง ์‹คํ–‰ํ•˜๊ธฐ

ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ด:

npm run build

์šฐ๋ฆฌ๊ฐ€ ์•„๊นŒ package.json์— ์ถ”๊ฐ€ํ•œ build ์Šคํฌ๋ฆฝํŠธ ๊ธฐ์–ต๋‚˜์ง€? ์ด ๋ช…๋ น์–ด๊ฐ€ Rollup์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋ฅผ ๋ฒˆ๋“ค๋งํ•  ๊ฑฐ์•ผ.

์ž ๊น! ๐Ÿคš ํ˜น์‹œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์–ด? ๊ฑฑ์ • ๋งˆ, ํ”ํžˆ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค์ด์•ผ. ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž:

๐Ÿšจ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  • Cannot find module 'typescript': TypeScript๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๋ฐœ์ƒํ•ด. npm install typescript --save-dev ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•ด์ค˜.
  • Could not resolve './talent': ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋์„ ๋•Œ ๋‚˜ํƒ€๋‚˜. ํŒŒ์ผ ์ด๋ฆ„๊ณผ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด๋ด.
  • Unexpected token: ๋ฌธ๋ฒ• ์˜ค๋ฅ˜์•ผ. ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฒ€ํ† ํ•ด๋ด.

์—๋Ÿฌ ์—†์ด ์ž˜ ์‹คํ–‰๋๋‹ค๋ฉด, dist ํด๋”์— bundle.js ํŒŒ์ผ์ด ์ƒ์„ฑ๋์„ ๊ฑฐ์•ผ. ์ถ•ํ•˜ํ•ด! ๐ŸŽ‰ ๋„ค๊ฐ€ ๋งŒ๋“  ์ฒซ ๋ฒˆ์งธ ๋ฒˆ๋“ค์ด์•ผ!

2. ๋ฒˆ๋“ค ํ™•์ธํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ฒˆ๋“ค์„ ํ•œ๋ฒˆ ์—ด์–ด๋ณผ๊นŒ? dist/bundle.js ํŒŒ์ผ์„ ์—ด์–ด๋ด. ๋ญ”๊ฐ€ ๋ณต์žกํ•ด ๋ณด์ด์ง€? ๊ฑฑ์ • ๋งˆ, ์ด๊ฒŒ ์ •์ƒ์ด์•ผ. Rollup์ด ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์ณ๋†“์€ ๊ฑฐ๊ฑฐ๋“ .

๋ฒˆ๋“ค์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์„ ๋ณด๋ฉด ๋Œ€์ถฉ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์„ ๊ฑฐ์•ผ:

'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

class Talent {
    constructor(id, name, category, description) {
        this.id = id;
        this.name = name;
        this.category = category;
        this.description = description;
    }
    toString() {
        return `Talent: ${this.name} (${this.category})`;
    }
}

class TalentManager {
    constructor() {
        this.talents = [];
    }
    // ... (๋‚˜๋จธ์ง€ ๋ฉ”์„œ๋“œ๋“ค)
}

exports.Talent = Talent;
exports.TalentManager = TalentManager;

๋ณด์ด์ง€? ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค๋“ค์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ชจ์—ฌ์žˆ์–ด. ๊ทธ๋ฆฌ๊ณ  ๋งจ ์•„๋ž˜์—์„œ ์ด ํด๋ž˜์Šค๋“ค์„ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ์‹œํ‚ค๊ณ  ์žˆ์ง€.

3. ๋ฒˆ๋“ค ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ฒˆ๋“ค์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณผ ์ฐจ๋ก€์•ผ. ์ƒˆ๋กœ์šด JavaScript ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  (์˜ˆ: test.js) ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋ด:

const { TalentManager, Talent } = require('./dist/bundle.js');

const manager = new TalentManager();

manager.addTalent({
  id: 1,
  name: "ํ”„๋กœ๊ทธ๋ž˜๋ฐ",
  category: "IT",
  description: "๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐœ๋ฐœ"
});

manager.addTalent({
  id: 2,
  name: "๊ทธ๋ž˜ํ”ฝ ๋””์ž์ธ",
  category: "๋””์ž์ธ",
  description: "๋กœ๊ณ , ํฌ์Šคํ„ฐ ๋“ฑ ๊ทธ๋ž˜ํ”ฝ ๋””์ž์ธ ์ž‘์—…"
});

console.log(manager.getAllTalents());
console.log(manager.searchTalents("ํ”„๋กœ๊ทธ๋ž˜๋ฐ"));

์ด ํŒŒ์ผ์„ Node.js๋กœ ์‹คํ–‰ํ•ด๋ด:

node test.js

์™€! ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์–ด! ๐ŸŽ‰

๐Ÿ’ก ์žฌ๋Šฅ๋„ท ํ™œ์šฉ ํŒ: ์ด๋Ÿฐ ์‹์œผ๋กœ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์ •๋ง ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ด€๋ฆฌ, ๊ฑฐ๋ž˜ ์‹œ์Šคํ…œ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งŒ๋“ค๋ฉด, ์ „์ฒด ์‹œ์Šคํ…œ์„ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์ง€. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์žฌ๋Šฅ๋„ท์—์„œ ๊ณต์œ ํ•˜๋ฉด, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋  ๊ฑฐ์•ผ!

4. ๋ฒˆ๋“ค ์ตœ์ ํ™”ํ•˜๊ธฐ

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ฒˆ๋“ค์ด ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฑด ํ™•์ธํ–ˆ์–ด. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ๊ฐœ์„ ์˜ ์—ฌ์ง€๋Š” ์žˆ์ง€! Rollup์—๋Š” ๋ฒˆ๋“ค์„ ๋” ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์˜ต์…˜๋“ค์ด ์žˆ์–ด. ๋ช‡ ๊ฐ€์ง€ ์‚ดํŽด๋ณผ๊นŒ?

  • ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree Shaking): ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์ค˜. Rollup์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ด.
  • ์ฝ”๋“œ ์••์ถ•: ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋” ์ค„์ด๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์–ด. rollup-plugin-terser ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ.
  • ์†Œ์Šค๋งต ์ƒ์„ฑ: ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์†Œ์Šค๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด. Rollup ์„ค์ •์— sourcemap: true ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ผ.

์ด๋Ÿฐ ์ตœ์ ํ™” ์˜ต์…˜๋“ค์„ ์ ์šฉํ•˜๋ ค๋ฉด rollup.config.js ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ด. ํ•œ๋ฒˆ ํ•ด๋ณผ๊นŒ?

import typescript from '@rollup/plugin-typescript';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';

export default {
  input: 'src/index.ts',
  output: {
    file: 'dist/bundle.js',
    format: 'esm',
    sourcemap: true,
  },
  plugins: [
    typescript(),
    resolve(),
    commonjs(),
    terser(),
  ],
};

์ด๋ ‡๊ฒŒ ์„ค์ •์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ npm run build๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ๋” ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์ด ์ƒ์„ฑ๋  ๊ฑฐ์•ผ.

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์™„์„ฑ๋์–ด! ๐ŸŽ‰ Rollup์„ ์‚ฌ์šฉํ•ด์„œ ๋ฉ‹์ง„ ๋ฒˆ๋“ค๋„ ๋งŒ๋“ค์—ˆ๊ณ . ์–ด๋•Œ, ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ง€?

๐ŸŒŸ ๋งˆ๋ฌด๋ฆฌ ๋ฐ ์ถ”๊ฐ€ ํŒ

์šฐ์™€, ์ •๋ง ๋Œ€๋‹จํ•ด! ๐Ÿ‘ ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ , Rollup์œผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๊ณผ์ •์„ ๋ชจ๋‘ ์™„๋ฃŒํ–ˆ์–ด. ์ด์ œ ๋„ค๊ฐ€ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ npm์— ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์ง€.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ํŒ์„ ์ค„๊ฒŒ:

  1. ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„. Jest๋‚˜ Mocha ๊ฐ™์€ ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด.
  2. ๋ฌธ์„œํ™”ํ•˜๊ธฐ: ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋„ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•ด. TypeDoc ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ ์ž๋™์œผ๋กœ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด.
  3. ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜๊ธฐ: Semantic Versioning(SemVer)์„ ์‚ฌ์šฉํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๋“ค์ด ์—…๋ฐ์ดํŠธ์˜ ์˜ํ–ฅ์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด.
  4. CI/CD ๊ตฌ์ถ•ํ•˜๊ธฐ: GitHub Actions๋‚˜ Travis CI ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€์†์  ํ†ตํ•ฉ/๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ๋ฐฐํฌ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์–ด.

๐Ÿ’ก ์žฌ๋Šฅ๋„ท ์—ฐ๊ณ„ ํŒ: ๋„ค๊ฐ€ ๋งŒ๋“  ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์žฌ๋Šฅ๋„ท์—์„œ ํ•˜๋‚˜์˜ "์žฌ๋Šฅ"์œผ๋กœ ๋“ฑ๋กํ•ด๋ณด๋Š” ๊ฑด ์–ด๋•Œ? "ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ" ์ด๋ผ๋Š” ์ œ๋ชฉ์œผ๋กœ ์˜ฌ๋ฆฌ๋ฉด, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋„ค expertise๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๋˜ํ•œ, ์žฌ๋Šฅ๋„ท์˜ ๋‹ค์–‘ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜๋„ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, "๋””์ž์ธ ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ", "์˜จ๋ผ์ธ ๊ฐ•์˜ ์‹œ์Šคํ…œ", "ํ”„๋ฆฌ๋žœ์„œ ์—…๋ฌด ๊ด€๋ฆฌ" ๋“ฑ ์žฌ๋Šฅ๋„ท์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด ์žฌ๋ฐŒ์„ ๊ฑฐ์•ผ!

์ž, ์ด์ œ ์ •๋ง ๋์ด์•ผ! ๋„ˆ๋Š” ์ด์ œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  Rollup์œผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์™„๋ฒฝํ•˜๊ฒŒ ๋งˆ์Šคํ„ฐํ–ˆ์–ด. ์ด ์ง€์‹์„ ๊ฐ€์ง€๊ณ  ๋” ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋“ค์„ ๋งŒ๋“ค์–ด๋ด. ๋„ค๊ฐ€ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์–ธ์  ๊ฐ€ npm์—์„œ ์ˆ˜๋งŽ์€ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋‚ ์ด ์˜ฌ์ง€๋„ ๋ชฐ๋ผ! ๐Ÿ˜‰

์ฝ”๋”ฉ์˜ ์„ธ๊ณ„๋Š” ์ •๋ง ๋„“๊ณ  ๊นŠ์–ด. ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ๋„์ „ํ•ด๋‚˜๊ฐ€๊ธธ ๋ฐ”๋ผ. ํ™”์ดํŒ…! ๐Ÿš€