í í늿 ìì§ì ì¬ì©í ìœë ìì±ì ìžê³ë¥Œ íííìžì. ìœë ìì±ì ìëííê³ , ìì°ì±ì ëìŽë©°, íë¡ì íž ì ë°ì ê±žì³ ìŒêŽì±ì ì ì§íë ë°©ë²ì ìì볎ìžì.
ìœë ìì±: í í늿 ìì§ì ëí í¬êŽì ìž ê°ìŽë
ìíížìšìŽ ê°ë°ì ëìììŽ ì§ííë í겜ìì íšìšì±ê³Œ ì ì§ êŽëЬì±ì ë§€ì° ì€ìí©ëë€. ìŽë¬í 묞ì 륌 íŽê²°íë ê°ë ¥í êž°ì ì€ íëë ìœë ìì±ì ëë€. ìœë ìì±ì ìì ìì€ ì€ëª ëë 몚ëžìì ìì€ ìœë, êµ¬ì± íìŒ ëë êž°í ìí°í©ížì ìì±ì ìëííë ê²ì í¬íší©ëë€. ìŽ ì ê·Œ ë°©ìì ê°ë° ìê°ì í¬ê² ì€ìŽê³ , ìœë ìŒêŽì±ì ê°ì íë©°, ì ì§ êŽëŠ¬ë¥Œ ëšìíí ì ììµëë€. ë§ì ìœë ìì± ìì€í ì íµì¬ìë í í늿 ìì§ìŽ ììµëë€. ìŽ í¬êŽì ìž ê°ìŽëë ìœë ìì±ìì í í늿 ìì§ì ìí , ìŽì , ìŒë°ì ìž ì í ë° ì€ì ì ì© ë¶ìŒë¥Œ í구í©ëë€.
í í늿 ìì§ìŽë 묎ìì ëê¹?
í í늿 ìì§ì í í늿ì ë°ìŽí° 몚ëžê³Œ ê²°í©íì¬ ì¶ë ¥ í ì€ížë¥Œ ìì±íëë¡ ì€ê³ë ìíížìšìŽ êµ¬ì± ììì ëë€. ìœë ìì±ì ë§¥ëœìì í í늿ì ëì ìœëì 구조ì 구묞ì ì ìíê³ ë°ìŽí° 몚ëžì í í늿ì ì±ì°ë ë° íìí í¹ì ê°ê³Œ ì 볎륌 ì ê³µí©ëë€. 볞ì§ì ìŒë¡ í í늿 ìì§ì ì¬ì ì ìë ì²ì¬ì§ê³Œ ëì ë°ìŽí°ë¥Œ êž°ë°ìŒë¡ ìœë륌 ìì±íë ìœë í©í 늬 ìí ì í©ëë€.
ë©ìŒ ë³í©ê³Œ ê°ì ë°©ììŒë¡ ìê°íììì€. íì€ ížì§(í í늿)ì ìŽëŠ ë° ì£Œì 목ë¡(ë°ìŽí° 몚ëž)ìŽ ììµëë€. ë©ìŒ ë³í© íë¡ìžì€ë ìŽë¥Œ ê²°í©íì¬ ê° ìì ìì ëí ê°ìžíë ížì§ë¥Œ ë§ëëë€. í í늿 ìì§ì ìœë륌 ì¬ì©íì¬ ëìŒí ìì ì ìíí©ëë€.
ìœë ìì±ì í í늿 ìì§ì ì¬ì©í멎 ìŽë€ ìŽì ìŽ ììµëê¹?
ìœë ìì±ì í í늿 ìì§ì ì¬ì©í멎 ëª ê°ì§ ì€ìí ìŽì ìŽ ììµëë€.
- ìì°ì± í¥ì: ìœë ìì±ì ìëíí멎 ê°ë°ìê° ë ë³µì¡íê³ ì°œìì ìž ìì ì ì§ì€í ì ììµëë€. ë°ë³µì ìž ìì©êµ¬ ìœë륌 ìì±íë ëì í í늿ì ì ìíê³ ëª ê°ì§ ê°ëší ëª ë ¹ìŒë¡ ìœë륌 ìì±í ì ììµëë€.
- ìœë ìŒêŽì± ê°ì : í í늿ì íì€íë 구조ì ì€íìŒì ì ì©íì¬ ìì±ë ìœëê° ìœë© ê·ì¹ ë° ëªšë² ì¬ë¡ë¥Œ ì€ìíëë¡ ë³Žì¥í©ëë€. ìŽë¬í ìŒêŽì±ì ìœë ê²í 륌 ëšìííê³ ì€ë¥ ë°ì ê°ë¥ì±ì ì€ì ëë€. ì ìžê³ì í©ìŽì ž ìë ëê·ëªš ê°ë° íì ììíŽ ë³Žììì€. í í늿 ìì§ì ì¬ì©í멎 ìì¹ì êŽê³ììŽ ëªšë ì¬ëìŽ ëìŒí ìœë© íì€ì ë°ë¥Žëë¡ ë³Žì¥í©ëë€.
- ì€ë¥ ê°ì: ë°ë³µì ìž ìì ì ìëìŒë¡ ìœë©íë ê²ì ì ê±°íšìŒë¡ìš í í늿 ìì§ì ì¬ëì ì€ë¥ ìíì ìµìíí©ëë€. í í늿ì ì² ì í í ì€ížëë©° ì€ë¥ê° ìë ê²œì° ì ìíê² ìë³íì¬ ìì í©ëë€.
- ì ì§ êŽëЬ ëšìí: ë³ê²œ ì¬íìŽ íìí ê²œì° ì¬ë¬ ìœë íìŒì ìëìŒë¡ ì ë°ìŽížíë ê²ë³Žë€ í í늿ì ìì íë ê²ìŽ íšì¬ ìœê³ ë¹ ëŠ ëë€. ìŽë ê² í멎 ìœë ì ì§ êŽëЬì êŽë šë ë¹ì©ê³Œ ë žë ¥ìŽ ì€ìŽëëë€. ìì±ë 몚ë íìŒìì ì ìê¶ ê³ ì§ë¥Œ ì ë°ìŽížíŽìŒ íë ê²œì° í í늿ì í ë²ë§ ë³ê²œí멎 ë©ëë€.
- ì¶ìí ë° êŽì¬ì¬ ë¶ëЬ: í í늿 ìì§ì ì¬ì©í멎 ìœëì 구조ì ë°ìŽí°ë¥Œ ë¶ëЬíì¬ ìœë륌 ë 몚ëííê³ ìŽíŽíêž° ìœê² ë§ë€ ì ììµëë€. ìŽë¬í êŽì¬ì¬ ë¶ëЬë ìœë êµ¬ì± ë° ì ì§ êŽëЬì±ì í¥ììíµëë€.
- ë ë¹ ë¥ž íë¡í íìŽí: í í늿 ìì§ì ì¬ì©í멎 ê°ë°ìê° ì ìíê² ìœë 곚격ì ìì±íê³ ë€ìí ëììžì ì€íí ì ììŒë¯ë¡ ì ìí íë¡í íìŽíìŽ ì©ìŽíŽì§ëë€.
ìŒë°ì ìž ì íì í í늿 ìì§
ë€ìí í í늿 ìì§ì ì¬ì©í ì ììŒë©°, ê°ê° ê³ ì í ê°ì 곌 ìœì ìŽ ììµëë€. ê°ì¥ ìžêž° ìë ìµì ì€ ìŒë¶ë¥Œ ìŽíŽë³Žê² ìµëë€.
Jinja2 (Python)
Jinja2ë Pythonì ìí ê°ë ¥íê³ ë늬 ì¬ì©ëë í í늿 ìì§ì ëë€. ì ì°ì±, ííë ¥ ìë 구묞 ë° ë°ìŽë ì±ë¥ìŒë¡ ì ëª í©ëë€. Jinja2ë í í늿 ìì, ìë HTML ìŽì€ìŒìŽí ë° ìëë°ì€ ì€í곌 ê°ì êž°ë¥ì ì§ìí©ëë€.
ìì:
í
í늿 (user.html):
<h1>User Profile</h1>
<p>Name: {{ user.name }}</p>
<p>Email: {{ user.email }}</p>
Python ìœë:
from jinja2 import Environment, FileSystemLoader
# Data
user = {
'name': 'Alice Smith',
'email': 'alice.smith@example.com'
}
# Load template environment
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('user.html')
# Render template
output = template.render(user=user)
print(output)
ì¶ë ¥:
<h1>User Profile</h1>
<p>Name: Alice Smith</p>
<p>Email: alice.smith@example.com</p>
FreeMarker (Java)
FreeMarkerë ì€ë«ëì ì¬ì©ëìŽ ìš Java êž°ë° í í늿 ìì§ìŽë©° ìì ì±ê³Œ êž°ë¥ ìžížë¡ ì ëª í©ëë€. ì¹ ì í늬ìŒìŽì ë° ìœë ìì± ë구ìì ì죌 ì¬ì©ë©ëë€.
ìì:
í
í늿 (user.ftl):
<h1>User Profile</h1>
<p>Name: ${user.name}</p>
<p>Email: ${user.email}</p>
Java ìœë:
import freemarker.template.*;
import java.io.*;
import java.util.*;
public class FreeMarkerExample {
public static void main(String[] args) throws Exception {
// Configuration
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDirectoryForTemplateLoading(new File("."));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setLogTemplateExceptions(false);
cfg.setWrapUncheckedExceptions(true);
cfg.setFallbackOnNullLoopVariable(false);
// Data
Map<String, Object> user = new HashMap<>();
user.put("name", "Alice Smith");
user.put("email", "alice.smith@example.com");
// Load template
Template template = cfg.getTemplate("user.ftl");
// Render template
StringWriter writer = new StringWriter();
template.process(user, writer);
System.out.println(writer.toString());
}
}
ì¶ë ¥:
<h1>User Profile</h1>
<p>Name: Alice Smith</p>
<p>Email: alice.smith@example.com</p>
Velocity (Java)
Velocityë FreeMarkerì ì ì¬í ë ë€ë¥ž Java êž°ë° í í늿 ìì§ì ëë€. ì¹ ì í늬ìŒìŽì ë° ë³Žê³ ì ë° êž°í í ì€íž êž°ë° ë¬žì륌 ìì±íë ë° ì죌 ì¬ì©ë©ëë€.
ìì:
í
í늿 (user.vm):
<h1>User Profile</h1>
<p>Name: $user.name</p>
<p>Email: $user.email</p>
Java ìœë:
import org.apache.velocity.VelocityContext;
import org.apache.velocity.Template;
import org.apache.velocity.app.VelocityEngine;
import java.io.*;
import java.util.*;
public class VelocityExample {
public static void main(String[] args) throws Exception {
// Initialize Velocity
VelocityEngine ve = new VelocityEngine();
ve.init();
// Data
VelocityContext context = new VelocityContext();
Map<String, Object> user = new HashMap<>();
user.put("name", "Alice Smith");
user.put("email", "alice.smith@example.com");
context.put("user", user);
// Load template
Template template = ve.getTemplate("user.vm");
// Render template
StringWriter writer = new StringWriter();
template.merge(context, writer);
System.out.println(writer.toString());
}
}
ì¶ë ¥:
<h1>User Profile</h1>
<p>Name: Alice Smith</p>
<p>Email: alice.smith@example.com</p>
Mustache ë° Handlebars (JavaScript)
Mustache ë° Handlebarsë JavaScript í겜ìì ìžêž° ìë ê°ë³ê³ ë¡ì§ìŽ ìë í í늿 ìì§ì ëë€. ê°ëší 구묞곌 ì¬ì© ížìì±ìŒë¡ ì ëª í©ëë€.
ìì (Handlebars):
í
í늿 (user.hbs):
<h1>User Profile</h1>
<p>Name: {{name}}</p>
<p>Email: {{email}}</p>
JavaScript ìœë:
const Handlebars = require('handlebars');
const fs = require('fs');
// Data
const user = {
name: 'Alice Smith',
email: 'alice.smith@example.com'
};
// Load template
const source = fs.readFileSync('user.hbs', 'utf8');
const template = Handlebars.compile(source);
// Render template
const output = template(user);
console.log(output);
ì¶ë ¥:
<h1>User Profile</h1>
<p>Name: Alice Smith</p>
<p>Email: alice.smith@example.com</p>
í í늿 ìì§ì ì¬ì©í ìœë ìì±ì ì€ì ì ì©
í í늿 ìì§ì êŽë²ìí ìœë ìì± ìì ì ì¬ì©í ì ììµëë€.
- ìì©êµ¬ ìœë ìì±: í í늿 ìì§ì íŽëì€ ì ì, ë°ìŽí° ì¡ìžì€ ê°ì²Ž(DAO) ë° API ìëí¬ìžížì ê°ì ë°ë³µì ìž ìœë 구조ì ìì±ì ìëíí ì ììµëë€.
- êµ¬ì± íìŒ ìì±: í í늿 ìì§ì ì¬ì ì ìë í í늿 ë° êµ¬ì± ë°ìŽí°ë¥Œ êž°ë°ìŒë¡ ë€ìí íì(ì: XML, JSON, YAML)ìŒë¡ êµ¬ì± íìŒì ìì±í ì ììµëë€. ì륌 ë€ìŽ, ë€ìí ì¹ ìë²ì ëí Nginx êµ¬ì± íìŒ ìì±.
- ì¬ì©ì ìží°íìŽì€ 구ì¶: í í늿 ìì§ì ì¬ì©ì ìží°íìŽì€ì ëí HTML, CSS ë° JavaScript ìœë륌 ìì±íë ë° ì¬ì©í ì ììµëë€. ìŽë ëì ì¹ íìŽì§ ë° ëªšë°ìŒ ì í늬ìŒìŽì ì ìì±íë ë° í¹í ì ì©í©ëë€.
- ë°ìŽí°ë² ìŽì€ ì€í€ë§ ìì±: í í늿 ìì§ì ë°ìŽí° 몚ëžì êž°ë°ìŒë¡ ë°ìŽí°ë² ìŽì€ í ìŽëž, ìžë±ì€ ë° ì ìœì ì ìíêž° ìí SQL ì€í¬ëŠœížë¥Œ ìì±í ì ììµëë€.
- ëë©ìž í¹ì ìžìŽ(DSL) 구í: í í늿 ìì§ì ê°ë°ìê° ë³µì¡í ë ŒëŠ¬ë¥Œ ë³Žë€ ê°ê²°íê³ ìœêž° ì¬ìŽ ë°©ììŒë¡ ííí ì ìëë¡ íë DSLì ë§ëë ë° ì¬ì©í ì ììµëë€. ê·žë¬ë©Ž í í늿 ìì§ìŽ DSL ìœë륌 ì€í ê°ë¥í ìœëë¡ ë³íí©ëë€. DSLì ë¹ìŠëì€ ê·ì¹ì ì ìíê±°ë ì¡°ì§ ëŽìì í¹ì ìì ì ìëííë ë° ì¬ì©í ì ììµëë€.
- API íŽëŒìŽìžíž ìë ìì±: API ì ì(ì: OpenAPI/Swagger)ê° ì£ŒìŽì§ë©Ž í í늿 ìì§ì ë€ìí íë¡ê·žëë° ìžìŽë¡ íŽëŒìŽìžíž SDK륌 ìì±íì¬ ìžë¶ APIìì íµí© íë¡ìžì€ë¥Œ ëšìíí ì ììµëë€.
- 묞ì ìì±: í í늿 ìì§ì ìœë 죌ì ëë ë°ìŽí° 몚ëžìì 묞ì륌 ìì±íì¬ ë¬žìê° ìµì ìíìŽê³ ìœëì ìŒì¹íëë¡ í ì ììµëë€.
- ìœë ì€ìºíŽë©: íë¡ì íž ì í(ì: ì¹ ì±, REST API)ì êž°ë°ìŒë¡ 믞늬 ì ìë ìœëì íšê» ìŽêž° íë¡ì íž êµ¬ì¡°(ëë í 늬, íìŒ) ìì±.
ì¬ë°ë¥ž í í늿 ìì§ ì í
ì ì í í í늿 ìì§ì ì ííë ê²ì ì¬ë¬ ììžì ë°ëŒ ë¬ëŒì§ëë€.
- íë¡ê·žëë° ìžìŽ: íë¡ê·žëë° ìžìŽì ížíëë í í늿 ìì§ì ì ííììì€.
- íë¡ì íž ì구 ì¬í: ìœë ìì± ìì ì ë³µì¡ì±ê³Œ ë€ìí í í늿 ìì§ìì ì ê³µíë êž°ë¥ì ê³ ë €íììì€.
- ì±ë¥: í¹í ë§ì ìì ìœë륌 ìì±íë ê²œì° ë€ìí í í늿 ìì§ì ì±ë¥ì íê°íììì€.
- 구묞 ë° ì¬ì© ížìì±: ë°°ì°ê³ ì¬ì©íêž° ì¬ìŽ êµ¬ë¬žì ê°ì§ í í늿 ìì§ì ì ííììì€.
- 컀뮀ëí° ì§ì: ê°ë ¥í 컀뮀ëí°ì ì¶©ë¶í 묞ì륌 ê°ì¶ í í늿 ìì§ì ì°ŸìŒììì€.
- 볎ì: í í늿ì ì ì± ìœëê° ì£Œì ëë ê²ì ë°©ì§íêž° ìíŽ ìëë°ì€ ì€í곌 ê°ì ì ì í 볎ì êž°ë¥ì í í늿 ìì§ìì ì ê³µíëì§ íìžíììì€. ì¬ì©ìê° ì첎 í í늿ì ì ìíëë¡ íì©íë ê²œì° í¹í ì€ìí©ëë€.
í í늿 ìì§ ì¬ì©ì ìí ëªšë² ì¬ë¡
í í늿 ìì§ ì¬ì©ì ìŽì ì ê·¹ëííë €ë©Ž ë€ì ëªšë² ì¬ë¡ë¥Œ ë°ë¥Žììì€.
- í í늿 ì ì€íê² ëììž: ìŽíŽíê³ ì ì§ êŽëЬíêž° ì¬ìŽ ì 구조íëê³ ì¬ì¬ì© ê°ë¥í í í늿ì ë§ëëë€.
- ë²ì êŽëЬ ì¬ì©: ë³ê²œ ì¬íì ì¶ì íê³ ë€ë¥ž ê°ë°ìì íì íêž° ìíŽ í í늿ì ë²ì êŽëЬ ìì€í ì ì ì¥íììì€.
- í í늿 ì² ì íê² í ì€íž: ì¬ë°ë¥ž ìœë륌 ìì±íëì§ íìžíêž° ìíŽ ë€ìí ë°ìŽí° 몚ëžë¡ í í늿ì í ì€íží©ëë€.
- í í늿 묞ìí: í í늿ì 목ì 곌 ì¬ì©ë²ì ì€ëª íë ëª ííê³ ê°ê²°í 묞ì륌 ì ê³µí©ëë€.
- í í늿ìì ë ŒëŠ¬ ë¶ëЬ: í í늿 ëŽì ë³µì¡í ë ŒëŠ¬ë¥Œ í¬íšíì§ ë§ììì€. ëì ë ŒëŠ¬ë¥Œ ë³ëì 몚ëë¡ ìŽëíê³ í í늿ìì ížì¶íììì€.
- í í늿 ìì ì¬ì©: ê³µíµ ììì êž°ë¥ì ê³µì íë í í늿 ê³ìžµì ìì±íêž° ìíŽ í í늿 ììì íì©íììì€. ìŽë ê² í멎 ìœë ì€ë³µìŽ ì€ìŽë€ê³ ì ì§ êŽëŠ¬ê° ëšìíë©ëë€.
- ì ë ¥ ë°ìŽí° ìì : êµì°š ì¬ìŽíž ì€í¬ëŠœí (XSS) 공격곌 ê°ì 볎ì ì·šìœì ì ë°©ì§íêž° ìíŽ íì ì ë ¥ ë°ìŽí°ë¥Œ ìì íììì€.
- êµì í(i18n) ê³ ë €: ìì±ë ìœëê° ì¬ë¬ ìžìŽë¥Œ ì§ìíŽìŒ íë ê²œì° ë€ë¥ž ìžìŽ íì ë° ë²ìì ìì©íëë¡ í í늿ì ì€ê³íììì€.
ê³ êž êž°ì
Ʞ볞 í í늿 ìŽìì êž°ë¥ì íµíŽ ìœë ìì± êž°ë¥ì ëì± í¥ììí¬ ì ìë ëª ê°ì§ ê³ êž êž°ì ìŽ ììµëë€.
- ë©í íë¡ê·žëë°: í í늿ì ì¬ì©íì¬ í í늿ì ìì±í©ëë€. ìŽë¥Œ íµíŽ ë§€ì° ì ì°íê³ ëì ìž ìœë ìì±ìŽ ê°ë¥í©ëë€.
- ëªšëž êž°ë° ê°ë°(MDD): ìœë ìì± íë¡ìžì€ì ì ë ¥ìŒë¡ ê³µì 몚ëž(ì: UML)ì ì¬ì©í©ëë€. ìŽë ê² í멎 ë ëì ìì€ì ì¶ìíê° ê°ë¥íê³ ë³µì¡í ìì€í ì ê°ë°ìŽ ëšìíë©ëë€. í í늿 ìì§ì ì¬ì©íì¬ UML ë€ìŽìŽê·žëšì ìœë 곚격ìŒë¡ ìë ë³ííë ëêµ¬ê° ììµëë€.
- ìœë ë³í: í í늿 ìì§ì ì¬ì©íì¬ êž°ì¡Ž ìœë륌 ë€ë¥ž íì ëë êµ¬ì¡°ë¡ ë³íí©ëë€. ìŽë ìœë륌 늬í©í ë§íê±°ë, ìë¡ìŽ êž°ì ë¡ ë§ìŽê·žë ìŽì íê±°ë, ë€ë¥ž íë«íŒì© ìœë륌 ìì±íë ë° ì ì©í ì ììµëë€.
볎ì ê³ ë € ì¬í
í í늿 ìì§ì ì¬ì©í ëë í¹í ì¬ì©ì ì ê³µ ë°ìŽí°ë¥Œ ì²ëЬíë ì í늬ìŒìŽì ìì 볎ììŽ ê°ì¥ ì€ìí©ëë€. ë€ìì ëª ê°ì§ 죌ì 볎ì ê³ ë € ì¬íì ëë€.
- ì ë ¥ ì íšì± ê²ì¬: í í늿 ìì§ì ì ë¬íêž° ì ì íì ì ë ¥ ë°ìŽí°ë¥Œ íìžíê³ ìì íììì€. ìŽë ì ì± ìœë ìœì ë° êž°í 볎ì ì·šìœì ì ë°©ì§íë ë° ëììŽ ë©ëë€.
- ìëë°ì±: í í늿ì êž°ë¥ì ì ííêž° ìíŽ ìëë°ì±ì ì§ìíë í í늿 ìì§ì ì¬ì©íììì€. ìŽë ê² í멎 í íëŠ¿ìŽ ë¯Œê°í 늬ìì€ì ì¡ìžì€íê±°ë ììì ìœë륌 ì€íí ì ììµëë€.
- ìŽì€ìŒìŽí: êµì°š ì¬ìŽíž ì€í¬ëŠœí (XSS) 공격ì ë°©ì§íë €ë©Ž ì¶ë ¥ ë°ìŽí°ë¥Œ ì ì íê² ìŽì€ìŒìŽííììì€.
- eval() ì¬ì© ë°©ì§: í
í늿ìì
eval()íšì ëë ìŽì ì ì¬í 구묞ì ì¬ì©íì§ ë§ììì€. ìŽë ìë¹í 볎ì ìíì ìŽëí ì ììµëë€. - í í늿 ìì§ì ìµì ìíë¡ ì ì§: 볎ì ì·šìœì ì íšì¹íê³ ìµì 볎ì êž°ë¥ì íì©íë €ë©Ž í í늿 ìì§ì ì êž°ì ìŒë¡ ìµì ë²ì ìŒë¡ ì ë°ìŽížíììì€.
ê²°ë¡
í í늿 ìì§ì ìœë ìì±ì ìëííê³ , ìì°ì±ì í¥ììí€ë©°, ìœë ìŒêŽì±ì ì ì§íêž° ìí ê°ë ¥í ë구ì ëë€. í í늿 ìì§ì ìŽì , ì í ë° ëªšë² ì¬ë¡ë¥Œ ìŽíŽíšìŒë¡ìš ê°ë°ìë ê°ë° ìí¬íë¡ì°ë¥Œ ê°ìííê³ ë ëì íì§ì ìíížìšìŽë¥Œ 구ì¶íêž° ìíŽ ìŽë¥Œ íì©í ì ììµëë€. ìíížìšìŽ ê°ë°ìŽ ê³ì ë°ì íšì ë°ëŒ í í늿 ìì§ì ì¬ì©í ìœë ìì±ì ë³µì¡ì±ì íŽê²°íê³ íšìšì±ì ê°ì íêž° ìí ì€ìí êž°ì ë¡ ëšì ìì ê²ì ëë€. ì ìžê³ì ìŒë¡ ìë¹ì€ë¥Œ ìííê² ì°ê²°íë API íŽëŒìŽìžížë¥Œ ìì±íë ê²ë¶í° êµì í ì 첎ìì ìœë ì€íìŒì íì€ííë ê²ê¹ì§, í í늿 ìì§ì ì¬ì©í멎 ê·ž ìŽì ìŽ ëª íí©ëë€. ìœë ìì±ì ìì©íê³ ê°ë° íë¡ìžì€ë¥Œ íì í ì ìë ì ì¬ë ¥ì ë°ííììì€.
ì¶ê° íìµ
- ì íí í í늿 ìì§(Jinja2, FreeMarker, Velocity, Mustache, Handlebars)ì ëí 묞ì륌 ìœìŽë³Žììì€.
- íë¡ê·žëë° ìžìŽ ë° íë ììí¬ì í¹ì í ìœë ìì± ë구륌 íìíììì€.
- ë€ìí ìœë ìì± êž°ì ì ì€ííê³ íìì ê°ì¥ ì í©í êž°ì ì ìë³íììì€.