๐ Rollup์ผ๋ก ํ์ ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ๋ค๋งํ๊ธฐ ๐

์๋ , ์น๊ตฌ๋ค! ์ค๋์ ์ ๋ง ์ฌ๋ฐ๊ณ ์ ์ฉํ ์ฃผ์ ๋ก ์ฐพ์์์ด. ๋ฐ๋ก Rollup์ ์ด์ฉํด์ ํ์ ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฒ๋ค๋งํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์ผ. ๐ ์ด ๊ธ์ ์ฝ๊ณ ๋๋ฉด ๋ ํ์ ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ์ ๋ฌ์ธ์ด ๋ ๊ฑฐ๋ผ๊ณ !
์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฉ์ง ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ธ์์ ๊ณต๊ฐํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ๊ทธ๋ฅ ๋์ ธ์ฃผ๋ฉด ๋ ๊น? ์๋์ง! ์ฐ๋ฆฌ๋ ๊น๋ํ๊ณ ํจ์จ์ ์ธ ๋ฒ๋ค๋ก ๋ง๋ค์ด์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค์ผ ํด. ์ฌ๊ธฐ์ Rollup์ด ๋ฑ์ฅํ๋ ๊ฑฐ์ง! ๐ฆธโโ๏ธ
๊ทธ๋ผ ์ด์ ๋ถํฐ Rollup์ ์ธ๊ณ๋ก ๋น ์ ธ๋ณผ๊น? ์ค๋น๋์ด? ์, ์ถ๋ฐ~! ๐๐จ
๐ค Rollup์ด ๋ญ๊ธธ๋?
Rollup? ๋กค์ ? ๋ญ๊ฐ ๋ง์๋ ๊ณผ์ ์ด๋ฆ ๊ฐ์ง ์์? ๐ ํ์ง๋ง ์ฌ๊ธฐ์ ๋งํ๋ Rollup์ ๋จน๋ ๊ฒ ์๋์ผ. Rollup์ JavaScript ๋ชจ๋ ๋ฒ๋ค๋ฌ์ผ. ๋ญ ์๋ฆฌ๋๊ณ ? ์ฝ๊ฒ ๋งํด์, ์ฌ๋ฌ ๊ฐ์ ์์ ์ฝ๋ ์กฐ๊ฐ๋ค์ ๋ญ์ณ์ ํ๋์ ํฐ ๋ฉ์ด๋ฆฌ๋ก ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ๋ผ๊ณ ๋ณด๋ฉด ๋ผ.
๐ญ Rollup์ ํน์ง:
- ์๊ณ ๊ฐ๋ฒผ์ด ๋ฒ๋ค ์์ฑ ๐
- ํธ๋ฆฌ ์์ดํน ์ง์ (์ ์ฐ๋ ์ฝ๋๋ ์ณ๋ด๋ฒ๋ ค!) ๐ณ
- ES ๋ชจ๋ ์ง์ (์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ๋ง์๊ป ์จ๋ด!) ๐
- ํ๋ฌ๊ทธ์ธ ์์คํ (ํ์ฅ์ฑ ์งฑ์งฑ!) ๐
Rollup์ ํนํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ์์ฃผ ์ ์ฉํด. ์๋๊ณ ? ์๊ณ ํจ์จ์ ์ธ ๋ฒ๋ค์ ๋ง๋ค์ด์ฃผ๋๊น! ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฝ๊ฒ ๊ฐ์ ธ๋ค ์ธ ์ ์๊ฒ ํด์ฃผ๋ ๊ฑฐ์ง.
๊ทธ๋ฐ๋ฐ ๋ง์ด์ผ, ์ฐ๋ฆฌ๋ ๊ทธ๋ฅ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋๋ผ ํ์ ์คํฌ๋ฆฝํธ๋ก ์์ ํ๊ณ ์์์? ๊ฑฑ์ ๋ง! 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์ ๋ฐฐํฌํ๊ฑฐ๋, ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋์ง.
๋ง์ง๋ง์ผ๋ก, ๋ช ๊ฐ์ง ์ถ๊ฐ ํ์ ์ค๊ฒ:
- ํ ์คํธ ์์ฑํ๊ธฐ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ ์ฑ์ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์. Jest๋ Mocha ๊ฐ์ ํ ์คํ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด๋ณผ ์ ์์ด.
- ๋ฌธ์ํํ๊ธฐ: ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ฌธ์๋ฅผ ์์ฑํด. TypeDoc ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋์์ ์๋์ผ๋ก ๋ฌธ์๋ฅผ ์์ฑํ ์ ์์ด.
- ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ: Semantic Versioning(SemVer)์ ์ฌ์ฉํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ ๊ด๋ฆฌํด. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๋ค์ด ์ ๋ฐ์ดํธ์ ์ํฅ์ ์ฝ๊ฒ ํ์ ํ ์ ์์ด.
- CI/CD ๊ตฌ์ถํ๊ธฐ: GitHub Actions๋ Travis CI ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ ์ง์์ ํตํฉ/๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋ ํ์ง์ ์ ์งํ๊ณ ๋ฐฐํฌ ๊ณผ์ ์ ์๋ํํ ์ ์์ด.
๐ก ์ฌ๋ฅ๋ท ์ฐ๊ณ ํ: ๋ค๊ฐ ๋ง๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ๋ฅ๋ท์์ ํ๋์ "์ฌ๋ฅ"์ผ๋ก ๋ฑ๋กํด๋ณด๋ ๊ฑด ์ด๋? "ํ์ ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ" ์ด๋ผ๋ ์ ๋ชฉ์ผ๋ก ์ฌ๋ฆฌ๋ฉด, ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๋ค expertise๋ฅผ ์ด์ฉํ ์ ์์ ๊ฑฐ์ผ. ๋ํ, ์ฌ๋ฅ๋ท์ ๋ค์ํ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํด์ ๋ ๋ค์ํ ์ข ๋ฅ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ณผ ์๋ ์์ด. ์๋ฅผ ๋ค์ด, "๋์์ธ ํ ํ๋ฆฟ ๊ด๋ฆฌ", "์จ๋ผ์ธ ๊ฐ์ ์์คํ ", "ํ๋ฆฌ๋์ ์ ๋ฌด ๊ด๋ฆฌ" ๋ฑ ์ฌ๋ฅ๋ท์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌํํด๋ณด๋ฉด ์ฌ๋ฐ์ ๊ฑฐ์ผ!
์, ์ด์ ์ ๋ง ๋์ด์ผ! ๋๋ ์ด์ ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ Rollup์ผ๋ก ๋ฒ๋ค๋งํ๋ ๋ฐฉ๋ฒ์ ์๋ฒฝํ๊ฒ ๋ง์คํฐํ์ด. ์ด ์ง์์ ๊ฐ์ง๊ณ ๋ ๋ฉ์ง ํ๋ก์ ํธ๋ค์ ๋ง๋ค์ด๋ด. ๋ค๊ฐ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ธ์ ๊ฐ npm์์ ์๋ง์ ๋ค์ด๋ก๋๋ฅผ ๊ธฐ๋กํ๋ ๋ ์ด ์ฌ์ง๋ ๋ชฐ๋ผ! ๐
์ฝ๋ฉ์ ์ธ๊ณ๋ ์ ๋ง ๋๊ณ ๊น์ด. ๊ณ์ํด์ ์๋ก์ด ๊ฒ์ ๋ฐฐ์ฐ๊ณ ๋์ ํด๋๊ฐ๊ธธ ๋ฐ๋ผ. ํ์ดํ ! ๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ