κ°λ ₯ν λ§€κ°λ³μ μ ν¨μ± κ²μ¬λ₯Ό μν μλ°μ€ν¬λ¦½νΈ λ°μ½λ μ΄ν°λ₯Ό νμνμΈμ. λ κΉλνκ³ μ λ’°μ± λμ μ½λλ₯Ό μν΄ λ°μ½λ μ΄ν° μΈμ κ²μ¬λ₯Ό ꡬννλ λ°©λ²μ λ°°μ°μΈμ.
μλ°μ€ν¬λ¦½νΈ λ°μ½λ μ΄ν°λ₯Ό μ΄μ©ν λ§€κ°λ³μ μ ν¨μ± κ²μ¬: λ°μ΄ν° λ¬΄κ²°μ± λ³΄μ₯
νλ μλ°μ€ν¬λ¦½νΈ κ°λ°μμ ν¨μμ λ©μλμ μ λ¬λλ λ°μ΄ν°μ 무결μ±μ 보μ₯νλ κ²μ λ§€μ° μ€μν©λλ€. μ΄λ₯Ό λ¬μ±νκΈ° μν κ°λ ₯ν κΈ°μ μ€ νλλ λ§€κ°λ³μ μ ν¨μ± κ²μ¬λ₯Ό μν΄ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ κ²μ λλ€. λ°μ½λ μ΄ν°λ Babelμ ν΅ν΄ μλ°μ€ν¬λ¦½νΈμμ μ¬μ©νκ±°λ νμ μ€ν¬λ¦½νΈμμ κΈ°λ³Έμ μΌλ‘ μ 곡λλ κΈ°λ₯μΌλ‘, ν¨μ, ν΄λμ€ λ° μμ±μ κΈ°λ₯μ κΉλνκ³ μ°μνκ² μΆκ°ν μ μλ λ°©λ²μ μ 곡ν©λλ€. μ΄ κΈμμλ μλ°μ€ν¬λ¦½νΈ λ°μ½λ μ΄ν°μ μΈκ³λ₯Ό κΉμ΄ νκ³ λ€μ΄, νΉν μΈμ κ²μ¬μμμ νμ©μ μ΄μ μ λ§μΆκ³ λͺ¨λ μμ€μ κ°λ°μλ₯Ό μν μ€μ©μ μΈ μμ μ ν΅μ°°λ ₯μ μ 곡ν©λλ€.
μλ°μ€ν¬λ¦½νΈ λ°μ½λ μ΄ν°λ 무μμΈκ°?
λ°μ½λ μ΄ν°λ κΈ°μ‘΄ ν΄λμ€, ν¨μ λλ μμ±μ λμ λ° μ μ μΌλ‘ λμμ μΆκ°ν μ μκ² ν΄μ£Όλ λμμΈ ν¨ν΄μ λλ€. λ³Έμ§μ μΌλ‘, λ°μ½λ μ΄ν°λ μλ³Έ μ½λλ₯Ό μμ νμ§ μκ³ μλ‘μ΄ κΈ°λ₯μΌλ‘ κΈ°μ‘΄ μ½λλ₯Ό "μ₯μ"ν©λλ€. μ΄λ SOLID λμμΈμ κ°λ°©-νμ μμΉ(Open/Closed Principle)μ μ€μνλ κ²μΌλ‘, μννΈμ¨μ΄ κ°μ²΄(ν΄λμ€, λͺ¨λ, ν¨μ λ±)λ νμ₯μ λν΄μλ μ΄λ € μμ΄μΌ νμ§λ§ μμ μ λν΄μλ λ«ν μμ΄μΌ νλ€λ μμΉμ λλ€.
μλ°μ€ν¬λ¦½νΈμμ λ°μ½λ μ΄ν°λ ν΄λμ€ μ μΈ, λ©μλ, μ κ·Όμ, μμ± λλ λ§€κ°λ³μμ 첨λΆλ μ μλ νΉλ³ν μ’
λ₯μ μ μΈμ
λλ€. λ°μ½λ μ΄ν°λ @expression ꡬ문μ μ¬μ©νλ©°, μ¬κΈ°μ expressionμ λ°νμμ μ₯μλ μ μΈμ λν μ 보μ ν¨κ» νΈμΆλ ν¨μλ‘ νκ°λμ΄μΌ ν©λλ€.
μλ°μ€ν¬λ¦½νΈμμ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ €λ©΄ μΌλ°μ μΌλ‘ @babel/plugin-proposal-decorators νλ¬κ·ΈμΈμ΄ νμ±νλ Babelκ³Ό κ°μ νΈλμ€νμΌλ¬λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. νμ
μ€ν¬λ¦½νΈλ λ°μ½λ μ΄ν°λ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€.
λ§€κ°λ³μ μ ν¨μ± κ²μ¬μ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ μ΄μ
λ§€κ°λ³μ μ ν¨μ± κ²μ¬μ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ©΄ μ¬λ¬ κ°μ§ μ΄μ μ΄ μμ΅λλ€:
- μ½λ κ°λ μ± ν₯μ: λ°μ½λ μ΄ν°λ μ ν¨μ± κ²μ¬ κ·μΉμ μ μΈμ μΌλ‘ νννλ λ°©λ²μ μ 곡νμ¬ μ½λλ₯Ό λ μ½κ² μ΄ν΄νκ³ μ μ§λ³΄μν μ μκ² ν©λλ€.
- λ°λ³΅μ μΈ μ½λ κ°μ: μ¬λ¬ ν¨μμμ μ ν¨μ± κ²μ¬ λ‘μ§μ λ°λ³΅νλ λμ , λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ©΄ ν λ² μ μνκ³ μ½λλ² μ΄μ€ μ 체μ μ μ©ν μ μμ΅λλ€.
- μ½λ μ¬μ¬μ©μ± ν₯μ: λ°μ½λ μ΄ν°λ λ€λ₯Έ ν΄λμ€μ ν¨μμ κ±Έμ³ μ¬μ¬μ©λ μ μμ΄ μ½λ μ¬μ¬μ©μ μ΄μ§νκ³ μ€λ³΅μ μ€μ λλ€.
- κ΄μ¬μ¬μ λΆλ¦¬: μ ν¨μ± κ²μ¬ λ‘μ§μ΄ ν¨μμ ν΅μ¬ λΉμ¦λμ€ λ‘μ§κ³Ό λΆλ¦¬λμ΄ λ κΉλνκ³ λͺ¨λνλ μ½λλ₯Ό λ§λλλ€.
- μ€μνλ μ ν¨μ± κ²μ¬ λ‘μ§: λͺ¨λ μ ν¨μ± κ²μ¬ κ·μΉμ΄ ν κ³³μ μ μλμ΄ μμ΄ μ λ°μ΄νΈνκ³ μ μ§λ³΄μνκΈ°κ° λ μ½μ΅λλ€.
λ°μ½λ μ΄ν°λ₯Ό μ΄μ©ν λ§€κ°λ³μ μ ν¨μ± κ²μ¬ ꡬν
μλ°μ€ν¬λ¦½νΈ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ λ§€κ°λ³μ μ ν¨μ± κ²μ¬λ₯Ό ꡬννλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€. κ°λ¨ν μμ λΆν° μμνμ¬ λ 볡μ‘ν μλ리μ€λ‘ λμ΄κ°κ² μ΅λλ€.
κΈ°λ³Έ μμ : λ¬Έμμ΄ λ§€κ°λ³μ μ ν¨μ± κ²μ¬
λ¬Έμμ΄ λ§€κ°λ³μλ₯Ό μμνλ ν¨μλ₯Ό μκ°ν΄ λ΄ μλ€. μ°λ¦¬λ λ§€κ°λ³μκ° μ€μ λ‘ λ¬Έμμ΄μΈμ§ νμΈνλ λ°μ½λ μ΄ν°λ₯Ό λ§λ€ μ μμ΅λλ€.
function validateString(target: any, propertyKey: string | symbol, parameterIndex: number) {
let existingParameters: any[] = Reflect.getOwnMetadata('validateParameters', target, propertyKey) || [];
existingParameters.push({ index: parameterIndex, validator: (value: any) => typeof value === 'string' });
Reflect.defineMetadata('validateParameters', existingParameters, target, propertyKey);
const originalMethod = target[propertyKey];
target[propertyKey] = function (...args: any[]) {
const metadata = Reflect.getOwnMetadata('validateParameters', target, propertyKey);
if (metadata) {
for (const item of metadata) {
const { index, validator } = item;
if (!validator(args[index])) {
throw new Error(`Parameter at index ${index} is invalid`);
}
}
}
return originalMethod.apply(this, args);
};
}
function validate(...validators: ((value: any) => boolean)[]) {
return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
for (let i = 0; i < validators.length; i++) {
if (!validators[i](args[i])) {
throw new Error(`Parameter at index ${i} is invalid`);
}
}
return originalMethod.apply(this, args);
};
};
}
function isString(value: any): boolean {
return typeof value === 'string';
}
class Example {
@validate(isString)
greet( @validateString name: string) {
return `Hello, ${name}!`;
}
}
const example = new Example();
try {
console.log(example.greet("Alice")); // μΆλ ₯: Hello, Alice!
// example.greet(123); // μ€λ₯ λ°μ
} catch (error:any) {
console.error(error.message);
}
μ€λͺ :
validateStringλ°μ½λ μ΄ν°λgreetλ©μλμnameλ§€κ°λ³μμ μ μ©λ©λλ€.- λ©μλμ κ΄λ ¨λ μ ν¨μ± κ²μ¬ λ©νλ°μ΄ν°λ₯Ό μ μ₯νκ³ κ²μνκΈ° μν΄
Reflect.defineMetadataμReflect.getOwnMetadataλ₯Ό μ¬μ©ν©λλ€. - μλ³Έ λ©μλλ₯Ό νΈμΆνκΈ° μ μ μ ν¨μ± κ²μ¬ λ©νλ°μ΄ν°λ₯Ό μννλ©° κ° λ§€κ°λ³μμ μ ν¨μ± κ²μ¬κΈ° ν¨μλ₯Ό μ μ©ν©λλ€.
- μ΄λ€ λ§€κ°λ³μλΌλ μ ν¨μ± κ²μ¬μ μ€ν¨νλ©΄ μ€λ₯κ° λ°μν©λλ€.
validateλ°μ½λ μ΄ν°λ μ ν¨μ± κ²μ¬κΈ°λ₯Ό λ§€κ°λ³μμ μ μ©νλ λ μΌλ°μ μ΄κ³ μ‘°ν© κ°λ₯ν λ°©λ²μ μ 곡νμ¬, κ° λ§€κ°λ³μμ λν΄ μ¬λ¬ μ ν¨μ± κ²μ¬κΈ°λ₯Ό μ§μ ν μ μκ² ν©λλ€.isStringν¨μλ κ°μ΄ λ¬Έμμ΄μΈμ§ νμΈνλ κ°λ¨ν μ ν¨μ± κ²μ¬κΈ°μ λλ€.Exampleν΄λμ€λgreetλ©μλμnameλ§€κ°λ³μλ₯Ό κ²μ¦νκΈ° μν΄ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ λ°©λ²μ 보μ¬μ€λλ€.
κ³ κΈ μμ : μ΄λ©μΌ νμ μ ν¨μ± κ²μ¬
λ¬Έμμ΄ λ§€κ°λ³μκ° μ ν¨ν μ΄λ©μΌ μ£ΌμμΈμ§ κ²μ¦νλ λ°μ½λ μ΄ν°λ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€.
function validateEmail(target: any, propertyKey: string | symbol, parameterIndex: number) {
let existingParameters: any[] = Reflect.getOwnMetadata('validateParameters', target, propertyKey) || [];
existingParameters.push({ index: parameterIndex, validator: (value: any) => {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return typeof value === 'string' && emailRegex.test(value);
} });
Reflect.defineMetadata('validateParameters', existingParameters, target, propertyKey);
const originalMethod = target[propertyKey];
target[propertyKey] = function (...args: any[]) {
const metadata = Reflect.getOwnMetadata('validateParameters', target, propertyKey);
if (metadata) {
for (const item of metadata) {
const { index, validator } = item;
if (!validator(args[index])) {
throw new Error(`Parameter at index ${index} is not a valid email address`);
}
}
}
return originalMethod.apply(this, args);
};
}
class User {
register( @validateEmail email: string) {
return `Registered with email: ${email}`;
}
}
const user = new User();
try {
console.log(user.register("test@example.com")); // μΆλ ₯: Registered with email: test@example.com
// user.register("invalid-email"); // μ€λ₯ λ°μ
} catch (error:any) {
console.error(error.message);
}
μ€λͺ :
validateEmailλ°μ½λ μ΄ν°λ μ κ· ννμμ μ¬μ©νμ¬ λ§€κ°λ³μκ° μ ν¨ν μ΄λ©μΌ μ£ΌμμΈμ§ νμΈν©λλ€.- λ§€κ°λ³μκ° μ ν¨ν μ΄λ©μΌ μ£Όμκ° μλλ©΄ μ€λ₯κ° λ°μν©λλ€.
μ¬λ¬ μ ν¨μ± κ²μ¬κΈ° κ²°ν©νκΈ°
validate λ°μ½λ μ΄ν°μ μ¬μ©μ μ μ μ ν¨μ± κ²μ¬ ν¨μλ₯Ό μ¬μ©νμ¬ μ¬λ¬ μ ν¨μ± κ²μ¬κΈ°λ₯Ό κ²°ν©ν μ μμ΅λλ€.
function isNotEmptyString(value: any): boolean {
return typeof value === 'string' && value.trim() !== '';
}
function isPositiveNumber(value: any): boolean {
return typeof value === 'number' && value > 0;
}
class Product {
@validate(isNotEmptyString, isPositiveNumber)
create(name: string, price: number) {
return `Product created: ${name} - $${price}`;
}
}
const product = new Product();
try {
console.log(product.create("Laptop", 1200)); // μΆλ ₯: Product created: Laptop - $1200
// product.create("", 0); // μ€λ₯ λ°μ
} catch (error:any) {
console.error(error.message);
}
μ€λͺ :
isNotEmptyStringμ ν¨μ± κ²μ¬κΈ°λ λ¬Έμμ΄μ μμͺ½ 곡백μ μ κ±°ν ν λΉμ΄ μμ§ μμμ§ νμΈν©λλ€.isPositiveNumberμ ν¨μ± κ²μ¬κΈ°λ κ°μ΄ μμμΈμ§ νμΈν©λλ€.validateλ°μ½λ μ΄ν°λProductν΄λμ€μcreateλ©μλμ λ μ ν¨μ± κ²μ¬κΈ°λ₯Ό λͺ¨λ μ μ©νλ λ° μ¬μ©λ©λλ€.
λ§€κ°λ³μ μ ν¨μ± κ²μ¬μ λ°μ½λ μ΄ν° μ¬μ©μ μν λͺ¨λ² μ¬λ‘
λ§€κ°λ³μ μ ν¨μ± κ²μ¬μ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©ν λ κ³ λ €ν΄μΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- λ°μ½λ μ΄ν°λ₯Ό λ¨μνκ² μ μ§: λ°μ½λ μ΄ν°λ μ ν¨μ± κ²μ¬ λ‘μ§μ μ§μ€νκ³ λ³΅μ‘ν κ³μ°μ νΌν΄μΌ ν©λλ€.
- λͺ νν μ€λ₯ λ©μμ§ μ 곡: μ€λ₯ λ©μμ§κ° μ μ΅νκ³ κ°λ°μκ° μ ν¨μ± κ²μ¬ μ€ν¨λ₯Ό μ΄ν΄νλ λ° λμμ΄ λλλ‘ νμμμ€.
- μλ―Έ μλ μ΄λ¦ μ¬μ©: μ½λ κ°λ μ±μ λμ΄κΈ° μν΄ λ°μ½λ μ΄ν°μ μ€λͺ μ μΈ μ΄λ¦μ μ ννμμμ€.
- λ°μ½λ μ΄ν° λ¬Έμν: λ°μ½λ μ΄ν°μ λͺ©μ κ³Ό μ¬μ©λ²μ λ¬Έμννμ¬ λ μ½κ² μ΄ν΄νκ³ μ μ§λ³΄μν μ μλλ‘ νμμμ€.
- μ±λ₯ κ³ λ €: λ°μ½λ μ΄ν°λ κΈ°λ₯μ μΆκ°νλ νΈλ¦¬ν λ°©λ²μ μ 곡νμ§λ§, νΉν μ±λ₯μ΄ μ€μν μ ν리μΌμ΄μ μμλ μ±λ₯ μν₯μ μ μνμμμ€.
- ν₯μλ νμ μμ μ±μ μν΄ νμ μ€ν¬λ¦½νΈ μ¬μ©: νμ μ€ν¬λ¦½νΈλ λ°μ½λ μ΄ν°λ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μνλ©° νμ μμ μ±μ ν₯μμμΌ λ°μ½λ μ΄ν° κΈ°λ° μ ν¨μ± κ²μ¬ λ‘μ§μ κ°λ°νκ³ μ μ§λ³΄μνκΈ° μ½κ² λ§λλλ€.
- λ°μ½λ μ΄ν° μ² μ ν ν μ€νΈ: λ¨μ ν μ€νΈλ₯Ό μμ±νμ¬ λ°μ½λ μ΄ν°κ° μ¬λ°λ₯΄κ² μλνκ³ λ€μν μλ리μ€λ₯Ό μ μ νκ² μ²λ¦¬νλμ§ νμΈνμμμ€.
μ€μ μ¬λ‘ λ° μ¬μ© μμ
λ§€κ°λ³μ μ ν¨μ± κ²μ¬μ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©ν μ μλ λͺ κ°μ§ μ€μ μμλ λ€μκ³Ό κ°μ΅λλ€:
- API μμ² μ ν¨μ± κ²μ¬: λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ λ€μ΄μ€λ API μμ² λ§€κ°λ³μλ₯Ό κ²μ¦νμ¬ μμ λ°μ΄ν° μ ν λ° νμμ λΆν©νλμ§ νμΈν μ μμ΅λλ€. μ΄λ λ°±μλ λ‘μ§μμ μκΈ°μΉ μμ λμμ λ°©μ§ν©λλ€.
API μλν¬μΈνΈκ°
username,email,passwordμ κ°μ λ§€κ°λ³μλ₯Ό ν¬ν¨νλ μ¬μ©μ λ±λ‘ μμ²μ μμνλ μλ리μ€λ₯Ό κ³ λ €ν΄ λ³΄μμμ€. λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μ΄λ¬ν λ§€κ°λ³μκ° μ‘΄μ¬νκ³ , μ¬λ°λ₯Έ νμ (λ¬Έμμ΄)μ΄λ©°, νΉμ νμ(μ: μ κ· ννμμ μ¬μ©ν μ΄λ©μΌ μ£Όμ μ ν¨μ± κ²μ¬)μ μ€μνλμ§ νμΈν μ μμ΅λλ€. - μμ μ λ ₯ μ ν¨μ± κ²μ¬: λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μμ μ λ ₯ νλλ₯Ό κ²μ¦νμ¬ μ¬μ©μκ° μ ν¨ν λ°μ΄ν°λ₯Ό μ λ ₯νλλ‘ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ°νΈλ²νΈ νλκ° νΉμ κ΅κ°μ μ ν¨ν μ°νΈλ²νΈ νμμ ν¬ν¨νλμ§ νμΈν©λλ€.
- λ°μ΄ν°λ² μ΄μ€ 쿼리 μ ν¨μ± κ²μ¬: λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ 쿼리μ μ λ¬λλ λ§€κ°λ³μλ₯Ό κ²μ¦νμ¬ SQL μ½μ μ·¨μ½μ μ λ°©μ§ν μ μμ΅λλ€. λ°μ΄ν°λ² μ΄μ€ 쿼리μ μ¬μ©λκΈ° μ μ μ¬μ©μ μ 곡 λ°μ΄ν°κ° μ μ ν μ΄κ· λμλμ§ νμΈν©λλ€. μ¬κΈ°μλ λ°μ΄ν° μ ν, κΈΈμ΄, νμ νμΈλΏλ§ μλλΌ μ μ± μ½λ μ£Όμ μ λ°©μ§νκΈ° μν νΉμ λ¬Έμ μ΄μ€μΌμ΄ν μ²λ¦¬κ° ν¬ν¨λ μ μμ΅λλ€.
- κ΅¬μ± νμΌ μ ν¨μ± κ²μ¬: λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ κ΅¬μ± νμΌ μ€μ μ κ²μ¦νμ¬ νμ© κ°λ₯ν λ²μ λ΄μ μκ³ μ¬λ°λ₯Έ μ νμΈμ§ νμΈν μ μμ΅λλ€.
- λ°μ΄ν° μ§λ ¬ν/μμ§λ ¬ν: λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μ§λ ¬ν λ° μμ§λ ¬ν κ³Όμ μμ λ°μ΄ν°λ₯Ό κ²μ¦νμ¬ λ°μ΄ν° 무결μ±μ 보μ₯νκ³ λ°μ΄ν° μμμ λ°©μ§ν μ μμ΅λλ€. JSON λ°μ΄ν°λ₯Ό μ²λ¦¬νκΈ° μ μ ꡬ쑰λ₯Ό κ²μ¦νκ³ νμ νλ, λ°μ΄ν° μ ν λ° νμμ κ°μ ν©λλ€.
λ€λ₯Έ μ ν¨μ± κ²μ¬ κΈ°λ²κ³Όμ λΉκ΅
λ°μ½λ μ΄ν°λ λ§€κ°λ³μ μ ν¨μ± κ²μ¬λ₯Ό μν κ°λ ₯ν λꡬμ΄μ§λ§, λ€λ₯Έ μ ν¨μ± κ²μ¬ κΈ°λ²κ³Ό λΉκ΅νμ¬ κ·Έ μ₯λ¨μ μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€:
- μλ μ ν¨μ± κ²μ¬: μλ μ ν¨μ± κ²μ¬λ ν¨μ λ΄μ μ§μ μ ν¨μ± κ²μ¬ λ‘μ§μ μμ±νλ κ²μ ν¬ν¨ν©λλ€. μ΄ μ κ·Ό λ°©μμ νΉν 볡μ‘ν μ ν¨μ± κ²μ¬ κ·μΉμ κ²½μ° μ§λ£¨νκ³ μ€λ₯κ° λ°μνκΈ° μ½μ΅λλ€. λ°μ½λ μ΄ν°λ λ μ μΈμ μ΄κ³ μ¬μ¬μ© κ°λ₯ν μ κ·Ό λ°©μμ μ 곡ν©λλ€.
- μ ν¨μ± κ²μ¬ λΌμ΄λΈλ¬λ¦¬: μ ν¨μ± κ²μ¬ λΌμ΄λΈλ¬λ¦¬λ 미리 λ§λ€μ΄μ§ μ ν¨μ± κ²μ¬ ν¨μμ κ·μΉ μΈνΈλ₯Ό μ 곡ν©λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μ μ©ν μ μμ§λ§, λ°μ½λ μ΄ν°λ§νΌ μ μ°νκ±°λ μ¬μ©μ μ μνκΈ° μ΄λ €μΈ μ μμ΅λλ€. Joiλ Yupκ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ μ 체 κ°μ²΄λ₯Ό κ²μ¦νκΈ° μν μ€ν€λ§λ₯Ό μ μνλ λ° νμνλ©°, λ°μ½λ μ΄ν°λ κ°λ³ λ§€κ°λ³μλ₯Ό κ²μ¦νλ λ° λ°μ΄λ©λλ€.
- λ―Έλ€μ¨μ΄: λ―Έλ€μ¨μ΄λ μΉ μ ν리μΌμ΄μ μμ μμ² μ ν¨μ± κ²μ¬μ μμ£Ό μ¬μ©λ©λλ€. λ―Έλ€μ¨μ΄λ μ 체 μμ²μ κ²μ¦νλ λ° μ ν©νμ§λ§, λ°μ½λ μ΄ν°λ κ°λ³ ν¨μ λ§€κ°λ³μμ λ μΈλ°ν μ ν¨μ± κ²μ¬μ μ¬μ©λ μ μμ΅λλ€.
κ²°λ‘
μλ°μ€ν¬λ¦½νΈ λ°μ½λ μ΄ν°λ λ§€κ°λ³μ μ ν¨μ± κ²μ¬λ₯Ό ꡬννλ κ°λ ₯νκ³ μ°μν λ°©λ²μ μ 곡ν©λλ€. λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ©΄ μ½λ κ°λ μ±μ λμ΄κ³ , λ°λ³΅μ μΈ μ½λλ₯Ό μ€μ΄λ©°, μ½λ μ¬μ¬μ©μ±μ ν₯μμν€κ³ , μ ν¨μ± κ²μ¬ λ‘μ§μ ν΅μ¬ λΉμ¦λμ€ λ‘μ§κ³Ό λΆλ¦¬ν μ μμ΅λλ€. API, μΉ μ ν리μΌμ΄μ λλ λ€λ₯Έ μ νμ μννΈμ¨μ΄λ₯Ό ꡬμΆνλ , λ°μ½λ μ΄ν°λ λ°μ΄ν° 무결μ±μ 보μ₯νκ³ λ κ²¬κ³ νλ©° μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λλ₯Ό λ§λλ λ° λμμ΄ λ μ μμ΅λλ€.
λ°μ½λ μ΄ν°λ₯Ό νμν λλ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ , μ€μ μμλ₯Ό κ³ λ €νλ©°, λ€λ₯Έ μ ν¨μ± κ²μ¬ κΈ°λ²κ³Ό λΉκ΅νμ¬ νΉμ μꡬμ κ°μ₯ μ ν©ν μ κ·Ό λ°©μμ κ²°μ νλ κ²μ μμ§ λ§μμμ€. λ°μ½λ μ΄ν°μ λ§€κ°λ³μ μ ν¨μ± κ²μ¬μμμ νμ©μ λν νμ€ν μ΄ν΄λ₯Ό λ°νμΌλ‘ μλ°μ€ν¬λ¦½νΈ μ½λμ νμ§κ³Ό μ λ’°μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
λν, λ°μ½λ μ΄ν°λ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μνλ νμ μ€ν¬λ¦½νΈμ μ±νμ΄ μ¦κ°ν¨μ λ°λΌ μ΄ κΈ°μ μ νλ μλ°μ€ν¬λ¦½νΈ κ°λ°μμ λμ± λ§€λ ₯μ μΌλ‘ λ€κ°μ΅λλ€. λ§€κ°λ³μ μ ν¨μ± κ²μ¬λ₯Ό μν΄ λ°μ½λ μ΄ν°λ₯Ό μ±ννλ κ²μ λ κΉλνκ³ , μ μ§λ³΄μνκΈ° μ¬μ°λ©°, λ κ²¬κ³ ν μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μμ±νκΈ° μν ν κ±Έμμ λλ€.