μ΅μ μΉ κ°λ°μμ κΈ°λ₯ ν₯μ, μ½λ μ¬μ¬μ© μ΄μ§ λ° μ μ§ κ΄λ¦¬ μ©μ΄μ±μ κ°μ νκΈ° μν κ³ κΈ JavaScript λͺ¨λ λ°μ½λ μ΄ν° ν¨ν΄μ μ΄ν΄λ΄ λλ€.
JavaScript λͺ¨λ λ°μ½λ μ΄ν° ν¨ν΄: λμ κ°μ
λμμμ΄ μ§ννλ JavaScript κ°λ° νκ²½μμ κΉ¨λνκ³ μ μ§ κ΄λ¦¬ κ°λ₯νλ©° μ¬μ¬μ© κ°λ₯ν μ½λλ₯Ό μμ±νλ κ²μ΄ κ°μ₯ μ€μν©λλ€. λͺ¨λ λ°μ½λ μ΄ν° ν¨ν΄μ ν΅μ¬ λ Όλ¦¬λ₯Ό μμ νμ§ μκ³ λ JavaScript λͺ¨λμ λμμ ν₯μμν€λ κ°λ ₯ν κΈ°μ μ μ 곡ν©λλ€. μ΄ μ κ·Ό λ°©μμ κ΄μ¬μ¬ λΆλ¦¬λ₯Ό μ΄μ§νμ¬ μ½λλ₯Ό λμ± μ μ°νκ³ ν μ€νΈ κ°λ₯νλ©° μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
λͺ¨λ λ°μ½λ μ΄ν°λ 무μμ λκΉ?
λͺ¨λ λ°μ½λ μ΄ν°λ λͺ¨λ(μΌλ°μ μΌλ‘ ν¨μ λλ ν΄λμ€)μ μ λ ₯μΌλ‘ λ°μ ν΄λΉ λͺ¨λμ μμ λ λ²μ μ λ°ννλ ν¨μμ λλ€. λ°μ½λ μ΄ν°λ μλ³Έ μμ€ μ½λλ₯Ό μ§μ λ³κ²½νμ§ μκ³ μλ³Έ λͺ¨λμ λμμ μΆκ°νκ±°λ μμ ν©λλ€. μ΄λ μννΈμ¨μ΄ μν°ν°(ν΄λμ€, λͺ¨λ, ν¨μ λ±)λ νμ₯μ λν΄ μ΄λ € μμ΄μΌ νμ§λ§ μμ μ λν΄μλ λ«ν μμ΄μΌ ν¨μ λͺ μνλ κ°λ°©/νμ μμΉμ μ€μν©λλ€.
νΌμμ ν νμ μΆκ°νλ κ²κ³Ό κ°λ€κ³ μκ°νμμμ€. κΈ°λ³Έ νΌμ(μλ³Έ λͺ¨λ)λ κ·Έλλ‘ μ μ§λμ§λ§ μΆκ°μ μΈ νλ―Έμ κΈ°λ₯(λ°μ½λ μ΄ν°μ μΆκ° μ¬ν)μΌλ‘ ν₯μλμμ΅λλ€.
λͺ¨λ λ°μ½λ μ΄ν° μ¬μ©μ μ΄μ
- ν₯μλ μ½λ μ¬μ¬μ©μ±: λ°μ½λ μ΄ν°λ μ¬λ¬ λͺ¨λμ μ μ©ν μ μμΌλ―λ‘ μ½λλ² μ΄μ€ μ 체μμ λμ ν₯μμ μ¬μ¬μ©ν μ μμ΅λλ€.
- ν₯μλ μ μ§ κ΄λ¦¬μ±: λ°μ½λ μ΄ν°λ κ΄μ¬μ¬λ₯Ό λΆλ¦¬νμ¬ κ°λ³ λͺ¨λκ³Ό ν΄λΉ ν₯μλ κΈ°λ₯μ λ μ½κ² μ΄ν΄νκ³ μμ νκ³ ν μ€νΈν μ μλλ‘ ν©λλ€.
- ν₯μλ μ μ°μ±: λ°μ½λ μ΄ν°λ μλ³Έ λͺ¨λμ μ½λλ₯Ό λ³κ²½νμ§ μκ³ κΈ°λ₯μ μΆκ°νκ±°λ μμ νλ μ μ°ν λ°©λ²μ μ 곡ν©λλ€.
- κ°λ°©/νμ μμΉ μ€μ: λ°μ½λ μ΄ν°λ μμ€ μ½λλ₯Ό μ§μ μμ νμ§ μκ³ λͺ¨λμ κΈ°λ₯μ νμ₯νμ¬ μ μ§ κ΄λ¦¬μ±μ λμ΄κ³ λ²κ·Έ λ°μ μνμ μ€μΌ μ μμ΅λλ€.
- ν₯μλ ν μ€νΈ μ©μ΄μ±: λ°μ½λ μ΄ν° ν¨μλ₯Ό λͺ¨μ(mocking)νκ±°λ μ€ν (stubbing)νμ¬ λ°μ½λ μ΄νΈλ λͺ¨λμ μ½κ² ν μ€νΈν μ μμ΅λλ€.
ν΅μ¬ κ°λ λ° κ΅¬ν
ν΅μ¬μ μΌλ‘ λͺ¨λ λ°μ½λ μ΄ν°λ κ³ μ°¨ ν¨μμ λλ€. ν¨μ(λλ ν΄λμ€)λ₯Ό μΈμλ‘ λ°μ μμ λ μ ν¨μ(λλ ν΄λμ€)λ₯Ό λ°νν©λλ€. ν΅μ¬μ μλ³Έ ν¨μλ₯Ό μ‘°μνκ³ μνλ λμμ μΆκ°νλ λ°©λ²μ μ΄ν΄νλ κ²μ λλ€.
κΈ°λ³Έ λ°μ½λ μ΄ν° μμ (ν¨μ λ°μ½λ μ΄ν°)
ν¨μμ μ€ν μκ°μ κΈ°λ‘νκΈ° μν΄ ν¨μλ₯Ό λ°μ½λ μ΄νΈνλ κ°λ¨ν μμ λΆν° μμνκ² μ΅λλ€.
function timingDecorator(func) {
return function(...args) {
const start = performance.now();
const result = func.apply(this, args);
const end = performance.now();
console.log(`Function ${func.name} took ${end - start}ms`);
return result;
};
}
function myExpensiveFunction(n) {
let result = 0;
for (let i = 0; i < n; i++) {
result += i;
}
return result;
}
const decoratedFunction = timingDecorator(myExpensiveFunction);
console.log(decoratedFunction(100000));
μ΄ μμ μμ timingDecoratorλ λ°μ½λ μ΄ν° ν¨μμ
λλ€. myExpensiveFunctionμ μ
λ ₯μΌλ‘ λ°μ μλ³Έ ν¨μλ₯Ό λννλ μ ν¨μλ₯Ό λ°νν©λλ€. μ΄ μ ν¨μλ μ€ν μκ°μ μΈ‘μ νμ¬ μ½μμ κΈ°λ‘ν©λλ€.
ν΄λμ€ λ°μ½λ μ΄ν° (ES λ°μ½λ μ΄ν° μ μ)
ECMAScript λ°μ½λ μ΄ν° μ μ(νμ¬ μ€ν μ΄μ§ 3)μ ν΄λμ€ λ° ν΄λμ€ λ©€λ²λ₯Ό λ°μ½λ μ΄νΈνκΈ° μν λ³΄λ€ μ°μν ꡬ문μ λμ ν©λλ€. μμ§ λͺ¨λ JavaScript νκ²½μμ μμ ν νμ€νλμ§λ μμμ§λ§ Babel λ° TypeScriptμ κ°μ λꡬμμ μ§μμ μ»κ³ μμ΅λλ€.
λ€μμ ν΄λμ€ λ°μ½λ μ΄ν°μ μμ λλ€.
// Requires a transpiler like Babel with the decorators plugin
function LogClass(constructor) {
return class extends constructor {
constructor(...args) {
super(...args);
console.log(`Creating a new instance of ${constructor.name}`);
}
};
}
@LogClass
class MyClass {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, ${this.name}!`);
}
}
const instance = new MyClass("Alice");
instance.greet();
μ΄ κ²½μ° @LogClassλ MyClassμ μ μ©λ λ ν΄λμ€μ μ μΈμ€ν΄μ€κ° μμ±λ λλ§λ€ λ©μμ§λ₯Ό κΈ°λ‘νλλ‘ μμ±μλ₯Ό ν₯μμν€λ λ°μ½λ μ΄ν°μ
λλ€.
λ©μλ λ°μ½λ μ΄ν° (ES λ°μ½λ μ΄ν° μ μ)
ν΄λμ€ λ΄μμ κ°λ³ λ©μλλ₯Ό λ°μ½λ μ΄νΈν μλ μμ΅λλ€.
// Requires a transpiler like Babel with the decorators plugin
function LogMethod(target, propertyKey, descriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args) {
console.log(`Calling method ${propertyKey} with arguments: ${args}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${propertyKey} returned: ${result}`);
return result;
};
return descriptor;
}
class MyClass {
constructor(name) {
this.name = name;
}
@LogMethod
add(a, b) {
return a + b;
}
}
const instance = new MyClass("Bob");
instance.add(5, 3);
μ¬κΈ°μ @LogMethodλ add λ©μλλ₯Ό λ°μ½λ μ΄νΈνμ¬ λ©μλμ μ λ¬λ μΈμμ λ°ννλ κ°μ κΈ°λ‘ν©λλ€.
μΌλ°μ μΈ λͺ¨λ λ°μ½λ μ΄ν° ν¨ν΄
λͺ¨λ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ λ€μν λμμΈ ν¨ν΄μ ꡬννκ³ λͺ¨λμ κ΅μ°¨ κ΄μ¬μ¬λ₯Ό μΆκ°ν μ μμ΅λλ€. λ€μμ λͺ κ°μ§ μΌλ°μ μΈ μμ λλ€.
1. λ‘κΉ λ°μ½λ μ΄ν°
μ΄μ μμμ 보λ―μ΄ λ‘κΉ λ°μ½λ μ΄ν°λ λͺ¨λμ λ‘κΉ κΈ°λ₯μ μΆκ°νμ¬ ν΄λΉ λμ λ° μ±λ₯μ λν ν΅μ°°λ ₯μ μ 곡ν©λλ€. μ΄λ μ ν리μΌμ΄μ μ λλ²κΉ νκ³ λͺ¨λν°λ§νλ λ° λ§€μ° μ μ©ν©λλ€.
μ: λ‘κΉ λ°μ½λ μ΄ν°λ ν¨μ νΈμΆ, μΈμ, λ°ν κ° λ° μ€ν μκ°μ μ€μ λ‘κΉ μλΉμ€μ κΈ°λ‘ν μ μμ΅λλ€. μ΄λ μ¬λ¬ μλΉμ€μμ μμ²μ μΆμ νλ κ²μ΄ μ€μν λΆμ° μμ€ν λλ λ§μ΄ν¬λ‘ μλΉμ€ μν€ν μ²μμ νΉν μ μ©ν©λλ€.
2. μΊμ± λ°μ½λ μ΄ν°
μΊμ± λ°μ½λ μ΄ν°λ λΉμ©μ΄ λ§μ΄ λλ ν¨μ νΈμΆμ κ²°κ³Όλ₯Ό μΊμνμ¬ λμΌν κ°μ λ°λ³΅ν΄μ λ€μ κ³μ°ν νμμ±μ μ€μ¬ μ±λ₯μ ν₯μμν΅λλ€.
function cacheDecorator(func) {
const cache = new Map();
return function(...args) {
const key = JSON.stringify(args);
if (cache.has(key)) {
console.log("Fetching from cache");
return cache.get(key);
}
const result = func.apply(this, args);
cache.set(key, result);
return result;
};
}
function expensiveCalculation(n) {
console.log("Performing expensive calculation");
// Simulate a time-consuming operation
let result = 0;
for (let i = 0; i < n; i++) {
result += Math.sqrt(i);
}
return result;
}
const cachedCalculation = cacheDecorator(expensiveCalculation);
console.log(cachedCalculation(1000));
console.log(cachedCalculation(1000)); // Fetches from cache
κ΅μ ν μμ : ν΅ν νμ¨μ νμν΄μΌ νλ μ ν리μΌμ΄μ μ κ³ λ €ν΄ λ³΄μμμ€. μΊμ± λ°μ½λ μ΄ν°λ ν΅ν λ³ν μλΉμ€μ λν API νΈμΆ κ²°κ³Όλ₯Ό μ μ₯νμ¬ μμ² μλ₯Ό μ€μ΄κ³ νΉν μΈν°λ· μ°κ²° μλκ° λλ¦° μ¬μ©μλ λκΈ° μκ°μ΄ λμ μ§μμ μ¬μ©μμκ² μ¬μ©μ κ²½νμ κ°μ ν μ μμ΅λλ€.
3. μΈμ¦ λ°μ½λ μ΄ν°
μΈμ¦ λ°μ½λ μ΄ν°λ μ¬μ©μ μΈμ¦ μνμ λ°λΌ νΉμ λͺ¨λ λλ ν¨μμ λν μ‘μΈμ€λ₯Ό μ νν©λλ€. μ΄λ μ ν리μΌμ΄μ μ 보νΈνκ³ λ¬΄λ¨ μ‘μΈμ€λ₯Ό λ°©μ§νλ λ° λμμ΄ λ©λλ€.
function authenticationDecorator(func) {
return function(...args) {
if (isAuthenticated()) { // Replace with your authentication logic
return func.apply(this, args);
} else {
console.log("Authentication required");
return null; // Or throw an error
}
};
}
function isAuthenticated() {
// Replace with your actual authentication check
return true; // For demonstration purposes
}
function sensitiveOperation() {
console.log("Performing sensitive operation");
}
const authenticatedOperation = authenticationDecorator(sensitiveOperation);
authenticatedOperation();
μ μ 컨ν
μ€νΈ: μ μ μ μ μκ±°λ νλ«νΌμμ μΈμ¦ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μ£Όλ¬Έ κ΄λ¦¬ κΈ°λ₯μ λν μ‘μΈμ€λ₯Ό κΆνμ΄ μλ μ§μλ§μΌλ‘ μ νν μ μμ΅λλ€. isAuthenticated() ν¨μλ μ§μ κ·μ μ λ°λΌ λ€λ₯Ό μ μλ νλ«νΌμ 보μ λͺ¨λΈμ κΈ°λ°μΌλ‘ μ¬μ©μμ μν λ° κΆνμ νμΈν΄μΌ ν©λλ€.
4. μ ν¨μ± κ²μ¬ λ°μ½λ μ΄ν°
μ ν¨μ± κ²μ¬ λ°μ½λ μ΄ν°λ μ€ν μ μ ν¨μμ μ λ ₯ λ§€κ°λ³μλ₯Ό κ²μ¦νμ¬ λ°μ΄ν° 무결μ±μ 보μ₯νκ³ μ€λ₯λ₯Ό λ°©μ§ν©λλ€.
function validationDecorator(validator) {
return function(func) {
return function(...args) {
const validationResult = validator(args);
if (validationResult.isValid) {
return func.apply(this, args);
} else {
console.error("Validation failed:", validationResult.errorMessage);
throw new Error(validationResult.errorMessage);
}
};
};
}
function createUserValidator(args) {
const [username, email] = args;
if (!username) {
return { isValid: false, errorMessage: "Username is required" };
}
if (!email.includes("@")) {
return { isValid: false, errorMessage: "Invalid email format" };
}
return { isValid: true };
}
function createUser(username, email) {
console.log(`Creating user with username: ${username} and email: ${email}`);
}
const validatedCreateUser = validationDecorator(createUserValidator)(createUser);
validatedCreateUser("john.doe", "john.doe@example.com");
validatedCreateUser("jane", "invalid-email");
μ§μν λ° μ ν¨μ± κ²μ¬: μ ν¨μ± κ²μ¬ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μ μ μ£Όμ μμμμ μ¬μ©μμ κ΅κ°λ₯Ό κΈ°λ°μΌλ‘ μ°νΈ λ²νΈλ₯Ό μ ν¨μ± κ²μ¬ν μ μμ΅λλ€. validator ν¨μλ μΈλΆ API λλ κ΅¬μ± νμΌμμ κ°μ Έμ¨ κ΅κ°λ³ μ ν¨μ± κ²μ¬ κ·μΉμ μ¬μ©ν΄μΌ ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ£Όμ λ°μ΄ν°κ° κ° μ§μμ μ°νΈ μꡬ μ¬νκ³Ό μΌμΉνλμ§ νμΈν μ μμ΅λλ€.
5. μ¬μλ λ°μ½λ μ΄ν°
μ¬μλ λ°μ½λ μ΄ν°λ ν¨μ νΈμΆμ΄ μ€ν¨νλ©΄ μλμΌλ‘ μ¬μλνμ¬ νΉν μ λ’°ν μ μλ μλΉμ€ λλ λ€νΈμν¬ μ°κ²°μ μ²λ¦¬ν λ μ ν리μΌμ΄μ μ 볡μλ ₯μ ν₯μμν΅λλ€.
function retryDecorator(maxRetries) {
return function(func) {
return async function(...args) {
let retries = 0;
while (retries < maxRetries) {
try {
const result = await func.apply(this, args);
return result;
} catch (error) {
console.error(`Attempt ${retries + 1} failed:`, error);
retries++;
await new Promise(resolve => setTimeout(resolve, 1000)); // Wait 1 second before retrying
}
}
throw new Error(`Function failed after ${maxRetries} retries`);
};
};
}
async function fetchData() {
// Simulate a function that might fail
if (Math.random() < 0.5) {
throw new Error("Failed to fetch data");
}
return "Data fetched successfully!";
}
const retryFetchData = retryDecorator(3)(fetchData);
retryFetchData()
.then(data => console.log(data))
.catch(error => console.error("Final error:", error));
λ€νΈμν¬ λ³΅μλ ₯: μΈν°λ· μ°κ²°μ΄ λΆμμ ν μ§μμμ μ¬μλ λ°μ½λ μ΄ν°λ μ£Όλ¬Έ μ μΆ λλ λ°μ΄ν° μ μ₯κ³Ό κ°μ μ€μν μμ μ΄ κ²°κ΅ μ±κ³΅νλλ‘ λ³΄μ₯νλ λ° λ§€μ° μ μ©ν μ μμ΅λλ€. μ¬μλ νμμ μ¬μλ κ°μ μ§μ°μ νΉμ νκ²½κ³Ό μμ μ λ―Όκ°λμ λ°λΌ κ΅¬μ± κ°λ₯ν΄μΌ ν©λλ€.
κ³ κΈ κΈ°μ
λ°μ½λ μ΄ν° κ²°ν©
λ°μ½λ μ΄ν°λ₯Ό κ²°ν©νμ¬ λ¨μΌ λͺ¨λμ μ¬λ¬ ν₯μλ κΈ°λ₯μ μ μ©ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μλ³Έ λͺ¨λμ μ½λλ₯Ό μμ νμ§ μκ³ λ 볡μ‘νκ³ κ³ λλ‘ μ¬μ©μ μ μλ λμμ λ§λ€ μ μμ΅λλ€.
//Requires transpilation (Babel/Typescript)
function ReadOnly(target, name, descriptor) {
descriptor.writable = false;
return descriptor;
}
function Trace(target, name, descriptor) {
const original = descriptor.value;
descriptor.value = function (...args) {
console.log(`TRACE: Calling ${name} with arguments: ${args}`);
const result = original.apply(this, args);
console.log(`TRACE: ${name} returned: ${result}`);
return result;
};
return descriptor;
}
class Calculator {
constructor(value) {
this.value = value;
}
@Trace
add(amount) {
this.value += amount;
return this.value;
}
@ReadOnly
@Trace
getValue() {
return this.value;
}
}
const calc = new Calculator(10);
calc.add(5); // Output will include TRACE messages
console.log(calc.getValue()); // Output will include TRACE messages
try{
calc.getValue = function(){ return "hacked!"; }
} catch(e){
console.log("Cannot overwrite ReadOnly property");
}
λ°μ½λ μ΄ν° ν©ν 리
λ°μ½λ μ΄ν° ν©ν 리λ λ°μ½λ μ΄ν°λ₯Ό λ°ννλ ν¨μμ λλ€. μ΄λ₯Ό ν΅ν΄ λ°μ½λ μ΄ν°λ₯Ό λ§€κ°λ³μννκ³ νΉμ μꡬ μ¬νμ λ°λΌ ν΄λΉ λμμ ꡬμ±ν μ μμ΅λλ€.
function retryDecoratorFactory(maxRetries, delay) {
return function(func) {
return async function(...args) {
let retries = 0;
while (retries < maxRetries) {
try {
const result = await func.apply(this, args);
return result;
} catch (error) {
console.error(`Attempt ${retries + 1} failed:`, error);
retries++;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
throw new Error(`Function failed after ${maxRetries} retries`);
};
};
}
// Use the factory to create a retry decorator with specific parameters
const retryFetchData = retryDecoratorFactory(5, 2000)(fetchData);
κ³ λ € μ¬ν λ° λͺ¨λ² μ¬λ‘
- ES λ°μ½λ μ΄ν° μ μ μ΄ν΄: ES λ°μ½λ μ΄ν° μ μμ μ¬μ©νλ κ²½μ° κ΅¬λ¬Έ λ° μλ―Έ 체κ³μ μ΅μν΄μ§μμμ€. μ¬μ ν μ μ μ¬νμ΄λ©° ν₯ν λ³κ²½λ μ μμμ μ μνμμμ€.
- νΈλμ€νμΌλ¬ μ¬μ©: ES λ°μ½λ μ΄ν° μ μμ μ¬μ©νλ κ²½μ° Babel λλ TypeScriptμ κ°μ νΈλμ€νμΌλ¬κ° μ½λλ₯Ό λΈλΌμ°μ νΈν νμμΌλ‘ λ³νν΄μΌ ν©λλ€.
- κ³Όμ© λ°©μ§: λ°μ½λ μ΄ν°λ κ°λ ₯νμ§λ§ κ³Όμ©νμ§ λ§μμμ€. λ°μ½λ μ΄ν°κ° λ무 λ§μΌλ©΄ μ½λλ₯Ό μ΄ν΄νκ³ λλ²κΉ νκΈ° μ΄λ €μΈ μ μμ΅λλ€.
- μ§μ€λ λ°μ½λ μ΄ν° μ μ§: κ° λ°μ½λ μ΄ν°λ λ¨μΌνκ³ μ μ μλ λͺ©μ μ κ°μ ΈμΌ ν©λλ€. μ΄λ κ² νλ©΄ μ΄ν΄νκ³ μ¬μ¬μ©νκΈ°κ° λ μ¬μμ§λλ€.
- λ°μ½λ μ΄ν° ν μ€νΈ: λ°μ½λ μ΄ν°κ° μμλλ‘ μλνκ³ λ²κ·Έλ₯Ό λ°μμν€μ§ μλμ§ νμΈνκΈ° μν΄ μ² μ ν ν μ€νΈνμμμ€.
- λ°μ½λ μ΄ν° λ¬Έμν: λ°μ½λ μ΄ν°μ λͺ©μ , μ¬μ©λ² λ° μ μ¬μ μΈ λΆμμ©μ μ€λͺ νμ¬ λ°μ½λ μ΄ν°λ₯Ό λͺ ννκ² λ¬Έμννμμμ€.
- μ±λ₯ κ³ λ €: λ°μ½λ μ΄ν°λ μ½λμ μ€λ²ν€λλ₯Ό μΆκ°ν μ μμ΅λλ€. νΉν μμ£Ό νΈμΆλλ ν¨μλ₯Ό λ°μ½λ μ΄νΈν λ μ±λ₯μ λ―ΈμΉλ μν₯μ μ μνμμμ€. μ μ ν κ²½μ° μΊμ± κΈ°μ μ μ¬μ©νμμμ€.
μ€μ μμ
λͺ¨λ λ°μ½λ μ΄ν°λ λ€μκ³Ό κ°μ λ€μν μ€μ μλ리μ€μμ μ μ©ν μ μμ΅λλ€.
- νλ μμν¬ λ° λΌμ΄λΈλ¬λ¦¬: λ§μ μ΅μ JavaScript νλ μμν¬ λ° λΌμ΄λΈλ¬λ¦¬λ λ°μ½λ μ΄ν°λ₯Ό κ΄λ²μνκ² μ¬μ©νμ¬ μ’ μμ± μ£Όμ , λΌμ°ν λ° μν κ΄λ¦¬μ κ°μ κΈ°λ₯μ μ 곡ν©λλ€. μλ₯Ό λ€μ΄ Angularλ λ°μ½λ μ΄ν°μ ν¬κ² μμ‘΄ν©λλ€.
- API ν΄λΌμ΄μΈνΈ: λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ API ν΄λΌμ΄μΈνΈ ν¨μμ λ‘κΉ , μΊμ± λ° μΈμ¦μ μΆκ°ν μ μμ΅λλ€.
- λ°μ΄ν° μ ν¨μ± κ²μ¬: λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκ±°λ APIλ‘ λ³΄λ΄κΈ° μ μ λ°μ΄ν°λ₯Ό μ ν¨μ± κ²μ¬ν μ μμ΅λλ€.
- μ΄λ²€νΈ μ²λ¦¬: λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μ΄λ²€νΈ μ²λ¦¬ λ Όλ¦¬λ₯Ό λ¨μνν μ μμ΅λλ€.
κ²°λ‘
JavaScript λͺ¨λ λ°μ½λ μ΄ν° ν¨ν΄μ μ½λμ λμμ ν₯μμν€κ³ μ¬μ¬μ©μ±, μ μ§ κ΄λ¦¬μ± λ° ν μ€νΈ μ©μ΄μ±μ μ΄μ§νλ κ°λ ₯νκ³ μ μ°ν λ°©λ²μ μ 곡ν©λλ€. ν΅μ¬ κ°λ μ μ΄ν΄νκ³ μ΄ κΈ°μ¬μμ μ€λͺ ν ν¨ν΄μ μ μ©ν¨μΌλ‘μ¨ λ κΉ¨λνκ³ κ°λ ₯νλ©° νμ₯ κ°λ₯ν JavaScript μ ν리μΌμ΄μ μ μμ±ν μ μμ΅λλ€. ES λ°μ½λ μ΄ν° μ μμ΄ λ리 μ±νλ¨μ λ°λΌ μ΄ κΈ°μ μ μ΅μ JavaScript κ°λ°μμ λμ± λ리 보κΈλ κ²μ λλ€. νλ‘μ νΈμ μ΄λ¬ν ν¨ν΄μ νμνκ³ μ€ννκ³ ν΅ν©νμ¬ μ½λλ₯Ό ν λ¨κ³ λ λ°μ μν€μμμ€. νλ‘μ νΈμ νΉμ μꡬ μ¬νμ λ§λ μ¬μ©μ μ§μ λ°μ½λ μ΄ν°λ₯Ό λ§λλ κ²μ λλ €μνμ§ λ§μμμ€.