JavaScript ν¨κ³Ό μ ν λ° μ¬μ΄λ μ΄ννΈ μΆμ μ λν μ¬μΈ΅μ μΈ λΆμμ μ 곡νμ¬ μμ μ μ΄κ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ ν리μΌμ΄μ ꡬμΆμ μν μν κ΄λ¦¬ λ° λΉλκΈ° μμ μ λν ν¬κ΄μ μΈ μ΄ν΄λ₯Ό μ 곡ν©λλ€.
JavaScript ν¨κ³Ό μ ν: κ°λ ₯ν μ ν리μΌμ΄μ μ μν μ¬μ΄λ μ΄ννΈ μΆμ λ§μ€ν°νκΈ°
JavaScript κ°λ° μΈκ³μμ κ°λ ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆνλ €λ©΄ μ¬μ΄λ μ΄ννΈλ₯Ό κ΄λ¦¬νλ λ°©λ²μ λν κΉμ μ΄ν΄κ° νμν©λλ€. μ¬μ΄λ μ΄ννΈλ λ³Έμ§μ μΌλ‘ νμ¬ ν¨μμ λ²μλ₯Ό λ²μ΄λ μνλ₯Ό μμ νκ±°λ μΈλΆ νκ²½κ³Ό μνΈ μμ©νλ μμ μ λλ€. μ¬κΈ°μλ μ μ λ³μ μ λ°μ΄νΈλΆν° API νΈμΆμ μ΄λ₯΄κΈ°κΉμ§ λͺ¨λ κ²μ΄ ν¬ν¨λ μ μμ΅λλ€. μ¬μ΄λ μ΄ννΈλ μ€μ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νμνμ§λ§ 볡μ‘μ±μ μΌκΈ°νκ³ μ½λλ₯Ό μΆλ‘ νκΈ° μ΄λ ΅κ² λ§λ€ μλ μμ΅λλ€. μ΄ κΈ°μ¬μμλ ν¨κ³Ό μ νμ κ°λ κ³Ό JavaScript νλ‘μ νΈμμ μ¬μ΄λ μ΄ννΈλ₯Ό ν¨κ³Όμ μΌλ‘ μΆμ νκ³ κ΄λ¦¬νλ λ°©λ²μ μ΄ν΄λ³΄κ³ λ μμΈ‘ κ°λ₯νκ³ ν μ€νΈ κ°λ₯ν μ½λλ₯Ό λ§λλλ€.
JavaScriptμμ μ¬μ΄λ μ΄ννΈ μ΄ν΄
ν¨κ³Ό μ νμ μ΄ν΄λ³΄κΈ° μ μ μ¬μ΄λ μ΄ννΈμ μλ―Έλ₯Ό λͺ νν μ μν΄ λ³΄κ² μ΅λλ€. μ¬μ΄λ μ΄ννΈλ ν¨μ λλ ννμμ΄ λ‘컬 λ²μλ₯Ό λ²μ΄λ μΌλΆ μνλ₯Ό μμ νκ±°λ μΈλΆ μΈκ³μ μνΈ μμ©ν λ λ°μν©λλ€. JavaScriptμμ μΌλ°μ μΈ μ¬μ΄λ μ΄ννΈμ μλ λ€μκ³Ό κ°μ΅λλ€.
- μ μ λ³μ μμ .
- HTTP μμ²νκΈ°(μ: APIμμ λ°μ΄ν° κ°μ Έμ€κΈ°).
- μ½μμ μ°κΈ°(μ:
console.log
μ¬μ©). - DOM(Document Object Model) μ λ°μ΄νΈ.
- νμ΄λ¨Έ μ€μ (μ:
setTimeout
λλsetInterval
μ¬μ©). - μ¬μ©μ μ λ ₯ μ½κΈ°.
- λμ μμ±.
λλΆλΆμ μ ν리μΌμ΄μ μμ μ¬μ΄λ μ΄ννΈλ νΌν μ μμ§λ§ μ μ΄λμ§ μμ μ¬μ΄λ μ΄ννΈλ μμΈ‘ν μ μλ λμ, μ΄λ €μ΄ λλ²κΉ λ° λ³΅μ‘μ± μ¦κ°λ‘ μ΄μ΄μ§ μ μμ΅λλ€. λ°λΌμ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ κ²μ΄ μ€μν©λλ€.
ν¨κ³Ό μ ν μκ°
ν¨κ³Ό μ νμ ν¨μκ° μμ±ν μ μλ μ¬μ΄λ μ΄ννΈμ μ’ λ₯λ₯Ό λΆλ₯νκ³ μΆμ νλ λ°©λ²μ λλ€. ν¨μμ ν¨κ³Ό μ νμ λͺ μμ μΌλ‘ μ μΈνλ©΄ ν¨μκ° μννλ μμ κ³Ό μ ν리μΌμ΄μ μ λλ¨Έμ§ λΆλΆκ³Ό μνΈ μμ©νλ λ°©μμ λ μ½κ² μ΄ν΄ν μ μμ΅λλ€. μ΄ κ°λ μ μ’ μ’ ν¨μν νλ‘κ·Έλλ° ν¨λ¬λ€μκ³Ό κ΄λ ¨λ©λλ€.
λ³Έμ§μ μΌλ‘ ν¨κ³Ό μ νμ ν¨μκ° μΌμΌν¬ μ μλ μ μ¬μ μΈ μ¬μ΄λ μ΄ννΈλ₯Ό μ€λͺ νλ μ£Όμ λλ λ©νλ°μ΄ν°μ κ°μ΅λλ€. μ΄λ ν¨μ λμμ λν΄ κ°λ°μμ μ»΄νμΌλ¬(μ μ μ ν κ²μ¬κ° μλ μΈμ΄λ₯Ό μ¬μ©νλ κ²½μ°) λͺ¨λμκ² μ νΈ μν μ ν©λλ€.
ν¨κ³Ό μ ν μ¬μ©μ μ΄μ
- ν₯μλ μ½λ λͺ νμ±: ν¨κ³Ό μ νμ ν¨μκ° μμ±ν μ μλ μ¬μ΄λ μ΄ννΈλ₯Ό λͺ ννκ² νμ¬ μ½λ κ°λ μ±κ³Ό μ μ§ κ΄λ¦¬μ±μ ν₯μμν΅λλ€.
- ν₯μλ λλ²κΉ : μ μ¬μ μΈ μ¬μ΄λ μ΄ννΈλ₯Ό μλ©΄ λ²κ·Έ λ° μκΈ°μΉ μμ λμμ μμ€λ₯Ό λ μ½κ² μΆμ ν μ μμ΅λλ€.
- ν μ€νΈ μ©μ΄μ± μ¦κ°: μ¬μ΄λ μ΄ννΈκ° λͺ μμ μΌλ‘ μ μΈλλ©΄ ν¨μλ₯Ό 격리νμ¬ λͺ¨μ ν μ€νΈνκ³ ν μ€νΈνκΈ°κ° λ μ¬μμ§λλ€.
- μ»΄νμΌλ¬ μ§μ: μ μ μ ν κ²μ¬κ° μλ μΈμ΄λ ν¨κ³Ό μ νμ μ¬μ©νμ¬ μ μ½ μ‘°κ±΄μ μ μ©νκ³ μ»΄νμΌ μ νΉμ μ’ λ₯μ μ€λ₯λ₯Ό λ°©μ§ν μ μμ΅λλ€.
- λ λμ μ½λ ꡬμ±: ν¨κ³Ό μ νμ μ¬μ΄λ μ΄ννΈλ₯Ό μ΅μννκ³ λͺ¨λμ±μ μ΄μ§νλ λ°©μμΌλ‘ μ½λλ₯Ό ꡬμ±νλ λ° λμμ΄ λ μ μμ΅λλ€.
JavaScriptμμ ν¨κ³Ό μ ν ꡬν
JavaScriptλ λμ μΌλ‘ μ νμ΄ μ§μ λ μΈμ΄μ΄λ―λ‘ Haskell λλ Elmκ³Ό κ°μ μ μ μΌλ‘ μ νμ΄ μ§μ λ μΈμ΄μ λμΌν λ°©μμΌλ‘ ν¨κ³Ό μ νμ κΈ°λ³Έμ μΌλ‘ μ§μνμ§ μμ΅λλ€. κ·Έλ¬λ λ€μν κΈ°μ κ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ ν¨κ³Ό μ νμ ꡬνν μ μμ΅λλ€.
1. λ¬Έμν λ° κ·μΉ
κ°μ₯ κ°λ¨ν λ°©λ²μ λ¬Έμν λ° λͺ λͺ κ·μΉμ μ¬μ©νμ¬ ν¨μμ ν¨κ³Ό μ νμ λνλ΄λ κ²μ λλ€. μλ₯Ό λ€μ΄ JSDoc μ£Όμμ μ¬μ©νμ¬ ν¨μκ° μμ±ν μ μλ μ¬μ΄λ μ΄ννΈλ₯Ό μ€λͺ ν μ μμ΅λλ€.
/**
* API μλν¬μΈνΈμμ λ°μ΄ν°λ₯Ό κ°μ Έμ΅λλ€.
*
* @effect HTTP - HTTP μμ²μ ν©λλ€.
* @effect Console - μ½μμ μλλ€.
*
* @param {string} url - λ°μ΄ν°λ₯Ό κ°μ Έμ¬ URLμ
λλ€.
* @returns {Promise} - λ°μ΄ν°λ‘ νμΈλλ νλ‘λ―Έμ€μ
λλ€.
*/
async function fetchData(url) {
console.log(`Fetching data from ${url}...`);
const response = await fetch(url);
const data = await response.json();
return data;
}
μ΄ λ°©λ²μ κ°λ°μμ κ·μ¨μ μμ‘΄νμ§λ§ μ½λμμ μ¬μ΄λ μ΄ννΈλ₯Ό μ΄ν΄νκ³ λ¬Έμννλ λ° μ μ©ν μμμ μ΄ λ μ μμ΅λλ€.
2. μ μ μ ν μ§μ μ μν TypeScript μ¬μ©
JavaScriptμ μμ μ§ν©μΈ TypeScriptλ μΈμ΄μ μ μ μ ν μ§μ μ μΆκ°ν©λλ€. TypeScriptλ ν¨κ³Ό μ νμ λν λͺ μμ μΈ μ§μμ΄ μμ§λ§ ν΄λΉ μ ν μμ€ν μ μ¬μ©νμ¬ μ¬μ΄λ μ΄ννΈλ₯Ό λͺ¨λΈλ§νκ³ μΆμ ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄ ν¨μκ° μμ±ν μ μλ κ°λ₯ν μ¬μ΄λ μ΄ννΈλ₯Ό λνλ΄λ μ νμ μ μν μ μμ΅λλ€.
type Effect = "HTTP" | "Console" | "DOM";
type Effectful = {
value: T;
effects: E[];
};
async function fetchData(url: string): Promise> {
console.log(`Fetching data from ${url}...`);
const response = await fetch(url);
const data = await response.json();
return { value: data, effects: ["HTTP", "Console"] };
}
μ΄ λ°©λ²μ μ¬μ©νλ©΄ μ»΄νμΌ μ ν¨μμ μ μ¬μ μΈ μ¬μ΄λ μ΄ννΈλ₯Ό μΆμ νμ¬ μ€λ₯λ₯Ό μ‘°κΈ°μ λ°κ²¬νλ λ° λμμ΄ λ©λλ€.
3. ν¨μν νλ‘κ·Έλλ° λΌμ΄λΈλ¬λ¦¬
fp-ts
λ° Ramda
μ κ°μ ν¨μν νλ‘κ·Έλλ° λΌμ΄λΈλ¬λ¦¬λ μ¬μ΄λ μ΄ννΈλ₯Ό λ³΄λ€ μ μ΄λκ³ μμΈ‘ κ°λ₯ν λ°©μμΌλ‘ κ΄λ¦¬νκΈ° μν λꡬ λ° μΆμνλ₯Ό μ 곡ν©λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μ’
μ’
λͺ¨λλ λ° νν°μ κ°μ κ°λ
μ μ¬μ©νμ¬ μ¬μ΄λ μ΄ννΈλ₯Ό μΊ‘μννκ³ κ΅¬μ±ν©λλ€.
μλ₯Ό λ€μ΄ fp-ts
μ IO
λͺ¨λλλ₯Ό μ¬μ©νμ¬ μ¬μ΄λ μ΄ννΈκ° μμ μ μλ κ³μ°μ λνλΌ μ μμ΅λλ€.
import { IO } from 'fp-ts/IO'
const logMessage = (message: string): IO => new IO(() => console.log(message))
const program: IO = logMessage('Hello, world!')
program.run()
IO
λͺ¨λλλ₯Ό μ¬μ©νλ©΄ run
λ©μλλ₯Ό λͺ
μμ μΌλ‘ νΈμΆν λκΉμ§ μ¬μ΄λ μ΄ννΈ μ€νμ μ§μ°ν μ μμ΅λλ€. μ΄λ λ³΄λ€ μ μ΄λ λ°©μμΌλ‘ μ¬μ΄λ μ΄ννΈλ₯Ό ν
μ€νΈνκ³ κ΅¬μ±νλ λ° μ μ©ν μ μμ΅λλ€.
4. RxJSλ₯Ό μ¬μ©ν λ°μν νλ‘κ·Έλλ°
RxJSμ κ°μ λ°μν νλ‘κ·Έλλ° λΌμ΄λΈλ¬λ¦¬λ λΉλκΈ° λ°μ΄ν° μ€νΈλ¦Ό λ° μ¬μ΄λ μ΄ννΈλ₯Ό κ΄λ¦¬νκΈ° μν κ°λ ₯ν λꡬλ₯Ό μ 곡ν©λλ€. RxJSλ μ΅μ λ²λΈμ μ¬μ©νμ¬ λ°μ΄ν° μ€νΈλ¦Όμ λνλ΄κ³ μ°μ°μλ₯Ό μ¬μ©νμ¬ ν΄λΉ μ€νΈλ¦Όμ λ³ννκ³ κ²°ν©ν©λλ€.
RxJSλ₯Ό μ¬μ©νμ¬ μ΅μ λ²λΈ λ΄μμ μ¬μ΄λ μ΄ννΈλ₯Ό μΊ‘μννκ³ μ μΈμ λ°©μμΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ ajax
μ°μ°μλ₯Ό μ¬μ©νμ¬ HTTP μμ²μ νκ³ μλ΅μ μ²λ¦¬ν μ μμ΅λλ€.
import { ajax } from 'rxjs/ajax';
const data$ = ajax('/api/data');
data$.subscribe(
data => console.log('data: ', data),
error => console.error('error: ', error)
);
RxJSλ μ€λ₯, μ¬μλ λ° κΈ°ν μΌλ°μ μΈ μ¬μ΄λ μ΄ννΈ μλ리μ€λ₯Ό μ²λ¦¬νκΈ° μν λ€μν μ°μ°μλ₯Ό μ 곡ν©λλ€.
μ¬μ΄λ μ΄ννΈ κ΄λ¦¬ μ λ΅
ν¨κ³Ό μ νμ μ¬μ©νλ κ² μΈμλ JavaScript μ ν리μΌμ΄μ μμ μ¬μ΄λ μ΄ννΈλ₯Ό κ΄λ¦¬νκΈ° μν΄ μ¬μ©ν μ μλ λͺ κ°μ§ μΌλ°μ μΈ μ λ΅μ΄ μμ΅λλ€.
1. 격리
κ°λ₯ν ν μ¬μ΄λ μ΄ννΈλ₯Ό 격리ν©λλ€. μ¦, μ¬μ΄λ μ΄ννΈλ₯Ό μμ±νλ μ½λλ₯Ό μμ ν¨μ(λμΌν μ λ ₯μ λν΄ νμ λμΌν μΆλ ₯μ λ°ννκ³ μ¬μ΄λ μ΄ννΈκ° μλ ν¨μ)μ λΆλ¦¬ν©λλ€. μ¬μ΄λ μ΄ννΈλ₯Ό 격리νλ©΄ μ½λλ₯Ό λ μ½κ² ν μ€νΈνκ³ μΆλ‘ ν μ μμ΅λλ€.
2. μ’ μμ± μ£Όμ
μ’
μμ± μ£Όμ
μ μ¬μ©νμ¬ μ¬μ΄λ μ΄ννΈλ₯Ό λ μ½κ² ν
μ€νΈν μ μλλ‘ ν©λλ€. μ¬μ΄λ μ΄ννΈλ₯Ό μ λ°νλ νλ μ½λ©λ μ’
μμ±(μ: window
, document
λλ λ°μ΄ν°λ² μ΄μ€ μ°κ²°) λμ ν¨μ λλ κ΅¬μ± μμμ μΈμλ‘ μ λ¬ν©λλ€. μ΄λ₯Ό ν΅ν΄ ν
μ€νΈμμ ν΄λΉ μ’
μμ±μ λͺ¨μνν μ μμ΅λλ€.
function updateTitle(newTitle, dom) {
dom.title = newTitle;
}
// μ¬μ©λ²:
updateTitle('My New Title', document);
// ν
μ€νΈμμ:
const mockDocument = { title: '' };
updateTitle('My New Title', mockDocument);
expect(mockDocument.title).toBe('My New Title');
3. λΆλ³μ±
λΆλ³μ±μ μμ©ν©λλ€. κΈ°μ‘΄ λ°μ΄ν° ꡬ쑰λ₯Ό μμ νλ λμ μνλ λ³κ²½ μ¬νμ΄ μλ μ λ°μ΄ν° ꡬ쑰λ₯Ό λ§λλλ€. μ΄λ μκΈ°μΉ μμ μ¬μ΄λ μ΄ννΈλ₯Ό λ°©μ§νκ³ μ ν리μΌμ΄μ μνλ₯Ό λ μ½κ² μΆλ‘ νλ λ° λμμ΄ λ μ μμ΅λλ€. Immutable.jsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό μ¬μ©νλ λ° λμμ΄ λ μ μμ΅λλ€.
4. μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬
Redux, Vuex λλ Zustandμ κ°μ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ μνλ₯Ό μ€μ μ§μ€μμ΄κ³ μμΈ‘ κ°λ₯ν λ°©μμΌλ‘ κ΄λ¦¬ν©λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μΌλ°μ μΌλ‘ μν λ³κ²½μ μΆμ νκ³ μ¬μ΄λ μ΄ννΈλ₯Ό κ΄λ¦¬νλ λ©μ»€λμ¦μ μ 곡ν©λλ€.
μλ₯Ό λ€μ΄ Reduxλ 리λμλ₯Ό μ¬μ©νμ¬ μ‘μ μ λν μλ΅μΌλ‘ μ ν리μΌμ΄μ μνλ₯Ό μ λ°μ΄νΈν©λλ€. 리λμλ μ΄μ μνμ μ‘μ μ μ λ ₯μΌλ‘ λ°μ μ μνλ₯Ό λ°ννλ μμ ν¨μμ λλ€. μ¬μ΄λ μ΄ννΈλ μΌλ°μ μΌλ‘ μ‘μ μ κ°λ‘μ±κ³ λΉλκΈ° μμ λλ κΈ°ν μ¬μ΄λ μ΄ννΈλ₯Ό μνν μ μλ λ―Έλ€μ¨μ΄μμ μ²λ¦¬λ©λλ€.
5. μ€λ₯ μ²λ¦¬
μκΈ°μΉ μμ μ¬μ΄λ μ΄ννΈλ₯Ό μ μμ μΌλ‘ μ²λ¦¬νκΈ° μν΄ κ°λ ₯ν μ€λ₯ μ²λ¦¬λ₯Ό ꡬνν©λλ€. try...catch
λΈλ‘μ μ¬μ©νμ¬ μμΈλ₯Ό ν¬μ°©νκ³ μ¬μ©μμκ² μλ―Έ μλ μ€λ₯ λ©μμ§λ₯Ό μ 곡ν©λλ€. Sentryμ κ°μ μ€λ₯ μΆμ μλΉμ€λ₯Ό μ¬μ©νμ¬ νλ‘λμ
μμ μ€λ₯λ₯Ό λͺ¨λν°λ§νκ³ κΈ°λ‘νλ κ²μ κ³ λ €νμμμ€.
6. λ‘κΉ λ° λͺ¨λν°λ§
λ‘κΉ λ° λͺ¨λν°λ§μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ λμμ μΆμ νκ³ μ μ¬μ μΈ μ¬μ΄λ μ΄ννΈ λ¬Έμ λ₯Ό μλ³ν©λλ€. μ ν리μΌμ΄μ μ΄ μ΄λ»κ² μλνλμ§ μ΄ν΄νκ³ λ°μνλ λ¬Έμ λ₯Ό λλ²κΉ νλ λ° λμμ΄ λλλ‘ μ€μν μ΄λ²€νΈμ μν λ³κ²½μ κΈ°λ‘ν©λλ€. Google Analytics λλ μ¬μ©μ μ§μ λ‘κΉ μ루μ κ³Ό κ°μ λκ΅¬κ° μ μ©ν μ μμ΅λλ€.
μ€μ μ
λ€μν μλ리μ€μμ ν¨κ³Ό μ ν λ° μ¬μ΄λ μ΄ννΈ κ΄λ¦¬ μ λ΅μ μ μ©νλ λ°©λ²μ λν μ€μ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
1. API νΈμΆμ΄ μλ React κ΅¬μ± μμ
import React, { useState, useEffect } from 'react';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchUser() {
try {
const response = await fetch(`/api/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
}
fetchUser();
}, [userId]);
if (loading) {
return Loading...
;
}
if (error) {
return Error: {error.message}
;
}
return (
{user.name}
Email: {user.email}
);
}
export default UserProfile;
μ΄ μμμ UserProfile
κ΅¬μ± μμλ API νΈμΆμ νμ¬ μ¬μ©μ λ°μ΄ν°λ₯Ό κ°μ Έμ΅λλ€. μ¬μ΄λ μ΄ννΈλ useEffect
νν¬ λ΄μ μΊ‘μνλ©λλ€. μ€λ₯ μ²λ¦¬λ try...catch
λΈλ‘μ μ¬μ©νμ¬ κ΅¬νλ©λλ€. λ‘λ© μνλ useState
λ₯Ό μ¬μ©νμ¬ μ¬μ©μμκ² νΌλλ°±μ μ 곡νλλ‘ κ΄λ¦¬λ©λλ€.
2. λ°μ΄ν°λ² μ΄μ€ μνΈ μμ©μ΄ μλ Node.js μλ²
const express = require('express');
const mongoose = require('mongoose');
const app = express();
const port = 3000;
mongoose.connect('mongodb://localhost:27017/mydatabase', {
useNewUrlParser: true,
useUnifiedTopology: true
});
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log('Connected to MongoDB');
});
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);
app.get('/users', async (req, res) => {
try {
const users = await User.find({});
res.json(users);
} catch (err) {
console.error(err);
res.status(500).send('Server error');
}
});
app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`);
});
μ΄ μλ MongoDB λ°μ΄ν°λ² μ΄μ€μ μνΈ μμ©νλ Node.js μλ²λ₯Ό 보μ¬μ€λλ€. μ¬μ΄λ μ΄ννΈμλ λ°μ΄ν°λ² μ΄μ€ μ°κ²°, λ°μ΄ν°λ² μ΄μ€ 쿼리 λ° ν΄λΌμ΄μΈνΈμ μλ΅ λ³΄λ΄κΈ°κ° ν¬ν¨λ©λλ€. μ€λ₯ μ²λ¦¬λ try...catch
λΈλ‘μ μ¬μ©νμ¬ κ΅¬νλ©λλ€. λ‘κΉ
μ λ°μ΄ν°λ² μ΄μ€ μ°κ²° λ° μλ² μμμ λͺ¨λν°λ§νλ λ° μ¬μ©λ©λλ€.
3. λ‘컬 μ€ν 리μ§κ° μλ λΈλΌμ°μ νμ₯
// background.js
chrome.runtime.onInstalled.addListener(() => {
chrome.storage.sync.set({ color: '#3aa757' }, () => {
console.log('Default background color set to #3aa757');
});
});
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
function: setPageBackgroundColor
});
});
function setPageBackgroundColor() {
chrome.storage.sync.get('color', ({ color }) => {
document.body.style.backgroundColor = color;
});
}
μ΄ μλ μΉ νμ΄μ§μ λ°°κ²½μμ λ³κ²½νλ κ°λ¨ν λΈλΌμ°μ νμ₯μ 보μ¬μ€λλ€. μ¬μ΄λ μ΄ννΈμλ λΈλΌμ°μ μ μ€ν λ¦¬μ§ API(chrome.storage
)μ μνΈ μμ©νκ³ DOM(document.body.style.backgroundColor
)μ μμ νλ κ²μ΄ ν¬ν¨λ©λλ€. λ°±κ·ΈλΌμ΄λ μ€ν¬λ¦½νΈλ νμ₯μ΄ μ€μΉλκΈ°λ₯Ό μμ νκ³ λ‘컬 μ€ν 리μ§μ κΈ°λ³Έ μμμ μ€μ ν©λλ€. νμ₯μ μμ΄μ½μ ν΄λ¦νλ©΄ λ‘컬 μ€ν 리μ§μμ μμμ μ½κ³ νμ¬ νμ΄μ§μ μ μ©νλ μ€ν¬λ¦½νΈλ₯Ό μ€νν©λλ€.
κ²°λ‘
ν¨κ³Ό μ ν λ° μ¬μ΄λ μ΄ννΈ μΆμ μ κ°λ ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν JavaScript μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νμμ μΈ κ°λ μ λλ€. μ¬μ΄λ μ΄ννΈκ° 무μμΈμ§, μ΄λ₯Ό λΆλ₯νλ λ°©λ² λ° ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ λ°©λ²μ μ΄ν΄ν¨μΌλ‘μ¨ ν μ€νΈ, λλ²κΉ λ° μΆλ‘ μ΄ λ μ¬μ΄ μ½λλ₯Ό μμ±ν μ μμ΅λλ€. JavaScriptλ ν¨κ³Ό μ νμ κΈ°λ³Έμ μΌλ‘ μ§μνμ§ μμ§λ§ λ¬Έμν, TypeScript, ν¨μν νλ‘κ·Έλλ° λΌμ΄λΈλ¬λ¦¬ λ° λ°μν νλ‘κ·Έλλ° λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¬ν¨νμ¬ λ€μν κΈ°μ κ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ κ΅¬νν μ μμ΅λλ€. 격리, μ’ μμ± μ£Όμ , λΆλ³μ± λ° μν κ΄λ¦¬μ κ°μ μ λ΅μ μ±ννλ©΄ μ¬μ΄λ μ΄ννΈλ₯Ό μ μ΄νκ³ κ³ νμ§ μ ν리μΌμ΄μ μ ꡬμΆνλ λ₯λ ₯μ λμ± ν₯μμν¬ μ μμ΅λλ€.
JavaScript κ°λ°μλ‘μμ μ¬μ μ κ³μνλ©΄μ μ¬μ΄λ μ΄ννΈ κ΄λ¦¬λ₯Ό λ§μ€ν°νλ κ²μ 볡μ‘νκ³ μμ μ μΈ μμ€ν μ ꡬμΆν μ μλλ‘ μ§μνλ ν΅μ¬ κΈ°μ μμ κΈ°μ΅νμμμ€. μ΄λ¬ν μμΉκ³Ό κΈ°μ μ μμ©ν¨μΌλ‘μ¨ κΈ°λ₯μ μΌ λΏλ§ μλλΌ μ μ§ κ΄λ¦¬ κ°λ₯νκ³ νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€.
μΆκ° νμ΅
- JavaScriptμ ν¨μν νλ‘κ·Έλλ°: ν¨μν νλ‘κ·Έλλ° κ°λ κ³Ό JavaScript κ°λ°μ μ μ©λλ λ°©μμ νμν©λλ€.
- RxJSλ₯Ό μ¬μ©ν λ°μν νλ‘κ·Έλλ°: RxJSλ₯Ό μ¬μ©νμ¬ λΉλκΈ° λ°μ΄ν° μ€νΈλ¦Ό λ° μ¬μ΄λ μ΄ννΈλ₯Ό κ΄λ¦¬νλ λ°©λ²μ μμλ΄ λλ€.
- μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬: Redux, Vuex λ° Zustandμ κ°μ λ€μν μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ‘°μ¬ν©λλ€.
- TypeScript μ€λͺ μ: TypeScriptμ μ ν μμ€ν κ³Ό μ΄λ₯Ό μ¬μ©νμ¬ μ¬μ΄λ μ΄ννΈλ₯Ό λͺ¨λΈλ§νκ³ μΆμ νλ λ°©λ²μ μμΈν μμλ΄ λλ€.
- fp-ts λΌμ΄λΈλ¬λ¦¬: TypeScriptμμ ν¨μν νλ‘κ·Έλλ°μ μν fp-ts λΌμ΄λΈλ¬λ¦¬λ₯Ό νμν©λλ€.