볡μ‘ν κ°μ²΄ ꡬμ±μ μν κ³ κΈ μλ°μ€ν¬λ¦½νΈ λͺ¨λ ν¨ν΄μ μ΄ν΄λ³΄μΈμ. λΉλ ν¨ν΄μ μ₯μ κ³Ό νμ₯ κ°λ₯νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ ν리μΌμ΄μ ꡬμΆμ μν μ€μ ꡬν μμ λ₯Ό μμλ΄ λλ€.
μλ°μ€ν¬λ¦½νΈ λͺ¨λ λΉλ λ©μλ: 볡μ‘ν κ°μ²΄ 쑰립
νλ μλ°μ€ν¬λ¦½νΈ κ°λ°μμ 볡μ‘ν κ°μ²΄λ₯Ό ν¨μ¨μ μΌλ‘ μμ±νκ³ κ΄λ¦¬νλ κ²μ νμ₯ κ°λ₯νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. λͺ¨λ λΉλ ν¨ν΄μ κ°μ²΄ μμ± λ‘μ§μ λͺ¨λ ꡬ쑰 λ΄μ μΊ‘μννλ κ°λ ₯ν μ κ·Ό λ°©μμ μ 곡ν©λλ€. μ΄ ν¨ν΄μ λͺ¨λμ±, κ°μ²΄ ꡬμ±, κ·Έλ¦¬κ³ λΉλ λμμΈ ν¨ν΄μ μ₯μ μ κ²°ν©νμ¬ μλ§μ μμ±κ³Ό μμ‘΄μ±μ κ°μ§ 볡μ‘ν κ°μ²΄μ μμ±μ λ¨μνν©λλ€.
μλ°μ€ν¬λ¦½νΈ λͺ¨λ μ΄ν΄νκΈ°
μλ°μ€ν¬λ¦½νΈ λͺ¨λμ κΈ°λ₯μ μΊ‘μννκ³ μνΈμμ©μ μν νΉμ μΈν°νμ΄μ€λ₯Ό λ ΈμΆνλ λ 립μ μΈ μ½λ λ¨μμ λλ€. λͺ¨λμ μ½λ ꡬμ±μ μ΄μ§νκ³ μ¬μ¬μ©μ±μ λμ΄λ©°, λ΄λΆ λ³μμ ν¨μμ λν λΉκ³΅κ° μ€μ½νλ₯Ό μ 곡νμ¬ μ΄λ¦ μΆ©λμ λ°©μ§ν©λλ€.
λͺ¨λ νμ
μμ¬μ μΌλ‘ μλ°μ€ν¬λ¦½νΈλ κ°κΈ° λ€λ₯Έ λ¬Έλ²κ³Ό κΈ°λ₯μ κ°μ§ λ€μν λͺ¨λ νμμ ν΅ν΄ λ°μ ν΄ μμ΅λλ€:
- IIFE (μ¦μ μ€ν ν¨μ ννμ): μ½λλ₯Ό μ¦μ μ€νλλ ν¨μλ‘ κ°μΈ λΉκ³΅κ° μ€μ½νλ₯Ό λ§λλ μ΄κΈ° μ κ·Ό λ°©μμ λλ€.
- CommonJS: Node.jsμμ λ리 μ¬μ©λλ λͺ¨λ μμ€ν
μΌλ‘,
require()μmodule.exportsλ₯Ό μ¬μ©νμ¬ λͺ¨λμ μ μν©λλ€. - AMD (λΉλκΈ° λͺ¨λ μ μ): λΈλΌμ°μ μμ λͺ¨λμ λΉλκΈ°μ μΌλ‘ λ‘λνκΈ° μν΄ μ€κ³λμμΌλ©°, RequireJSμ κ°μ λΌμ΄λΈλ¬λ¦¬μ ν¨κ» μμ£Ό μ¬μ©λ©λλ€.
- ES λͺ¨λ (ECMAScript λͺ¨λ): ES6 (ECMAScript 2015)μμ λμ
λ νμ€ λͺ¨λ μμ€ν
μΌλ‘,
importμexportν€μλλ₯Ό μ¬μ©ν©λλ€.
ES λͺ¨λμ νμ€νμ λΈλΌμ°μ λ° Node.jsμμμ λ€μ΄ν°λΈ μ§μ λλΆμ νμ¬ νλ μλ°μ€ν¬λ¦½νΈ κ°λ°μμ μ νΈλλ μ κ·Ό λ°©μμ λλ€.
λͺ¨λ μ¬μ©μ μ΄μ
- μ½λ ꡬμ±: λͺ¨λμ κ΄λ ¨ κΈ°λ₯μ λ³λμ νμΌλ‘ κ·Έλ£Ήννμ¬ κ΅¬μ‘°νλ μ½λλ² μ΄μ€λ₯Ό μ΄μ§ν©λλ€.
- μ¬μ¬μ©μ±: λͺ¨λμ μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμ΄λ μ¬λ¬ νλ‘μ νΈμμ μ½κ² μ¬μ¬μ©ν μ μμ΅λλ€.
- μΊ‘μν: λͺ¨λμ λ΄λΆ ꡬν μΈλΆ μ 보λ₯Ό μ¨κΈ°κ³ μνΈμμ©μ νμν μΈν°νμ΄μ€λ§ λ ΈμΆν©λλ€.
- μμ‘΄μ± κ΄λ¦¬: λͺ¨λμ μμ‘΄μ±μ λͺ μμ μΌλ‘ μ μΈνλ―λ‘ μ½λμ λ€λ₯Έ λΆλΆ κ°μ κ΄κ³λ₯Ό λ μ½κ² μ΄ν΄νκ³ κ΄λ¦¬ν μ μμ΅λλ€.
- μ μ§λ³΄μμ±: λͺ¨λνλ μ½λλ ν λͺ¨λμ λ³κ²½μ΄ μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμ μν₯μ λ―ΈμΉ κ°λ₯μ±μ΄ μ κΈ° λλ¬Έμ μ μ§λ³΄μ λ° μ λ°μ΄νΈκ° λ μ½μ΅λλ€.
λΉλ λμμΈ ν¨ν΄
λΉλ ν¨ν΄μ 볡μ‘ν κ°μ²΄μ μμ±κ³Ό ννμ λΆλ¦¬νλ μμ± λμμΈ ν¨ν΄μ λλ€. μ΄λ₯Ό ν΅ν΄ 볡μ‘ν κ°μ²΄λ₯Ό λ¨κ³λ³λ‘ ꡬμ±ν μ μμΌλ©°, μμ± κ³Όμ μ λν λ λ§μ μ μ΄κΆμ μ 곡νκ³ μμ±μκ° μλ§μ λ§€κ°λ³μλ‘ κ³ΌλΆνλλ 'μ μΈ΅μ μμ±μ λ¬Έμ (telescoping constructor problem)'λ₯Ό νΌν μ μμ΅λλ€.
λΉλ ν¨ν΄μ ν΅μ¬ κ΅¬μ± μμ
- λΉλ(Builder): κ°μ²΄μ λ€λ₯Έ λΆλΆμ λΉλνκΈ° μν λ©μλλ₯Ό μ μνλ μΈν°νμ΄μ€ λλ μΆμ ν΄λμ€μ λλ€.
- ꡬ체μ μΈ λΉλ(Concrete Builder): λΉλ μΈν°νμ΄μ€μ ꡬ체μ μΈ κ΅¬νμΌλ‘, κ°μ²΄ λΆλΆμ ꡬμ±νκΈ° μν νΉμ λ‘μ§μ μ 곡ν©λλ€.
- λλ ν°(Director): (μ ν μ¬ν) νΉμ μμλ‘ μ μ ν λΉλ λ©μλλ₯Ό νΈμΆνμ¬ κ΅¬μ± νλ‘μΈμ€λ₯Ό μ΄κ΄νλ ν΄λμ€μ λλ€.
- μ ν(Product): ꡬμ±λκ³ μλ 볡μ‘ν κ°μ²΄μ λλ€.
λΉλ ν¨ν΄ μ¬μ©μ μ΄μ
- κ°λ μ± ν₯μ: λΉλ ν¨ν΄μ κ°μ²΄ μμ± κ³Όμ μ λ μ½κΈ° μ½κ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
- μ μ°μ±: λμΌν μμ± κ³Όμ μ μ¬μ©νμ¬ κ°μ²΄μ λ€μν λ³νμ λ§λ€ μ μμ΅λλ€.
- μ μ΄λ ₯: μμ± κ³Όμ μ λν μΈλ°ν μ μ΄λ₯Ό μ 곡νμ¬ νΉμ μꡬ μ¬νμ λ°λΌ κ°μ²΄λ₯Ό λ§μΆ€ μ€μ ν μ μμ΅λλ€.
- 볡μ‘μ± κ°μ: μλ§μ μμ±κ³Ό μμ‘΄μ±μ κ°μ§ 볡μ‘ν κ°μ²΄μ μμ±μ λ¨μνν©λλ€.
μλ°μ€ν¬λ¦½νΈμμ λͺ¨λ λΉλ ν¨ν΄ ꡬννκΈ°
λͺ¨λ λΉλ ν¨ν΄μ μλ°μ€ν¬λ¦½νΈ λͺ¨λκ³Ό λΉλ λμμΈ ν¨ν΄μ μ₯μ μ κ²°ν©νμ¬ λ³΅μ‘ν κ°μ²΄λ₯Ό ꡬμΆνκΈ° μν κ²¬κ³ νκ³ μ μ°ν μ κ·Ό λ°©μμ λ§λλλ€. ES λͺ¨λμ μ¬μ©νμ¬ μ΄ ν¨ν΄μ ꡬννλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
μμ : μ€μ κ°μ²΄ λ§λ€κΈ°
μΉ μ ν리μΌμ΄μ μ μ€μ κ°μ²΄λ₯Ό λ§λ€μ΄μΌ νλ€κ³ μμν΄ λ³΄μΈμ. μ΄ κ°μ²΄μλ API μλν¬μΈνΈ, λ°μ΄ν°λ² μ΄μ€ μ°κ²°, μΈμ¦ 곡κΈμ λ° κΈ°ν μ ν리μΌμ΄μ λ³ κ΅¬μ±μ λν μ€μ μ΄ ν¬ν¨λ μ μμ΅λλ€.
1. μ€μ κ°μ²΄ μ μνκΈ°
λ¨Όμ , μ€μ κ°μ²΄μ ꡬ쑰λ₯Ό μ μν©λλ€:
// config.js
export class Configuration {
constructor() {
this.apiEndpoint = null;
this.databaseConnection = null;
this.authenticationProvider = null;
this.cacheEnabled = false;
this.loggingLevel = 'info';
}
// μ ν μ¬ν: μ€μ μ κ²μ¦νλ λ©μλ μΆκ°
validate() {
if (!this.apiEndpoint) {
throw new Error('API μλν¬μΈνΈλ νμμ
λλ€.');
}
if (!this.databaseConnection) {
throw new Error('λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ νμμ
λλ€.');
}
}
}
2. λΉλ μΈν°νμ΄μ€ λ§λ€κΈ°
λ€μμΌλ‘, λ€μν μ€μ μμ±μ μ€μ νκΈ° μν λ©μλλ₯Ό κ°λ΅μ μΌλ‘ μ€λͺ νλ λΉλ μΈν°νμ΄μ€λ₯Ό μ μν©λλ€:
// configBuilder.js
export class ConfigurationBuilder {
constructor() {
this.config = new Configuration();
}
setApiEndpoint(endpoint) {
throw new Error('λ©μλκ° κ΅¬νλμ§ μμμ΅λλ€.');
}
setDatabaseConnection(connection) {
throw new Error('λ©μλκ° κ΅¬νλμ§ μμμ΅λλ€.');
}
setAuthenticationProvider(provider) {
throw new Error('λ©μλκ° κ΅¬νλμ§ μμμ΅λλ€.');
}
enableCache() {
throw new Error('λ©μλκ° κ΅¬νλμ§ μμμ΅λλ€.');
}
setLoggingLevel(level) {
throw new Error('λ©μλκ° κ΅¬νλμ§ μμμ΅λλ€.');
}
build() {
throw new Error('λ©μλκ° κ΅¬νλμ§ μμμ΅λλ€.');
}
}
3. ꡬ체μ μΈ λΉλ ꡬννκΈ°
μ΄μ , λΉλ μΈν°νμ΄μ€λ₯Ό ꡬννλ ꡬ체μ μΈ λΉλλ₯Ό λ§λλλ€. μ΄ λΉλλ μ€μ μμ±μ μ€μ νκΈ° μν μ€μ λ‘μ§μ μ 곡ν©λλ€:
// appConfigBuilder.js
import { Configuration } from './config.js';
import { ConfigurationBuilder } from './configBuilder.js';
export class AppConfigurationBuilder extends ConfigurationBuilder {
constructor() {
super();
}
setApiEndpoint(endpoint) {
this.config.apiEndpoint = endpoint;
return this;
}
setDatabaseConnection(connection) {
this.config.databaseConnection = connection;
return this;
}
setAuthenticationProvider(provider) {
this.config.authenticationProvider = provider;
return this;
}
enableCache() {
this.config.cacheEnabled = true;
return this;
}
setLoggingLevel(level) {
this.config.loggingLevel = level;
return this;
}
build() {
this.config.validate(); // λΉλνκΈ° μ μ μ ν¨μ± κ²μ¬
return this.config;
}
}
4. λΉλ μ¬μ©νκΈ°
λ§μ§λ§μΌλ‘, λΉλλ₯Ό μ¬μ©νμ¬ μ€μ κ°μ²΄λ₯Ό λ§λλλ€:
// main.js
import { AppConfigurationBuilder } from './appConfigBuilder.js';
const config = new AppConfigurationBuilder()
.setApiEndpoint('https://api.example.com')
.setDatabaseConnection('mongodb://localhost:27017/mydb')
.setAuthenticationProvider('OAuth2')
.enableCache()
.setLoggingLevel('debug')
.build();
console.log(config);
μμ : μ¬μ©μ νλ‘ν κ°μ²΄ λ§λ€κΈ°
μ¬μ©μ νλ‘ν κ°μ²΄λ₯Ό λ§λλ λ λ€λ₯Έ μμ λ₯Ό κ³ λ €ν΄ λ³΄κ² μ΅λλ€. μ΄ κ°μ²΄μλ κ°μΈ μ 보, μ°λ½μ² μΈλΆ μ 보, μμ λ―Έλμ΄ λ§ν¬ λ° νκ²½ μ€μ μ΄ ν¬ν¨λ μ μμ΅λλ€.
1. μ¬μ©μ νλ‘ν κ°μ²΄ μ μνκΈ°
// userProfile.js
export class UserProfile {
constructor() {
this.firstName = null;
this.lastName = null;
this.email = null;
this.phoneNumber = null;
this.address = null;
this.socialMediaLinks = [];
this.preferences = {};
}
}
2. λΉλ λ§λ€κΈ°
// userProfileBuilder.js
import { UserProfile } from './userProfile.js';
export class UserProfileBuilder {
constructor() {
this.userProfile = new UserProfile();
}
setFirstName(firstName) {
this.userProfile.firstName = firstName;
return this;
}
setLastName(lastName) {
this.userProfile.lastName = lastName;
return this;
}
setEmail(email) {
this.userProfile.email = email;
return this;
}
setPhoneNumber(phoneNumber) {
this.userProfile.phoneNumber = phoneNumber;
return this;
}
setAddress(address) {
this.userProfile.address = address;
return this;
}
addSocialMediaLink(platform, url) {
this.userProfile.socialMediaLinks.push({ platform, url });
return this;
}
setPreference(key, value) {
this.userProfile.preferences[key] = value;
return this;
}
build() {
return this.userProfile;
}
}
3. λΉλ μ¬μ©νκΈ°
// main.js
import { UserProfileBuilder } from './userProfileBuilder.js';
const userProfile = new UserProfileBuilder()
.setFirstName('John')
.setLastName('Doe')
.setEmail('john.doe@example.com')
.setPhoneNumber('+1-555-123-4567')
.setAddress('123 Main St, Anytown, USA')
.addSocialMediaLink('LinkedIn', 'https://www.linkedin.com/in/johndoe')
.addSocialMediaLink('Twitter', 'https://twitter.com/johndoe')
.setPreference('theme', 'dark')
.setPreference('language', 'en')
.build();
console.log(userProfile);
κ³ κΈ κΈ°μ λ° κ³ λ € μ¬ν
ν루μΈνΈ μΈν°νμ΄μ€(Fluent Interface)
μμ μμ λ κ° λΉλ λ©μλκ° λΉλ μΈμ€ν΄μ€ μ체λ₯Ό λ°ννλ ν루μΈνΈ μΈν°νμ΄μ€μ μ¬μ©μ 보μ¬μ€λλ€. μ΄λ₯Ό ν΅ν΄ λ©μλ 체μ΄λμ΄ κ°λ₯ν΄μ Έ κ°μ²΄ μμ± κ³Όμ μ΄ λ κ°κ²°νκ³ κ°λ μ±μ΄ λμμ§λλ€.
λλ ν° ν΄λμ€ (μ ν μ¬ν)
κ²½μ°μ λ°λΌ λλ ν° ν΄λμ€λ₯Ό μ¬μ©νμ¬ κ΅¬μ± νλ‘μΈμ€λ₯Ό μ΄κ΄ν μ μμ΅λλ€. λλ ν° ν΄λμ€λ νΉμ μμλ‘ κ°μ²΄λ₯Ό λΉλνλ λ‘μ§μ μΊ‘μννμ¬ λ€λ₯Έ λΉλμ λμΌν κ΅¬μ± νλ‘μΈμ€λ₯Ό μ¬μ¬μ©ν μ μλλ‘ ν©λλ€.
// director.js
export class Director {
constructor(builder) {
this.builder = builder;
}
constructFullProfile() {
this.builder
.setFirstName('Jane')
.setLastName('Smith')
.setEmail('jane.smith@example.com')
.setPhoneNumber('+44-20-7946-0532') // μκ΅ μ νλ²νΈ
.setAddress('10 Downing Street, London, UK');
}
constructMinimalProfile() {
this.builder
.setFirstName('Jane')
.setLastName('Smith');
}
}
// main.js
import { UserProfileBuilder } from './userProfileBuilder.js';
import { Director } from './director.js';
const builder = new UserProfileBuilder();
const director = new Director(builder);
director.constructFullProfile();
const fullProfile = builder.build();
console.log(fullProfile);
director.constructMinimalProfile();
const minimalProfile = builder.build();
console.log(minimalProfile);
λΉλκΈ° μμ μ²λ¦¬νκΈ°
κ°μ²΄ μμ± κ³Όμ μ λΉλκΈ° μμ
(μ: APIμμ λ°μ΄ν° κ°μ Έμ€κΈ°)μ΄ ν¬ν¨λ κ²½μ°, λΉλ λ©μλ λ΄μμ async/awaitλ₯Ό μ¬μ©νμ¬ μ΄λ¬ν μμ
μ μ²λ¦¬ν μ μμ΅λλ€.
// asyncBuilder.js
import { Configuration } from './config.js';
import { ConfigurationBuilder } from './configBuilder.js';
export class AsyncConfigurationBuilder extends ConfigurationBuilder {
async setApiEndpoint(endpointUrl) {
try {
const response = await fetch(endpointUrl);
const data = await response.json();
this.config.apiEndpoint = data.endpoint;
return this;
} catch (error) {
console.error('API μλν¬μΈνΈλ₯Ό κ°μ Έμ€λ μ€ μ€λ₯ λ°μ:', error);
throw error; // μμμμ μ²λ¦¬ν μ μλλ‘ μλ¬λ₯Ό λ€μ λμ§
}
}
build() {
return this.config;
}
}
// main.js
import { AsyncConfigurationBuilder } from './asyncBuilder.js';
async function main() {
const builder = new AsyncConfigurationBuilder();
try {
const config = await builder
.setApiEndpoint('https://example.com/api/endpoint')
.build();
console.log(config);
} catch (error) {
console.error('κ΅¬μ± λΉλ μ€ν¨:', error);
}
}
main();
μ ν¨μ± κ²μ¬
κ°μ²΄κ° νμν κΈ°μ€μ μΆ©μ‘±νλμ§ νμΈνκΈ° μν΄ λΉλλκΈ° μ μ μ ν¨μ±μ κ²μ¬νλ κ²μ΄ μ€μν©λλ€. κ°μ²΄ ν΄λμ€λ λΉλ λ΄μ validate() λ©μλλ₯Ό μΆκ°νμ¬ μ ν¨μ± κ²μ¬λ₯Ό μνν μ μμ΅λλ€.
λΆλ³μ±
μ°λ°μ μΈ μμ μ λ°©μ§νκΈ° μν΄ κ°μ²΄κ° λΉλλ ν λΆλ³(immutable)μΌλ‘ λ§λλ κ²μ κ³ λ €ν΄ λ³΄μΈμ. Object.freeze()μ κ°μ κΈ°μ μ μ¬μ©νμ¬ κ°μ²΄λ₯Ό μ½κΈ° μ μ©μΌλ‘ λ§λ€ μ μμ΅λλ€.
λͺ¨λ λΉλ ν¨ν΄μ μ΄μ
- μ½λ κ΅¬μ± ν₯μ: λͺ¨λ λΉλ ν¨ν΄μ κ°μ²΄ μμ± λ‘μ§μ λͺ¨λ ꡬ쑰 λ΄μ μΊ‘μννμ¬ κ΅¬μ‘°νλ μ½λλ² μ΄μ€λ₯Ό μ΄μ§ν©λλ€.
- μ¬μ¬μ©μ± μ¦κ°: λΉλλ₯Ό μ¬μ¬μ©νμ¬ λ€μν ꡬμ±μ κ°μ²΄ λ³νμ λ§λ€ μ μμ΅λλ€.
- κ°λ μ± ν₯μ: λΉλ ν¨ν΄μ νΉν μλ§μ μμ±μ κ°μ§ 볡μ‘ν κ°μ²΄μ κ²½μ° κ°μ²΄ μμ± κ³Όμ μ λ μ½κΈ° μ½κ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
- μ μ°μ± μ¦λ: μμ± κ³Όμ μ λν μΈλ°ν μ μ΄λ₯Ό μ 곡νμ¬ νΉμ μꡬ μ¬νμ λ°λΌ κ°μ²΄λ₯Ό λ§μΆ€ μ€μ ν μ μμ΅λλ€.
- 볡μ‘μ± κ°μ: μλ§μ μμ±κ³Ό μμ‘΄μ±μ κ°μ§ 볡μ‘ν κ°μ²΄μ μμ±μ λ¨μννκ³ μ μΈ΅μ μμ±μ λ¬Έμ λ₯Ό νΌν©λλ€.
- ν μ€νΈ μ©μ΄μ±: κ°μ²΄ μμ± λ‘μ§μ λ 립μ μΌλ‘ ν μ€νΈνκΈ° λ μ½μ΅λλ€.
μ€μ μ¬μ© μ¬λ‘
- κ΅¬μ± κ΄λ¦¬: μΉ μ ν리μΌμ΄μ , API λ° λ§μ΄ν¬λ‘μλΉμ€λ₯Ό μν κ΅¬μ± κ°μ²΄ ꡬμΆ.
- λ°μ΄ν° μ μ‘ κ°μ²΄(DTO): μ ν리μΌμ΄μ μ λ€λ₯Έ κ³μΈ΅ κ°μ λ°μ΄ν°λ₯Ό μ μ‘νκΈ° μν DTO μμ±.
- API μμ² κ°μ²΄: λ€μν λ§€κ°λ³μμ ν€λλ₯Ό κ°μ§ API μμ² κ°μ²΄ ꡬμ±.
- UI μ»΄ν¬λνΈ μμ±: μλ§μ μμ±κ³Ό μ΄λ²€νΈ νΈλ€λ¬λ₯Ό κ°μ§ 볡μ‘ν UI μ»΄ν¬λνΈ κ΅¬μΆ.
- λ³΄κ³ μ μμ±: λ§μΆ€ν λ μ΄μμκ³Ό λ°μ΄ν° μμ€λ₯Ό κ°μ§ λ³΄κ³ μ μμ±.
κ²°λ‘
μλ°μ€ν¬λ¦½νΈ λͺ¨λ λΉλ ν¨ν΄μ λͺ¨λμμ΄λ©° μ μ§λ³΄μ κ°λ₯ν λ°©μμΌλ‘ 볡μ‘ν κ°μ²΄λ₯Ό ꡬμΆνκΈ° μν κ°λ ₯νκ³ μ μ°ν μ κ·Ό λ°©μμ μ 곡ν©λλ€. μλ°μ€ν¬λ¦½νΈ λͺ¨λκ³Ό λΉλ λμμΈ ν¨ν΄μ μ΄μ μ κ²°ν©ν¨μΌλ‘μ¨ λ³΅μ‘ν κ°μ²΄μ μμ±μ λ¨μννκ³ μ½λ ꡬμ±μ κ°μ νλ©° μ ν리μΌμ΄μ μ μ λ°μ μΈ νμ§μ ν₯μμν¬ μ μμ΅λλ€. μ€μ κ°μ²΄, μ¬μ©μ νλ‘ν λλ API μμ² κ°μ²΄λ₯Ό ꡬμΆνλ , λͺ¨λ λΉλ ν¨ν΄μ λ κ²¬κ³ νκ³ νμ₯ κ°λ₯νλ©° μ μ§λ³΄μ κ°λ₯ν μ½λλ₯Ό λ§λλ λ° λμμ΄ λ μ μμ΅λλ€. μ΄ ν¨ν΄μ λ€μν κΈλ‘λ² μ»¨ν μ€νΈμ λ§€μ° μ μ© κ°λ₯νλ©°, μ μΈκ³ κ°λ°μλ€μ΄ μ΄ν΄νκ³ μμ νλ©° νμ₯νκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ ν©λλ€.