ROM (Resource-Objective Mapping) ๋””์ž์ธ ๋…ผ์˜

11 views
Skip to first unread message

Hong MinHee

unread,
Mar 10, 2009, 11:20:27โ€ฏPM3/10/09
to vlastic-d...@googlegroups.com
๊น€์šฐ์Šน ๋‹˜์ด ๋ช‡๊ฐ€์ง€ ๋‚ด์šฉ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ”์ผ์„ ๋ณด๋‚ด์‹  ๊ฑด๋ฐ, ๋ฌธ์ œ๋œ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๋ถ€๋ถ„์„ ๋บ€ ๋‹ค์Œ ๋ฉ”์ผ๋ง๋ฆฌ์ŠคํŠธ๋กœ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.
๊ณต๊ฐœ์ ์œผ๋กœ ๋…ผ์˜ํ• ๋งŒํ•œ ์‚ฌํ•ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ์š”. ์ผ๋‹จ ์šฐ์Šน ๋‹˜์ด ์ด์•ผ๊ธฐํ•˜์‹  ์ด์Šˆ๊ฐ€ ์žˆ๊ณ , ๊ทธ์— ๋”ํ•ด์„œ ์ œ๊ฐ€ ์ตœ๊ทผ์— ์ƒ๊ฐํ•œ ์ด์Šˆ๊ฐ€
ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ „์ž์— ๋Œ€ํ•œ ์ œ ์ƒ๊ฐ์„ ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค ๊ฐ์ฒด ๋งคํ•‘์˜ ๊ตฌํ˜„์— ์žˆ์–ด์„œ, ํ˜„์žฌ ๊ฐ€์žฅ ์ด์Šˆ๊ฐ€ ๋˜๋Š” ์‚ฌํ•ญ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด
์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ณ ๋ฏผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ROM์˜ ์˜๋„๋Š” ์• ์ดˆ์— ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ REST์—์„œ ๋งํ•˜๋Š” HTTP ๋ฆฌ์†Œ์Šค ๊ด€์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š”
๋™์‹œ์—, ๊ทธ๊ฒƒ์„ ์ž๋™์ ์œผ๋กœ ํ•ด๋‹น ์–ธ์–ด์˜ ๊ฐ์ฒด ๋ชจ๋ธ๋กœ ๋ดค์„ ๋•Œ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ด๊ฒ ์ฃ .
(๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ROM์˜ ์˜๋„์ด๊ธด ํ•˜์ง€๋งŒ, ๊ทธ ์˜๋„ ์ž์ฒด๊ฐ€ โ€œ์™œโ€ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ง์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด์—
๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.) ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” Vlastic ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Python 3.0์ด๋ผ๋Š” ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜๊ณ 
์žˆ๊ณ , Python์€ ๊ทธ ํŠน์œ ์˜ ๊ฐ์ฒด ๋ชจ๋ธ์„ ์ง€๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์„œ ํ’๊ธฐ๋Š” ๋ƒ„์ƒˆ๋„ ์ œ๋ฒ• ๋…ํŠนํ•œ ํŽธ์ž…๋‹ˆ๋‹ค.

(ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ) Python ๊ฐ์ฒด๋Š” ๋Œ€๊ฐœ ์ ‘๊ทผ์ž ๋”ฐ์œ„ ์—†์ด ๋‚ด๋ถ€ ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ plain
object์˜ ๋ชจ์Šต์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C++/Java ๋“ฑ์—์„œ ์ ‘๊ทผ์ž๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š”, ํŠน์ • ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ํ–‰์œ„์— ์ถ”ํ›„ ๋‹ค๋ฅธ
ํ–‰์œ„๊ฐ€ ์ถ”๊ฐ€๋ ์ง€๋„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๊ฒ ์ฃ . ๋‚ด๋ถ€ ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ณต์šฉ(public)์œผ๋กœ ๋‘๊ณ  ๋””์ž์ธํ•˜๋ฉด, ๋‚˜์ค‘์— ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ
ํ•ด๋‹น ์• ํŠธ๋ฆฌ๋ทฐํŠธ์— ์ ‘๊ทผํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ™์€ ๊ฒฝ์šฐ๋ผ๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์ด ์ „ํ˜€
์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ๋”์šฑ ์‹ฌ๊ฐํ•ด์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ C#์ด๋‚˜ Python ๊ฐ™์€ ๊ฒฝ์šฐ ์–ด์ฐจํ”ผ ํ”„๋กœํผํ‹ฐ๋ผ๋Š” ์ข‹์€ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋‹ˆ
์ฒ˜์Œ๋ถ€ํ„ฐ ๊ทธ๋Ÿฐ ๊ฑฑ์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์–ธ์–ด๋“ค ์‚ฌ์ด์— ์ด๋Ÿฐ ๊ฐ์ฒด ๋””์ž์ธ์— ๋Œ€ํ•œ ํŒจํ„ด์ด ๋‹ค๋ฅด๊ฒŒ ํ˜•์„ฑ๋˜์ง€ ์•Š์•˜์„๊นŒ ํ•˜๋Š”
์ƒ๊ฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ROM์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ๊ฐ ๋ฆฌ์†Œ์Šค์˜ ์ž์‹ ๋ฆฌ์†Œ์Šค(๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, /child์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ ‘๊ทผ๋˜๋Š” ๊ฒƒ ๋ง์ž…๋‹ˆ๋‹ค)์˜
์ ‘๊ทผ์„ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•  ๋•Œ,

using vlastic;

class person: rom::resource<person> {
picture_list get_pictures() const { ... }
post_list get_posts() const { ... }
};

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ํŽธ์ด (์•„๋งˆ๋„) ์ž์—ฐ์Šค๋Ÿฌ์› ์„ ๊ฒƒ์ด๊ณ , HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑโ€ฆ)์— ๋Œ€ํ•ด
rom::resource::get(), rom::resource::post() ๊ฐ™์€ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ๋„ ๋” ์‰ฝ์ง€ ์•Š์•˜์„๊นŒ
ํ•˜๋Š” ์ƒ๊ฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ๋ฆฌ์†Œ์Šค์˜ ์ ‘๊ทผ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜์— get_์ด๋ผ๋Š” ์ ‘๋‘์‚ฌ๊ฐ€ ํ•ญ์ƒ ๋ถ™๊ฒŒ ๋˜์–ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฌธ์ œ๊ฐ€
์‚ฌ๋ผ์กŒ๊ฒ ์ฃ .

(HTTP์˜ GET, POST, PUT, DELETE ๊ฐ™์€ ๋ฉ”์„œ๋“œ์™€ OOP์—์„œ์˜ ๊ฐ์ฒด ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์ดํ•˜์—์„œ ํ›„์ž๋Š”
๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ผ๊ณ ๋งŒ ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

from vlastic import rom

class Person(rom.Resource):
@property
def pictures(self):
...

@property
def posts(self):
...

์ œ๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ์€ ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ์ฒด์˜ ์• ํŠธ๋ฆฌ๋ทฐํŠธ/ํ”„๋กœํผํ‹ฐ๋ฅผ ์ž์‹ ๋ฆฌ์†Œ์Šค์˜ ์ ‘๊ทผ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์˜€๋Š”๋ฐ, ๋ฌธ์ œ๋Š” Python
๊ฐ์ฒด ๋ชจ๋ธ์€ Lisp-1 vs Lisp-2 debate[1]์—์„œ ๋งํ•˜๋Š” Lisp-1์— ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฆ‰, ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„
ํ•จ์ˆ˜๋„ ์‚ฌ์‹ค์€ ํ•ด๋‹น ์ด๋ฆ„์˜ ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋กœ ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์žˆ์„ ๋ฟ์ด๋ฏ€๋กœ resource.get(), resource.post()
๊ฐ™์€ ์‹์œผ๋กœ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•œ ๋ณ„๋„ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๊ฒฝ์šฐ /get, /post์— ํ•ด๋‹นํ•˜๋Š” ์ž์‹ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜๊ฐ€
์—†๊ฒŒ ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•˜์ง€๋งŒ ์–ด๋ ค์šด ๋ง์„ ์“ฐ์ž๋ฉด, ์ €ํฌ๊ฐ€ ํ•„์š”ํ•œ ์…€์€ ๋‘ ๊ตฌ์—ญ(HTTP ๋ฉ”์„œ๋“œ, ์ž์‹ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„)์ธ๋ฐ
๋งตํ•‘ํ•  Python ๊ฐ์ฒด์—๋Š”, ์ง€๊ธˆ๊นŒ์ง€๋Š”, ์ผ๋‹จ ์…€์ด ํ•˜๋‚˜(์• ํŠธ๋ฆฌ๋ทฐํŠธ)์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ฃ .

๊ทธ๋Ÿฐ ๋ฉด์—์„œ ์šฐ์Šน ๋‹˜์ด ์ œ์•ˆํ•˜์‹  ๋ฐฉ๋ฒ•์€ ์ด ๋ฌธ์ œ๋ฅผ ๊ฝค๋‚˜ ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒจ์ž ์—ฐ์‚ฐ์ž๋Š” ํ™•์‹คํžˆ ๋˜๋‹ค๋ฅธ
๋„ค์ž„์ŠคํŽ˜์ด์Šค ์…€์ด์ฃ . ๊ฒŒ๋‹ค๊ฐ€ get/set/del์— ๋Œ€ํ•œ ํ™•์‹คํ•œ ํ†ต์ œ๊ถŒ๋„ ์šฐ๋ฆฌ์—๊ฒŒ ์žˆ๊ณ ์š”. ๊ทธ๋ ‡์ง€๋งŒ Python ๊ฐ์ฒด์™€
๋ฆฌ์†Œ์Šค๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งตํ•‘ํ•œ๋‹ค๋Š” ์ ์—์„œ โ€œ์ž์—ฐ์Šค๋Ÿฌ์›€โ€์€ ๋งŽ์ด ๋–จ์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์–ด๋–ป๊ฒŒ๋“  ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”
๋ฐฉํ–ฅ์ด ๋งž์„ ๊ฒƒ ๊ฐ™์•„์š”.

๋ฌธ์ œ๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ HTTP ๋ฉ”์„œ๋“œ๋“ค์„ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•˜๋ƒ์ธ๋ฐ, ์ด๊ฒŒ ๊ตฌํ˜„ ์ƒ์— ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋ฉด ๊ทธ๋ƒฅ inspect ๋ชจ๋“ˆ์„
์จ์„œ ํ”„๋ ˆ์ž„์„ ํ•ดํ‚นํ•˜๋Š” ๊ฒŒ ๋‚˜์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ๋Š” ์“ฐ๊ธฐ ํŽธํ•˜๋‹ˆ๊นŒ์š”.

์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์— ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ, if๋‚˜ for์™€ ๊ฐ™์€ Python ์˜ˆ์•ฝ์–ด๋ฅผ URL๋กœ ๋…ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋Š”
์ ์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. __getattr__์ด๋‚˜ __getattribute__๋ฅผ ์“ฐ๊ณ , ๋Œ€์ž…ํ•  ๋•Œ๋Š”
setattr ๋”ฐ์œ„๋ฅผ ์“ฐ๋ฉด ๋˜๊ฒ ์ฃ . ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” if๋ฅผ when ๊ฐ™์€ ๋‹จ์–ด๋กœ ๋ฐ”๊พธ๋Š” ๊ฒŒ ๋‚ซ๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.

if๊ฐ€ ๊ผญ if์—ฌ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ํƒœ๊ทธ๋ผ๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž ์•„์ด๋””์ผ ์ˆ˜๋„ ์žˆ์ฃ . ํ›„์ž์—์„œ๋Š” Python ์˜ˆ์•ฝ์–ด๋Š” ์‚ฌ์šฉ ๋ชปํ•˜๊ฒŒ
ํ•œ๋‹ค๊ฑฐ๋‚˜ ์ค‘๋ณต๋œ๋‹ค๋Š” ์‹์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋‚ด์„œ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ํƒœ๊ทธ๋Š” ๊ทธ๋Ÿฌ๋ฉด ์•ˆ๋˜๊ฒ ์ฃ .

/tags/if

์ด๊ฑธ ๋งตํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ์š”? ์ œ๊ฐ€ ์ฒ˜์Œ์— ์ƒ๊ฐํ–ˆ๋˜ ํ•ด๊ฒฐ ๋ฐฉ์‹์€ ๊ฝค ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฐ์ฒด๋กœ ๋ณด์ด์ง€๋„ ์•Š๊ตฌ์š”.

from vlastic.rom import Resource

class Home(Resource):
def __init__(self):
self.tags = TagList()

class TagList(Resource):
def __getattribute__(self, tag):
return Tag(tag)

class Tag(Resource):
def __init__(self, name):
self.name = name

...

main = Home()

/tags/for๋ผ๋Š” URL๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด getattr(main.tags, "for")๋ฅผ ์‹œ๋„ํ•œ๋‹ค๋Š” ๊ฑฐ์ฃ . ๋‚ด๋ถ€์ ์œผ๋กœ๋Š”
์–ด์ฐจํ”ผ getattr๋งŒ์„ ์‚ฌ์šฉํ•˜๋‹ˆ ์‚ฌ์‹ค์€ getattr(getattr(main, "tags"), "for")๊ฐ€ ๋งž๊ฒ ์ฃ . ์ฐธ๊ณ ๋กœ
__getattr__๊ณผ ๋‹ฌ๋ฆฌ __getattribute__๋Š” ํ•ด๋‹น ๊ฐ์ฒด์— ์กด์žฌํ•˜๋Š” ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๊ฐ€์žฅ ๋จผ์ € ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ main.tags๋Š” TagList ์ธ์Šคํ„ด์Šค์ด๊ณ , TagList๋Š” ์ผ์ข…์˜ ๋ฌธ์ž์—ด์„ ํ‚ค๋กœ ๊ฐ€์ง€๋Š”
์œ ์‚ฌ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ๋งž์€๋ฐ, ์–ด๋А ๋‚˜๋ผ Python ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ dict.key ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋ƒ๋Š” ๊ฑฐ์ฃ . ์ „ํ˜€ ์ž์—ฐ์Šค๋Ÿฝ์ง€
์•Š์ฃ . dict["key"]๊ฐ€ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์• ํŠธ๋ฆฌ๋ทฐํŠธ์™€ ๋‹ฌ๋ฆฌ ์ฒจ์ž ์—ฐ์‚ฐ์ž๋Š” ๊ทธ ์•ˆ์— ์–ด๋–ค ๊ฒƒ์ด ๋“ค์–ด๊ฐˆ์ง€๋Š” ๋Ÿฐํƒ€์ž„์—
๊ฒฐ์ •๋œ๋‹ค๋Š” ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ์ถฉ๋ถ„ํžˆ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. ๊ฐ์ฒด ๋ชจ์–‘๋งŒ ๋ดค์„ ๋•Œ๋„ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ๊ณ ์š”.

๊ฒฐ๊ตญ ๋น„์Šทํ•œ ๊ฒฐ๋ก ์ด๊ธด ํ•œ๋ฐ, ์ œ ์ƒ๊ฐ์—๋Š” DictionaryResource๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ, ๊ทธ๊ฒƒ์„
์„œ๋ธŒํด๋ž˜์‹ฑํ•  ๋•Œ๋Š” __getitem__ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ์ƒ์† ๋ฐ›์œผ๋ฉด ์ž์‹ ๋ฆฌ์†Œ์Šค๋ฅผ
์ฐพ์„ ๋•Œ ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ „ํ˜€ ๋’ค์ง€์ง€ ์•Š๊ณ , ์˜ค์ง ์ฒจ์ž ์—ฐ์‚ฐ์ž์—์„œ๋งŒ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํƒœ๊ทธ ์ด๋ฆ„์ด๋‚˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š”
๊ฒฝ์šฐ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ถ„๋“ค ์ƒ๊ฐ์€ ์–ด๋–ค์ง€ ์•Œ๊ณ  ์‹ถ๋„ค์š”.

๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜, (๊ธ€์ด ๊ธธ์–ด์ง€์ง€๋งŒ,) ์ œ๊ฒŒ ๋– ์˜ค๋ฅธ ์ด์Šˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ์ดˆ์— ์ œ๊ฐ€ ๋ฆฌ์†Œ์Šค๋Š” Python์—์„œ ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด๋กœ๋„
์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
/tags/abc/authors?page=3๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š”๋ฐ,

authors = AuthorList()
req = http.Request("GET", "/tags/abc/authors?page=3")
req.back_component = ["tags", "abc"]
result = authors(req)
assert "<strong>abc</strong>" in result
assert "Total authors: <strong>37</strong>" in result

์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ ๋ณด๋‹ค๋Š”,

result = main.tags["abc"].authors(page=3)
assert "abc" == result["tag_name"]
assert 37 == result["total_authors"]

์ด์ชฝ์ด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ , ํŽธํ•˜๊ณ , ์ˆ˜์ •์ด ์šฉ์ดํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ. ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์ค‘์— ํ•˜๋‚˜๊ฐ€

@resource
def authors(self, page=1):
...
return {"tag_name": self.tag.name, "total_authors": ...}


์ด๋Ÿฐ ์‹์œผ๋กœ, ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์˜ ๊ฐ ํ‚ค๋“ค์„ Python ํ‚ค์›Œ๋“œ ์ธ์ž๋กœ ๋งตํ•‘ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋ฆฌ์†Œ์Šค
๊ฐ์ฒด๋Š” request๋ฅผ ๋ฐ›๊ณ  response๋ฅผ ๋‚ด์ฃผ๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด์—ฌ์•ผ ํ•˜๋Š”๋ฐ ํ‚ค์›Œ๋“œ ์ธ์ž๋ฅผ ๋ฐ›์•„์„œ dict๋ฅผ ๋‚ด์ฃผ๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜๋ƒ๋Š”
๊ฒ๋‹ˆ๋‹ค. ์•„์ง ํ•ด๊ฒฐ๋œ ๊ฒƒ์€ ์•„๋‹Œ๋ฐ ํ‚ค์›Œ๋“œ ์—†์ด request ๊ฐ์ฒด ํ•˜๋‚˜๋งŒ ์ „๋‹ฌ๋  ๊ฒฝ์šฐ์—๋Š” resource ํ•จ์ˆ˜๋กœ ์ž‘๋™ํ•˜๊ณ ,
ํ‚ค์›Œ๋“œ ์ธ์ž๊ฐ€ ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ์ธ์ž๊ฐ€ ์—†์œผ๋ฉด ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ์˜ค๋ฒ„๋กœ๋”ฉ๋˜๊ฒŒ ํ•˜๋ฉด ์–ด๋–จ๊นŒ ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค. ๋”
์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ƒ๊ฐ์ด ๋‚˜์ง€ ์•Š๋„ค์š”.

[1] http://www.nhplace.com/kent/Papers/Technical-Issues.html

2009๋…„ 3์›” 2์ผ (์›”) ์˜คํ›„ 7:38, ๊น€์šฐ์Šน <lohas...@gmail.com>๋‹˜์˜ ๋ง:
> http://hg.ruree.net/~dahlia/vlastic ๋ฅผ ๋ณด์‹œ๋ฉด ํ™๋ฏผํฌ์”จ๊ฐ€
> ๋Œ€๋Œ€์ ์œผ๋กœ ์ˆ˜์ˆ ํ•˜์‹  rom์ด ์žˆ์Šต๋‹ˆ๋‹ค.
> ์–ด์ œ ํ™๋ฏผํฌ์”จ์™€ ์ž‘์—…์„ ํ•˜๋ฉด์„œ ๋งŽ์€ ๊ฒƒ์„ ๋А๊ผˆ๊ณ , ๋‹ค๋ฅธ ๋Œ€์•ˆ๋„ ์ด๊ฒƒ ์ €๊ฒƒ ์ƒ๊ฐํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
>
> ๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜ ์˜ค์ „์— ๊ทธ ๋А๋‚Œ๋“ค์„ ์ •๋ฆฌํ•ด์„œ ๋‚ด๋ฆฐ ์ œ ๊ฒฐ๋ก ์€
> ์ƒ๊ฐ๋งŒํผ ๊ฐ์ฒด๊ตฌ์กฐ๊ฐ€ Request ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Resource ๊ตฌ์กฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
>
> ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋ฉด์„œ ๊ณ„์†ํ•ด์„œ ๊ณ ๋ฏผํ•ด์˜จ ์ ์ด ์ด๋ฆ„๊ณต๊ฐ„ ์ถฉ๋Œ๋ฌธ์ œ๋ผ๋Š” ์ ์€ ๋‹ค๋“ค ์ตํžˆ ์•„์‹ค ๊ฒ๋‹ˆ๋‹ค.
> ์ด ๋ฌธ์ œ์˜ ๋ฐœ์ƒ์€ ๊ฒฐ๊ตญ ๊ฐ์ฒด์˜ ์ด๋ฆ„๊ณต๊ฐ„์ด ํ•˜์œ„๊ฐ์ฒด๋“ค๊ณผ messeage ์ฒ˜๋ฆฌ์ž(์ฆ‰ method)์˜ ์ด๋ฆ„๊ณต๊ฐ„์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ์—์„œ
> ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
> ์•Œ๋‹ค์‹œ๋ฏธ HTTP message๋Š” ์ด๋ฅผ ๋ถ„๋ช…ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  ์žˆ์ง€์š”.
> GET /BBS/QnA ์ด๊ฒƒ์€ /BBS/QnA/GET ์ด ๋˜์ง€๋Š” ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์ผ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด
> BBS.QnA.GET ํ˜•ํƒœ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ์•Œ๋‹ค์‹œํ”ผ QnA๊ฐ€ ํ•˜์œ„๊ฐ์ฒด๋ฅผ ๊ฐ€์ง„๋‹ค๋ฉด ๊ทธ ํ•˜์œ„๊ฐ์ฒด์˜ ์ด๋ฆ„์ด GET์ด ๋˜๋Š” ๊ฒƒ์„
> HTTP message์—์„œ๋Š” ๋ง‰์ง€๋ฅผ ์•Š์ง€์š”. ๋” ํฐ ๋ฌธ์ œ๋Š” ์ค‘๊ฐ„ ์–ด๋А path component์—์„œ๋„ HTTP METHOD์˜ ์ด๋ฆ„์„ ์“ธ
> ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
> ์‹ค์šฉ์ ์œผ๋กœ ์ด๋ฏธ ๋„๋ฆฌ ์“ฐ์ด๋Š” /Blog/post/1 ์˜ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” blog์˜ post ๋ชจ์Œ์ค‘ ์ฒซ๋ฒˆ์งธ๋ฅผ ์ฐพ์ž๋Š” ๊ฒƒ์ธ๋ฐ
> Blog.post.1๋กœ ๊ฐ์ฒด์น˜ํ™˜ํ˜•ํƒœ๊ฐ€ ๋˜๋ฉด์„œ ์ค‘๊ฐ„ POST๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” message ์ฒ˜๋ฆฌ์ž์ธ์ง€ ์•„๋‹ˆ๋ฉด POST๋ฅผ ๋งํ•˜๋Š” ์ค‘๊ฐ„ ๊ฐ์ฒด์ธ์ง€ ์•Œ
> ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
>
> ๋˜ ํ•œ๊ฐ€์ง€๋Š” programming ์–ธ์–ด๋Š” ํ’๋ถ€ํ•œ ๊ตฌ๋ฌธ์„ ์œ„ํ•˜์—ฌ ๋งŽ์€ ์ฐธ์กฐ์ž์˜ ์ด๋ฆ„์— ๋งŽ์€ ์ œ์•ฝ์ด ๋”ฐ๋ฅธ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
> ๋‹น์—ฐํžˆ keywords ์ฆ‰ if, else, elif, import ํ˜•ํƒœ๋Š” ๊ฐ์ฒด์ฐธ์กฐ์ด๋ฆ„์— ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์ˆ˜ํ˜•ํƒœ๋„ ์“ธ ์ˆ˜
> ์—†์ง€์š”.
> /Blog/tag/if ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” if๋ผ๋Š” tag๊ฐ€ ๋ถ™์€ ๋ชจ๋“  post ๋“ค์ผ๊ฒ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Blog.tag.if ๋Š” Python์ด
> ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ์ง€์š”.
> Blog.post.1์€ ๋‹จ์ง€ METHOD์™€ ์ด๋ฆ„ ์ถฉ๋Œ๋งŒ์ด ์•„๋‹ˆ๋ผ 1์ด๋ผ๋Š” ์ƒ์ˆ˜๊ฐ€ ๊ฐ์ฒด์ฐธ์กฐ์ด๋ฆ„์œผ๋กœ ์“ธ ์ˆ˜ ์—†๋‹ค๋Š” ์ ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
> ๊ฑฐ๊พธ๋กœ ์ด์•ผ๊ธฐํ•˜์ž๋ฉด resource์—๋Š” ์ƒ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— resource ์ด๋ฆ„์— ์ œ์•ฝ์ด ๊ฐ€ํ•ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”. :-(
>
> ๊ฐ์ฒด๊ตฌ์กฐ๊ฐ€ resource ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ ๋ชปํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋กœ resource๋กœ ์ธํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ๊ฐ–๋Š” ์žฅ์ ์„ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
> ๊ฐ™์€ class ์ธ ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ž„์„ ์ธ์ง€ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” member ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๊ณค๋ž€ํ•ด์ง‘๋‹ˆ๋‹ค.
> ์ฆ‰ OnlineDocument ๋ผ๋Š” class๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด BBS์™€ Blog๋Š” OnlineDocument๋ฅผ ์ƒ์†๋ฐ›์€
> class๋“ค์ผ ์ˆ˜๋„ ์žˆ๊ณ 
> OnlineDocumnet์˜ ๊ฐ์ฒด๋กœ์„œ ๋ช‡๊ฐ€์ง€ ๋‹ค๋ฅธ member๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
> Member๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ์ฒด์ด๋“  method์ด๋“  ๊ฐ™์€ ๊ธฐ์›์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๊ตฌ๋ณ„์„ ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํŠน์ง•์„ ๋ถ€์—ฌํ•ด ์ค๋‹ˆ๋‹ค.
> ํ•˜์ง€๋งŒ Resource ์ด๋ฆ„๋“ค์˜ ๋ฌด์ œ์•ฝ์œผ๋กœ ์ธํ•˜์—ฌ ์ด๋Ÿฐ ๊ฐ์ฒด๋“ค์˜ member ์ด๋ฆ„๋“ค์„ ์ฃผ๊ธฐ๊ฐ€ ๊ณค๋ž€ํ•ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
> ๋งŒ์ผ member์™€ ๋™์ผํ•œ ์ด๋ฆ„์˜ resource๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด ๊ธฐ์กด ๊ฐ์ฒด์˜ member๋Š” ์ง€์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
> ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ํ’๋ถ€ํ•œ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ๋‹ค์–‘ํ•œ message๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
> ์šฐ๋ฆฌ๋Š” ๋ณธ๋ž˜ /BBS/Obama ์™€ /Blog/Obama๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ์‘๋‹ต๊ฐ์ฒด ํ˜น์€ ๋ฌธ์„œ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
> ์ฆ‰ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๊ธฐ๋Œ€ํ•˜์ฃ . ํ•˜์ง€๋งŒ resource ์ด๋ฆ„์˜ ๋ฌด์ œ์•ฝ์€ ๊ฐ์ฒด์— ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ์ฃผ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ฌ์œผ๋กœ์จ ์ด๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
>
> ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋“ค์€ ๋ชจ๋‘ ๋ณตํ•ฉ pattern์— ์˜ํ•˜์—ฌ ๊ฐ์ฒด๊ตฌ์กฐ์™€ Resource ๊ตฌ์กฐ์˜ ์œ ์‚ฌ์„ฑ์„ ๋ณด๊ณ  ๋™์ผํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์ง€๋งŒ
> ๊ธฐ์กด programming ์–ธ์–ด(Python)๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋งŽ์€ ํŠน์ง•๋“ค๋กœ ์ธํ•˜์—ฌ ์–ธ์–ด์™€ ํ†ตํ•ฉ๋˜๋ฉด์„œ ๋งŽ์€ ์ œ์•ฝ์„ ๊ฐ€์ง€๊ฒŒ ๋œ
> ๊ฐ์ฒด๊ตฌ์กฐ์— resource ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
>
> ๊ทธ๋Ÿผ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ผ๊นŒ์š”? ๋ฐฉ๋ฒ•์€ ์–ธ์ œ๋‚˜ ๊ฐ„์ ‘์ธต์„ ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
> ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” resource ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด๊ตฌ์กฐ์— ๊ทธ๋Œ€๋กœ ์ ์šฉ์‹œํ‚ค์ง€ ๋ง๊ณ  method ํ˜ธ์ถœ ํ˜•ํƒœ๋ฅผ ๋‘์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
>
> ์ฆ‰ /Blog/Obama๋Š” Blog.Obama๊ฐ€ ์•„๋‹ˆ๋ผ Blog.child("Obama")๋‚˜ Blog.child["Obama"]๊ฐ€ ๋˜์–ด์•ผ
> ํ•ฉ๋‹ˆ๋‹ค.
> /Blog/tag/if๋Š” Blog.child("tag").child("if") ํ˜น์€
> Blog.child["tag"].child["if"]๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์ฃ .
>
> ํ•˜์ง€๋งŒ ์ด๋ž˜์„œ์•ผ ๊ธฐ์กด ์ƒ๊ฐํ–ˆ๋˜ resource -> ๊ฐ์ฒด ๋ผ๋Š” ROM์˜ ์‰ฌ์šด ํ‘œํ˜„์žฅ์ ์ด ๋งŽ์ด ํ‡ด์ƒ‰ํ•ด์ง„ ๋А๋‚Œ์ž…๋‹ˆ๋‹ค.
> ๋ฌผ๋ก  ์žฅ์ ์€ ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด์˜ ์ƒ๊ฐ์ด ์ž˜ ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด 10์  ๋งŒ์ ์— 10์ ์ด๋ผ๋ฉด
> ์ด๊ฒƒ์€ 10์  ๋งŒ์ ์— 5์ ์— ์ง€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
> ์ปดํ“จํ„ฐ ๊ณผํ•™์˜ ๋ชจ๋“  ๋ฌธ์ œ๋Š” ๊ฐ„์ ‘์ธต์„ ํ•˜๋‚˜ ๋” ๋‘ ์œผ๋กœ์จ ํ•ด๊ฒฐ๋˜์ง€๋งŒ ๋˜ํ•œ ๋ชจ๋“  ์„ฑ๋Šฅ๋ฌธ์ œ๋Š” ๊ฐ„์ ‘์ธต์„ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
> ์‚ฌ์šฉ์„ฑ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด newbie๋“ค์€ ์ด ์ •๋„์˜ ํ‘œํ˜„์žฅ์ ์œผ๋กœ ์ƒˆ๋กœ์šด framework์„ ๋ฐฐ์šฐ๋ ค ํ• ๊นŒ์š”?
> ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ํƒ€ํ˜‘์ ์„ ์ œ์‹œํ•ด์•ผ๊ฒ ์ฃ . ^_^
>
> ์ €๋Š” ์ด ๊ธ€์„ ์“ฐ๋Š” ๋„์ค‘(์ •๋ง์ด์˜ˆ์š”!!!) ์•„์ฃผ ์ ์ ˆํ•œ ๊ธฐ์กด system์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ JavaScript ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
> JavaScript ๊ฐ์ฒด๋Š” ์•„์‹œ๋‹ค์‹œํ”ผ hash table์ž…๋‹ˆ๋‹ค. Python์˜ dict์ฃ .
> JavaScript์—์„œ o.a๋Š” o["a"]์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. JavaScript์˜ ๊ฐ์ฒด๋Š” method๋„ ๊ฐ€์ง€๊ณ  ์žˆ์ฃ .
>
> Python์˜ __getattribute__, __getattr__, __setattr__, __getitem__ ์€
> JavaScript ๊ฐ์ฒด์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ Python ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
> ์ด์ œ ์šฐ๋ฆฌ์˜ /Blog/tag/if ๋Š” Blolg.tag.if๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ  Blog["tag"]["if"]๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
> ์ €๋Š” Blog["tag"]["if"]๊ฐ€ ๊ธฐ๋ณธ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฐ์ฒด์˜ ๊ณ ์œ  member๋“ค์ด ์˜๋„์น˜ ์•Š๊ฒŒ ํ›ผ์†๋˜์ง€ ์•Š๊ธฐ
> ์œ„ํ•ด์„œ์ฃ .
> ์˜ˆ๋ฅผ ๋“ค์–ด Blog.tag ๋˜๋Š” Blog["tag"]๋Š” sort method๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. ๋‹น์—ฐํžˆ ์ •๋ ฌ๋œ tag ๋ชฉ๋ก์„
> ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” method์ง€์š”.
> ๊ทธ๋ฆฌ๊ณ  tag๋“ค ์ค‘์—๋Š” ๋‹น์—ฐํžˆ sort๋ผ๋Š” tag๋ฅผ ์“ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
> ๋งŒ์ผ client programmer๊ฐ€ Blog.tag.sort ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ tag๋“ค์„ sortํ•˜๋Š” ์ •๋ ฌ method๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๊ณ 
> ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
> ๋งŒ์ผ sort tag๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” post๋ชฉ๋ก์„ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด Blog.tag["sort"]๋ผ๊ณ  ํ•ด์•ผ๊ฒ ์ฃ .
> ์šฐ๋ฆฌ๋Š” ๊ฐ์ฒด์˜ ๊ณ ์œ  member๋ฅผ ํ™œ์šฉํ•˜๋Š” ํ˜•ํƒœ์˜ programming ๊ธฐ๋ฒ•์— ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
> ๋ฐ˜๋Œ€๋กœ ์žˆ์„์ง€ ์—†์„์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ์žˆ์–ด๋„ ์–ธ์ œ ๋‚˜ํƒ€๋‚ ์ง€ ์•Œ ์ˆ˜ ์—†๋Š” resource๋Š” ๋’ค๋กœ ๋ฏธ๋ฃจ๋Š”๊ฒŒ ๋งž์ง€ ์•Š์„๊นŒ์š”?
> ์šฐ๋ฆฌ programmer๋“ค์€ ๊ฐ method๋“ค๋งˆ๋‹ค test๋ฅผ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋•Œ๋งˆ๋‹ค ๊ฐ„์ ‘ method๋ฅผ ๊ฒฝ์œ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋งŽ์ด ๋ถˆํŽธํ•˜๊ฒ ์ฃ .
> ๋”ฐ๋ผ์„œ ๊ฐ์ฒด์˜ ๊ณ ์œ  member๊ฐ€ ์šฐ์„ ์ด ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ •๋‹ต์ธ ๊ฒƒ์ด์ฃ .
> ๋˜ํ•œ resource ํ‘œํ˜„๋„ ๋ณด๋‹ค ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
> ์ฆ‰ Blog.tag.if๋Š” syntatic sugar๋กœ ๋‘๊ณ  ๊ธฐ๋ณธ์€ Blog["tag"]["if]๋ฅผ ๋‘๊ณ  ์ด๊ฒƒ์„ ๋ฌธ์„œ์— ๋จผ์ € ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
> ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ธฐ์กด Python ๊ฐ์ฒด๊ตฌ์กฐ์™€์˜ ํ˜ผ๋ˆ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
> ๋˜ํ•œ /Blog/post/1 ๋„ ์ฒ˜์Œ ์“ฐ๋Š” ์‚ฌ๋žŒ๋“ค์€ Blog["post"]["1"]์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.
>
> ํ•œ๋ฒˆ ๋” ์ƒ๊ฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ __setattr__ ์ž…๋‹ˆ๋‹ค.
> ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์„ ํƒ์˜ ๊ธฐ๋กœ์— ์™”์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
> ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด์„œ๋ผ๋ฉด get์ฒ˜๋Ÿผ set๋„ ๊ฐ์ฒด ๊ณ ์œ  member๊ฐ€ ์šฐ์„ ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
> ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ member๋ฅผ ์ง์ ‘ setํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ์š”?
> Prototype based OOP ๋ผ๋ฉด ๋‹น์—ฐํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
> ํ•˜์ง€๋งŒ Python์€ ์—„์—ฐํžˆ class๋ผ๋Š” keyword๋ฅผ ์ง€์›ํ•˜์ž–์Šต๋‹ˆ๊นŒ?
> ๋”ฐ๋ผ์„œ class์—์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋“ค์ด member๋“ค์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋˜๊ฐ€ ํ˜น์€ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
> ๊ทธ๋ž˜์„œ ์ €๋Š” __setattr__์€ child resoucre๋ฅผ ๋ณ€๊ฒฝ ํ˜น์€ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‘๊ณ 
> ๊ฐ์ฒด๊ณ ์œ  member๋Š” set_member๋ผ๋Š” method๋ฅผ ๋‘์–ด์„œ set ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
> ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ผ๊ด€์„ฑ์ด๋ƒ, ์•„๋‹ˆ๋ฉด ์‹ค์šฉ์„ฑ์ด๋ƒ๋ฅผ ๋‘๊ณ  ์ข‹๊ณ  ์‹ซ๊ณ ๊ฐ€ ์ข€ ๊ฐˆ๋ฆด ๊ฒƒ ๊ฐ™๋„ค์š”.
>
> ์–ด์จŒ๋“  ๋ฌธ์„œ์—์„œ๋Š” Blog["Obama"] = "Obama is the president of USA"๋ฅผ
> Blog.Obama = "Obama is the president of USA" ๋ณด๋‹ค ๋จผ์ € ๋ณด์—ฌ์ค˜์•ผ๊ฒ ์ฃ .
> ์šฐ๋ฆฌ๋“ค์˜ 2MB๋Š” syntatic sugar ๋”ฐ์œˆ ์•ˆ ๋จนํžˆ๋Š”๊ตฐ์š”.. ^_^
>
> ์ €๋Š” HTTP METHOD์— ๋Œ€์‘๋˜๋Š” ๊ฐ์ฒด method๋ฅผ ์œ„ํ•œ decorator๋Š” ์ด์ œ ํšจ์šฉ์„ฑ์ด ๋งŽ์ด ์—†์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
> ์ œ ์ƒ๊ฐ์— decorator์˜ ์ฒซ ์ถœํ˜„ ๋ชฉ์ ์€ ์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„์„ method์— HTTP METHOD์— ๋Œ€์‘์„ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด์—ˆ์ง€๋งŒ
> Resource๋ฅผ ์ƒ์†๋ฐ›๋Š” class ์ด๋ฆ„๋งŒ ์ž˜ ์ง€์–ด๋„ method์— ์˜๋ฏธ๋Š” ๋‹ค๋ฅธ ์˜๋ฏธ๋Š” ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฑฐ๋“ ์š”.
> ์›๋ž˜ REST ์ฒ ํ•™์ด METHOD๋ฅผ ํ•„์ˆ˜์  ์š”์†Œ๋งŒ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ด์ž–์Šต๋‹ˆ๊นŒ? ๊ทธ ์˜๋ฏธ ์™ธ์— ๋” ์ด์ƒ์˜ ์˜๋ฏธ๋Š” ๋ถˆํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
> ์ €๋Š” ๊ทธ๋ƒฅ Blog.GET์ด GET /Blog๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฉด ํ•˜๊ตฐ์š”. ํ™๋ฏผํฌ์”จ๋Š” ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์“ฐ๋Š” ๊ฒƒ์ด Pythonic ํ•˜์ง€ ์•Š๋‹ค๊ณ 
> ํ–ˆ์ง€๋งŒ
> ๊ทธ๋ ‡๊ธฐ์— ๋”์šฑ HTTP METHOD์— ๋Œ€์‘๋จ์„ ๋ถ€๊ฐ์‹œ์ผœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ ํ•ฉ๋‹ˆ๋‹ค.
> ํ•˜์ง€๋งŒ ์•„์ง ์ด ๋ฌธ๋‹จ์˜ ๊ธ€์€ ํ™•์‹ ์ด ๋“ค์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
>
> ๊ตฌํ˜„์  ์ธก๋ฉด์—์„œ๋Š” Resource class ๋‚ด์— child_resource๋ฅผ ๋‘๊ณ  ์ด๋…€์„์„ dict๋กœ ๋งŒ๋“ค๊ณ  __getitem__
> ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
> ๋‹น์—ฐํžˆ Resource.__dict__๋ฅผ ๊ทธ๋Œ€๋กœ ์จ์„œ member๋“ค์˜ ํ›ผ์†์ด ์šฐ๋ ค๊ฐ€ ๋˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
>
> ๊ทธ๋Ÿผ ์ด์•ผ๊ธฐ๋ฅผ ๋งˆ์นฉ๋‹ˆ๋‹ค.
>
> ์ด mail์€ ์–ธ์  ๊ฐ€ rationale ๋ฌธ์„œ๋กœ ๋งŒ๋“ค๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“œ๋Š”๊ตฐ์š”.. ^_^

๊น€์šฐ์Šน

unread,
Mar 11, 2009, 6:41:22โ€ฏAM3/11/09
to vlastic-d...@googlegroups.com
์•„๋ฌด๋ž˜๋„ ์ด ๋ถ€๋ถ„์€ ์ œ๊ฐ€ ๋งก๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค๋ณด๋‹ˆ ์ œ๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๊ฒƒ ๊ฐ™๋„ค์š”. ํ™๋ฏผํฌ๋‹˜์˜ ๊ธ€์„ ์ฝ์œผ๋ฉด์„œ ์ €๋„ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค๋งŒ ๊ฐ•์ค€์ˆ˜๋‹˜๊ณผ ์ตœ์ข…์—ด๋‹˜๋„ ์ฝ์–ด๋ณด์‹œ๊ณ  ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ์‹œ๋ฉด ๋ฌผ์–ด๋ณด์‹œ๊ณ , ์ €ํฌ๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ idea๊ฐ€ ์žˆ์œผ์‹œ๋ฉด ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋Ÿฐ๋ฐ...

ย 
๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ROM์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ๊ฐ ๋ฆฌ์†Œ์Šค์˜ ์ž์‹ ๋ฆฌ์†Œ์Šค(๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, /child์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ ‘๊ทผ๋˜๋Š” ๊ฒƒ ๋ง์ž…๋‹ˆ๋‹ค)์˜
์ ‘๊ทผ์„ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•  ๋•Œ,

ย  using vlastic;

ย  class person: rom::resource<person> {
ย  ย  ย  picture_list get_pictures() const { ... }
ย  ย  ย  post_list get_posts() const { ... }
ย  };

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ํŽธ์ด (์•„๋งˆ๋„) ์ž์—ฐ์Šค๋Ÿฌ์› ์„ ๊ฒƒ์ด๊ณ , HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑโ€ฆ)์— ๋Œ€ํ•ด
rom::resource::get(), rom::resource::post() ๊ฐ™์€ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ธฐ๋„ ๋” ์‰ฝ์ง€ ์•Š์•˜์„๊นŒ
ํ•˜๋Š” ์ƒ๊ฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ๋ฆฌ์†Œ์Šค์˜ ์ ‘๊ทผ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜์— get_์ด๋ผ๋Š” ์ ‘๋‘์‚ฌ๊ฐ€ ํ•ญ์ƒ ๋ถ™๊ฒŒ ๋˜์–ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฌธ์ œ๊ฐ€
์‚ฌ๋ผ์กŒ๊ฒ ์ฃ .
ย 
๊ทธ ์ด๋ฆ„๋„ ์œ ๋ช…ํ•˜์‹  CRTP(Curiously Recurring Template Pattern)์ด๊ตฐ์š”... -_-. ์ €๋Š” ์ด ๋…€์„์˜ ํ™œ์šฉ๋„๋ฅผ ์•„์ง ์ž˜ ํŒŒ์•…ํ•˜๊ณ  ์žˆ์ง€๋ฅผ ๋ชปํ•ด์„œ... Mixin์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฑฐ๋ผ๊ณ  ๋“ค์—ˆ๋Š”๋ฐ ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์ค‘์ƒ์†๊ณผ๋„ย ์—ฐ๊ด€์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒย C++์—์„œ๋Š” ์ƒ์†์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„๋˜๋‹ˆ ๋‹ค์ค‘์ƒ์†์„ ๋ณด์ด๋Š” ๋˜๋‹ค๋ฅธ ํ˜•ํƒœ๋Š” ๋˜์ง€ ๋ชปํ•˜๊ฒ ๊ตฐ์š”.ย ์–ด์จŒ๋“  ํฅ๋ฏธ๋กœ์šด code ์˜€์Šต๋‹ˆ๋‹ค.
ย ย 
ย 
์ œ๊ฐ€ ์ƒ๊ฐํ•œ ย ๊ฒƒ์€ ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ์ฒด์˜ ์• ํŠธ๋ฆฌ๋ทฐํŠธ/ํ”„๋กœํผํ‹ฐ๋ฅผ ์ž์‹ ๋ฆฌ์†Œ์Šค์˜ ์ ‘๊ทผ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์˜€๋Š”๋ฐ, ๋ฌธ์ œ๋Š” Python
๊ฐ์ฒด ๋ชจ๋ธ์€ Lisp-1 vs Lisp-2 debate[1]์—์„œ ๋งํ•˜๋Š” Lisp-1์— ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฆ‰, ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„
ํ•จ์ˆ˜๋„ ์‚ฌ์‹ค์€ ํ•ด๋‹น ์ด๋ฆ„์˜ ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋กœ ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์žˆ์„ ๋ฟ์ด๋ฏ€๋กœ resource.get(), resource.post()
๊ฐ™์€ ์‹์œผ๋กœ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•œ ๋ณ„๋„ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ย ๋งŒ๋“ค ๊ฒฝ์šฐ /get, /post์— ํ•ด๋‹นํ•˜๋Š” ์ž์‹ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜๊ฐ€
์—†๊ฒŒ ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•˜์ง€๋งŒ ์–ด๋ ค์šด ๋ง์„ ์“ฐ์ž๋ฉด, ์ €ํฌ๊ฐ€ ํ•„์š”ํ•œ ์…€์€ ๋‘ ๊ตฌ์—ญ(HTTP ๋ฉ”์„œ๋“œ, ์ž์‹ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„)์ธ๋ฐ
๋งตํ•‘ํ•  Python ๊ฐ์ฒด์—๋Š”, ์ง€๊ธˆ๊นŒ์ง€๋Š”, ์ผ๋‹จ ์…€์ด ํ•˜๋‚˜(์• ํŠธ๋ฆฌ๋ทฐํŠธ)์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ฃ .
ย 
์ œ๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ณ ๋ฏผ์€ย ํ•œ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผย ๋” ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์˜ e-mail์—๋„ ์จ๋†“์•˜๋“ฏ์ด ๊ทธ๊ฒƒ์€ ๊ฐ์ฒด์˜ ๊ณ ์œ ํŠน์ง•์„ ๋‚˜ํƒ€๋‚ด๋Š” member ๋ณ€์ˆ˜์™€ member ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ฒƒ์ด์ฃ . HTTP METHOD ์ฒ˜๋ฆฌ์ž๊ฐ€ ๊ธธ์–ด์ง€๊ฑฐ๋‚˜ ๊ณตํ†ต์ ์ธ code๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋”ฐ๋กœ member ํ•จ์ˆ˜๋กœ ๋บ„ ํ•„์š”์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋˜๋‹ค์‹œ object.__dict__ ์ด๋ฆ„์˜์—ญ์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ์ฒด์— state๋ฅผ ๋‘”๋‹ค๋ฉด
ย 
class TagList(Resource):
ย ย ย  def __init__(self, logo):
ย ย ย ย ย ย ย  self.logo = logo
ย 
class Tag(Resource):
ย ย ย  def __init__(self, name):
ย ย ย ย ย ย ย  self.name = name
ย 
aboutCS = TagList("cs.png")
aboutCS.logo = Tag("LOGO Programming Language")
ย 
aboutCS ๋ผ๋Š” TagList๋Š” ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ logo๋ผ๋Š” member ๋ณ€์ˆ˜๊ฐ€ ๋‹ค์‹œ LOGO Programming Language๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” logo resource์™€ ์ด๋ฆ„์ถฉ๋Œ์„ ์ผ์œผํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๊ฐ์ฒด์˜ state๋Š” ์ฒ˜์Œ ์‹ ์ดŒ์—์„œ ๋งŒ๋‚ฌ์„ ๋•Œ resource๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” class๋“ค์˜ method๋“ค์ด static method๊ฐ€ ์•„๋‹ˆ๊ณ  ๊ฐ์ฒด method ์—ฌ์•ผ ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•ด์„œ ์˜๋ฌธ์„ ์ œ๊ธฐํ–ˆ๋˜ ํ™๋ฏผํฌ๋‹˜์˜ ์ƒ๊ฐ๊ณผ๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์—๋Š” ํ˜„์žฌ ํ˜•ํƒœ์—์„œ ๋™์ผ class์˜ ์—ฌ๋Ÿฌ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์ถฉ๋ถ„ํžˆ ์žˆ๊ณ , ๊ทธ๋ ‡๊ธฐ์— ๊ฐ์ฒด์˜ member ๋ณ€์ˆ˜๋Š” ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.
ย 
์ด๋Ÿฐ ํ˜•ํƒœ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์•˜์ง€๋งŒ ํ”ํžˆ ๋ฒŒ์–ด์ง€๋Š” ์ผ์€ ์•„๋‹ˆ๋”๊ตฐ์š”. ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” URL์˜ ๊ฒฐ์ •๊ถŒ์ด program์˜ end user์—๊ฒŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—ย ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ๋Œ€ํ‘œ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋ฐ”๋กœ tag์ธ ๊ฑฐ๊ณ ์š”.
ย 
๊ฒฐ๊ตญ framework๋ฅผ ๋งŒ๋“œ๋Š” ์šฐ๋ฆฌ๋Š” framework๋ฅผ ํ™œ์šฉํ•˜๋Š” client programmer๋งŒ์ด ์•„๋‹ˆ๋ผ client programmer๊ฐ€ ์ž‘์„ฑํ•œ program์„ ํ™œ์šฉํ•˜๋Š” end user๊นŒ์ง€ ์–ด๋А ์ •๋„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ๊ณจ์น˜๊ฐ€ ์•„ํ”ˆ ๊ฑฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ณจ์น˜๊ฐ€ ์•„ํŒŒ์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์ด ๋ฌธ์ œ์•ผ ๋ง๋กœ end user๋ฅผ ์ƒ๊ฐํ•˜๋Š” client programmer๋ฅผ ์ƒ๊ฐํ•˜๋Š” vlastic์˜ย ํ•ต์‹ฌ๊ณ ๋ฏผ์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
ย 
๊ฐ€๋งŒํžˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์‚ฌ์‹ค HTTP METHOD ์ฒ˜๋ฆฌ์ž ํ•จ์ˆ˜๋“ค์€ ๋ณ„ ๋ฌธ์ œ์—†์ด ๊ธฐ์กด์˜ Python ๊ฐ์ฒด member ๋“ค๊ณผ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค. Class ๊ธฐ๋ฐ˜์˜ OOP์—์„œ ๊ธฐ๋ฐ˜ class์˜ member๋“ค์„ ํ•จ๋ถ€๋กœ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ฑฐ๋‚˜ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ์กด ๊ด€ํ–‰๊ณผ ์ƒ์ถฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ํ•˜์ง€๋งŒ ์–ด๋–ค ์ด๋ฆ„์ธ์ง€ ์•Œ์ˆ˜ ์—†๋Š” member๊ฐ€ runtime์— ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ์€ ์–ธ์–ด hacking์ด ์•„๋‹ˆ๊ณ ์„œ๋Š” ๊ธฐ์กด class ๊ธฐ๋ฐ˜ OOP ๊ด€ํ–‰๊ณผ๋Š” ์–ด์šธ๋ฆฌ์ง€ ์•Š๊ธฐ์— ์ž์‹ resource๋ฅผ ์œ„ํ•œ ์ด๋ฆ„๊ณต๊ฐ„์€ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
ย 
์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Python์— ๋Œ€ํ•ด์„œ ์ถฉ๋ถ„ํžˆ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ œ ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค๋งŒ inspect module์„ ์ž˜ ์•ˆ๋‹ค๋ฉด ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ธด ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฑ์ •์Šค๋Ÿฌ์šด ์ ์€ ์ œ๊ฐ€ ๊ทธ๊ฑธ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋ƒ๋ผ๋Š” ์ ์ด๊ตฐ์š”. Library Reference ๊ณ ์ž‘ ํ•œ์ชฝ์ด๊ธด ํ•ฉ๋‹ˆ๋‹ค๋งŒ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋งŽ์„ ๊ฒƒ ๊ฐ™์•„์„œ์š”.
ย 
๊ฑฑ์ •๋˜๋Š” ๋˜๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ฒฐ๊ตญ client programmer๊ฐ€ ์ž์‹ resource์ธ๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ฐ์ฒด์˜ ๊ณ ์œ  member์ธ๊ฐ€๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ฒฐ๊ตญ client programmer๋„ ๊ทธ ๊ตฌ๋ณ„์ž‘์—…์— ์ฐธ์—ฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑฐ์ฃ . ์ •์˜๊ตฌ์—ญ์ด ์ •ํ•ด์ง€๋Š” member ํ•จ์ˆ˜์™€๋Š” ๋‹ฌ๋ฆฌ member ๋ณ€์ˆ˜๋Š” ์ด ์ž‘์—…์„ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Decorator๋Š” ํ•จ์ˆ˜์— ๋ถ™์ผ ์ˆ˜๋Š” ์žˆ์–ด๋„ ๋Œ€์ž…๋ฌธ์— ์ ์šฉํ•  ์ˆ˜๋Š” ์—†์ž–์Šต๋‹ˆ๊นŒ?... ๊ฒฐ๊ตญ ๊ธฐ์กด Python ๊ฐ์ฒด ํ™œ์šฉ๋ฒ•๊ณผ๋Š” ๋‹ฌ๋ฆฌ ํŠน์ • member ํ•จ์ˆ˜(์ „์— ๋ณด๋‚ธ e-mail์— ์ ์—ˆ๋“ฏ set_member๊ฐ™์€)๋ฅผ ํ†ตํ•ด ์ ์šฉํ•˜๋Š” ์ •๋„๋ฅผ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ class decorator๊ฐ€ ์•„๋‹Œ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค.
ย 
ย  ์ œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ main.tags๋Š” TagList ์ธ์Šคํ„ด์Šค์ด๊ณ , TagList๋Š” ์ผ์ข…์˜ ๋ฌธ์ž์—ด์„ ํ‚ค๋กœ ๊ฐ€์ง€๋Š”
์œ ์‚ฌ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ๋งž์€๋ฐ, ์–ด๋А ๋‚˜๋ผ Python ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ dict.key ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋ƒ๋Š” ๊ฑฐ์ฃ . ์ „ํ˜€ ์ž์—ฐ์Šค๋Ÿฝ์ง€
์•Š์ฃ . dict["key"]๊ฐ€ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์• ํŠธ๋ฆฌ๋ทฐํŠธ์™€ ๋‹ฌ๋ฆฌ ์ฒจ์ž ์—ฐ์‚ฐ์ž๋Š” ๊ทธ ์•ˆ์— ์–ด๋–ค ๊ฒƒ์ด ๋“ค์–ด๊ฐˆ์ง€๋Š” ๋Ÿฐํƒ€์ž„์—
๊ฒฐ์ •๋œ๋‹ค๋Š” ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ์ถฉ๋ถ„ํžˆ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. ๊ฐ์ฒด ๋ชจ์–‘๋งŒ ๋ดค์„ ๋•Œ๋„ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ๊ณ ์š”.

๊ฒฐ๊ตญ ๋น„์Šทํ•œ ๊ฒฐ๋ก ์ด๊ธด ํ•œ๋ฐ, ์ œ ์ƒ๊ฐ์—๋Š” DictionaryResource๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ, ๊ทธ๊ฒƒ์„
์„œ๋ธŒํด๋ž˜์‹ฑํ•  ๋•Œ๋Š” __getitem__ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ์ƒ์† ๋ฐ›์œผ๋ฉด ์ž์‹ ๋ฆฌ์†Œ์Šค๋ฅผ
์ฐพ์„ ๋•Œ ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ „ํ˜€ ๋’ค์ง€์ง€ ์•Š๊ณ , ์˜ค์ง ์ฒจ์ž ์—ฐ์‚ฐ์ž์—์„œ๋งŒ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํƒœ๊ทธ ์ด๋ฆ„์ด๋‚˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š”
๊ฒฝ์šฐ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ย 
๊ฒฐ๋ก  ์ชฝ์œผ๋กœ ๊ฐ€์„œ ๋‘ ๊ฐœ์˜ ๊ธฐ๋ฐ˜ class๋ฅผ ์‚ฌ์šฉํ•˜์ž๋Š” ์˜๊ฒฌ์€ ์ƒ๋‹นํžˆ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ผญ ํ•„์š”ํ•˜๋ƒ๋Š” ์ƒ๊ฐ์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ ์‚ฌ์‹ค ์šฐ๋ฆฌ๋“ค์€ 1.0์„ ๋‚ด๋†“๊ธฐ๊ฐ€ ์• ๋งคํ•œ ์ƒํ™ฉ์ด๋‹ˆ๊นŒ ํ˜„์žฌ๋กœ์„œ๋Š” ์ถฉ๋ถ„ํžˆ ์‹คํ—˜ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๊ฒƒ ๊ฐ™๊ณ ์š”. ์šฐ๋ฆฌ๋“ค์ด framework๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๋‘ ๊ฐœ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋ฉด 1.0์ด๋‚˜ 2.0์—์„œ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€์š”.
ย 
ํ™•์‹คํžˆ root["blog"]["post"] ํ˜•ํƒœ๋Š” ๋ชจ์–‘์ƒˆ ๋•Œ๋ฌธ์— 10์  ๋งŒ์ ์— 8์ ๋„ ์ฃผ๊ธฐ๊ฐ€ ์ข€ ์•„๊น์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ root.blog.tag.if ๊ฐ€ ์•ˆ๋˜๋Š” ๊ธฐ์กด ๊ฐ์ฒด๊ตฌ์กฐํ˜•ํƒœ๋„ ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์—๋Š” 9์ ์„ ์ฃผ๊ธฐ์—๋Š” ์•„๊น์Šต๋‹ˆ๋‹ค. ํ™œ์šฉ๋„์— ๋”ฐ๋ผ client programmer๊ฐ€ ์„ ํƒํ•ด์„œ ์“ด๋‹ค๋ฉด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜, (๊ธ€์ด ๊ธธ์–ด์ง€์ง€๋งŒ,) ์ œ๊ฒŒ ๋– ์˜ค๋ฅธ ์ด์Šˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ์ดˆ์— ์ œ๊ฐ€ ๋ฆฌ์†Œ์Šค๋Š” Python์—์„œ ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด๋กœ๋„
์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
/tags/abc/authors?page=3๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š”๋ฐ,

ย  authors = AuthorList()
ย  req = http.Request("GET", "/tags/abc/authors?page=3")
ย  req.back_component = ["tags", "abc"]
ย  result = authors(req)
ย  assert "<strong>abc</strong>" in result
ย  assert "Total authors: <strong>37</strong>" in result

์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ ๋ณด๋‹ค๋Š”,

ย  result = main.tags["abc"].authors(page=3)
ย  assert "abc" == result["tag_name"]
ย  assert 37 == result["total_authors"]

์ด์ชฝ์ด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ , ํŽธํ•˜๊ณ , ์ˆ˜์ •์ด ์šฉ์ดํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ. ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์ค‘์— ํ•˜๋‚˜๊ฐ€

ย  @resource
ย  def authors(self, page=1):
ย  ย  ย  ...
ย  ย  ย  return {"tag_name": self.tag.name, "total_authors": ...}


์ด๋Ÿฐ ์‹์œผ๋กœ, ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์˜ ๊ฐ ํ‚ค๋“ค์„ Python ํ‚ค์›Œ๋“œ ์ธ์ž๋กœ ๋งตํ•‘ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋ฆฌ์†Œ์Šค
๊ฐ์ฒด๋Š” request๋ฅผ ๋ฐ›๊ณ  response๋ฅผ ๋‚ด์ฃผ๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด์—ฌ์•ผ ํ•˜๋Š”๋ฐ ํ‚ค์›Œ๋“œ ์ธ์ž๋ฅผ ๋ฐ›์•„์„œ dict๋ฅผ ๋‚ด์ฃผ๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•˜๋ƒ๋Š”
๊ฒ๋‹ˆ๋‹ค. ์•„์ง ํ•ด๊ฒฐ๋œ ๊ฒƒ์€ ์•„๋‹Œ๋ฐ ํ‚ค์›Œ๋“œ ์—†์ด request ๊ฐ์ฒด ํ•˜๋‚˜๋งŒ ์ „๋‹ฌ๋  ๊ฒฝ์šฐ์—๋Š” resource ํ•จ์ˆ˜๋กœ ์ž‘๋™ํ•˜๊ณ ,
ํ‚ค์›Œ๋“œ ์ธ์ž๊ฐ€ ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ์ธ์ž๊ฐ€ ์—†์œผ๋ฉด ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ์˜ค๋ฒ„๋กœ๋”ฉ๋˜๊ฒŒ ํ•˜๋ฉด ์–ด๋–จ๊นŒ ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค. ๋”
์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ƒ๊ฐ์ด ๋‚˜์ง€ ์•Š๋„ค์š”.

ย 
๋™์ผํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค๋งŒ ์ €๋„ ์ง€๊ธˆ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  back_component๋Š” ์ œ๊ฐ€ ์•ฝ๊ฐ„ ์ž˜๋ชป ํ‘œ๊ธฐํ–ˆ์—ˆ๋Š”๋ฐ back_components(๋ณต์ˆ˜ํ˜•)ย ๊ฐ์ฒด๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ resource ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ํ˜•ํƒœ์—์„œ ์ค‘๊ฐ„์— ์ด๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด์„œ ๋‚จ์€ path component๋“ค์„ ์ธ์ž๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
ย 
์˜ˆ๋ฅผ ๋“ค์–ด GET /calendar/2003/10/20 ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ
ย 
class Calendar(Resource):
ย ย ย  def __call__(self, request):
ย ย ย ย ย ย ย  self.get(*request.back_components)
ย 
ย ย ย  def get(self, year, month, day):
ย ย ย ย ย ย ย  ...
ย 
calendar = Calendar()
caleandar(Request("GET /2003/10/20")
ย 
์˜ ํ˜•ํƒœ๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ย 
ํ™๋ฏผํฌ๋‹˜์ด ์ž‘์„ฑํ•˜์‹  code๊ฐ€ ์ œ ์ƒ๊ฐ๊ณผ๋Š” ์ข€ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์•„ ์ผ๋‹จ ์ ์–ด๋ณด์•˜๊ณ ์š”.
ย 
Query ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ keyword ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ์ž๋Š” ์ƒ๊ฐ์€ ์ €๋„ย ํ–ˆ์Šต๋‹ˆ๋‹ค๋งŒ... ๋งŒ์ผ end user๊ฐ€ "GET /calendar/2003/10?day=20" ์„ request ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์ด๊ฑด error๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
ย 
ํ•˜์ง€๋งŒ __call__์—์„œ self.get(*request.back_components, **request.query) ํ˜•ํƒœ๋กœ get์„ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ํ• ๋•Œ ๋ฌธ์ œ์—†์ด ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฑด ์ข€ ๊ฒฐํ•จ์ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์ฃ . ๋ฌผ๋ก  ํ•œ๋ฒˆ ๋” ์ค‘๊ฐ„๊ณผ์ •์„ ๊ฑฐ์ณ์„œ error๋ฅผ ๋‚ผ ๋ฐฉ๋ฒ•์€ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ...
ย 
๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ•˜๊ธฐ ์ „์— ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ request๋Š” ์ผ๋‹จ ๋„˜๊ธฐ๊ณ  ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด request์— ๊ฐ์ข… header๊ฐ€ ๋“ค์–ด์žˆ๊ณ  ์ด๊ฒƒ์€ Resource๋ฅผ ์ƒ์†๋ฐ›์•„ ํ•ต์‹ฌ์ด ๋˜๋Š” get, post HTTP METHOD ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” client programmer์—๊ฒŒ ๊ผญ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
์ฆ‰ self.get(request, *request.back_components, **request.query) ํ˜•ํƒœ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์€ ์ค‘๋ณต์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค.ย  Django์—์„œ๋Š” ์ž์‹ resource์— ๋Œ€ํ•ด์„œ๋งŒ ์ธ์ž๋กœ ๋ฐ›๊ณ  query์— ๋Œ€ํ•ด์„œ๋Š” ๊ทธ๋ƒฅ request["GET"]๊ณผ request["POST"] ํ˜•ํƒœ๋ฅผ ์”๋‹ˆ๋‹ค๋งŒ ์ €๋Š” ๊ทธ๋ƒฅ get(request): ... ๋กœ ๋๋‚ด๋Š” ๊ฒƒ์ด simpleํ•˜๊ณ  ์ข‹์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ client programmer๊ฐ€ request.front_components๋‚˜ request.current_component, request.back_components๋ฅผ ์•Œ์•„์„œ ์‚ฌ์šฉํ•˜๋Š”ย ๊ฒƒ์ด ๊ฐ€์žฅ ์™„๊ฒฐ์„ฑ์žˆ๊ณ , ์ผ๊ด€์„ฑ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™๊ฑฐ๋“ ์š”. Header๋งŒ ๋˜ ํ•˜๋‚˜์˜ ์ธ์ž๋ฅผ ์ค„ ์ˆ˜๋„ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒ ์–ด์ฐจํ”ผ request ์ •๋ณด ์ค‘ METHOD ์ด์™ธ์—๋Š” ๋ชจ๋‘ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ(์™œ๋ƒํ•˜๋ฉด METHOD๋Š” ๊ฐ์ฒด memberํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ... ^_^) ๊ทธ๊ฑธ ๋ถ„ํ•ดํ•ด์„œ ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ย 
๊ฒฐ๊ตญ HTTP 1.0๊ณผ HTTP 1.1์˜ header๊ฐ€ ์žˆ๋Š” request message๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ request๋Š” ๋„˜๊ธฐ๊ณ  ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™๋ฏผํฌ๋‹˜์ด ์ƒ๊ฐํ•˜์‹  code๋Š” HTTP 0.9์˜ Simple Request์—๋Š” ์–ด์šธ๋ ค ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ์ค‘๋ณต์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์€ ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ๊ทธ๋‹ฅ ๊ฒฝ์ œ์„ฑ์€ ์—†์–ด ๋ณด์ด๋„ค์š”.

Hong MinHee

unread,
Mar 11, 2009, 12:26:29โ€ฏPM3/11/09
to vlastic-d...@googlegroups.com
request ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค ๋•Œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง„ ์•Š๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๊ทธ๋ ‡๋‹ค๊ณ  ์•„์˜ˆ request
์ ‘๊ทผ ๊ธฐ๋Šฅ์„ ๋นผ๋ฒ„๋ฆฌ์ž๊ณ  ํ•˜๋ฉด ์•ˆ๋˜๊ฒ ์ฃ . ๋„ˆ๋ฌด ๊ธธ์–ด์งˆ๊นŒ๋ด ์‚ฌ์‹ค ๋นผ๋จน์€ ๋‚ด์šฉ์ด ์žˆ๋Š”๋ฐ, function annotations
[PEP 3107] ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ type mapping๋„ ํ•ด์ค„ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. (์ „์— ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•œ๋ฐ์š”.)

@resource
def authors(self, page: int = 1):
...

์‹ค์ œ query string์€ ๊ฒฐ๊ตญ ๋ฐ”์ดํŠธ์—ด์ด๋ฏ€๋กœ page์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์€ intํ˜• 1์ด ์•„๋‹ˆ๋ผ bytesํ˜• b"1"์ด
๋“ค์–ด์˜ค์ง€๋งŒ, ์œ„์™€ ๊ฐ™์ด ์ •์˜ํ•˜๋ฉด intํ˜•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฑด ๋ญ {type: converting_function}
ํ˜•์‹์˜ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์–ด๋””์— ๋‘๋˜๊ฐ€, ์Šคํ์…œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ •ํ•ด์„œ ๊ทธ๊ฑธ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•œ๋‹ค๋˜๊ฐ€... ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
pickle ๋“ฑ์ด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ฃ .

์•„๋ฌดํŠผ ์ด๋Ÿฐ ์ƒํƒœ์—์„œ ์‹ค์ œ๋กœ request๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ •์˜ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋„ค์š”.

@resource
def authors(self, request: http.Request, page: int = 1):
...

http.Request ํƒ€์ž…์˜ ๊ฒฝ์šฐ type mapping์„ ํ•ด์ฃผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์‹ค์ œ request ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์˜ˆ์™ธ๊ฐ€ ์žˆ์–ด๋„
๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. form ๋”ฐ์œ„๋กœ http.Request ๊ฐ์ฒด๋ฅผ (์–ด๋–ป๊ฒŒ ์ง๋ ฌํ™”ํ• ์ง€ ์ƒ์ƒ์ด ์•ˆ๋˜์ง€๋งŒ) ๋ฐ”์ดํŠธ์—ด๋กœ
์ง๋ ฌํ™”ํ•ด์„œ ๋„˜๊ธฐ๊ณ  ๋ฐ›๊ณ  ํ•  ์ผ์€ ์—†์„ ๊ฑฐ๋ผ๊ณ  ๋ด…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์ž๋™์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜๋Š”๋ฐ์š”, ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ• 
๋•Œ ๋ช…์‹œ์ ์œผ๋กœ "์ด๊ฑด request ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ"์ด๋ผ๊ณ  ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋งŒ TypeError๋ฅผ ๋‚ผ ๊ฒƒ์ด๊ธฐ
๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (์ œ๊ฐ€ ํ•˜๋Š” ์˜๋„๊ฐ€ ์ œ๋Œ€๋กœ ์ „๋‹ฌ์ด ๋ ๋Ÿฐ์ง€ ๋ชจ๋ฅด๊ฒ ๊ตฐ์š”.)

2009๋…„ 3์›” 11์ผ (์ˆ˜) ์˜คํ›„ 7:41, ๊น€์šฐ์Šน <lohas...@gmail.com>๋‹˜์˜ ๋ง:


> ์•„๋ฌด๋ž˜๋„ ์ด ๋ถ€๋ถ„์€ ์ œ๊ฐ€ ๋งก๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค๋ณด๋‹ˆ ์ œ๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๊ฒƒ ๊ฐ™๋„ค์š”. ํ™๋ฏผํฌ๋‹˜์˜ ๊ธ€์„ ์ฝ์œผ๋ฉด์„œ ์ €๋„ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€๋Š”
> ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค๋งŒ ๊ฐ•์ค€์ˆ˜๋‹˜๊ณผ ์ตœ์ข…์—ด๋‹˜๋„ ์ฝ์–ด๋ณด์‹œ๊ณ  ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ์‹œ๋ฉด ๋ฌผ์–ด๋ณด์‹œ๊ณ , ์ €ํฌ๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ idea๊ฐ€ ์žˆ์œผ์‹œ๋ฉด
> ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
>
> ๊ทธ๋Ÿฐ๋ฐ...
>
>>
>> ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ROM์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ๊ฐ ๋ฆฌ์†Œ์Šค์˜ ์ž์‹ ๋ฆฌ์†Œ์Šค(๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, /child์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ ‘๊ทผ๋˜๋Š” ๊ฒƒ ๋ง์ž…๋‹ˆ๋‹ค)์˜
>> ์ ‘๊ทผ์„ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•  ๋•Œ,
>>
>> using vlastic;
>>
>> class person: rom::resource<person> {
>> picture_list get_pictures() const { ... }
>> post_list get_posts() const { ... }
>> };
>>

>> ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ํŽธ์ด (์•„๋งˆ๋„) ์ž์—ฐ์Šค๋Ÿฌ์› ์„ ๊ฒƒ์ด๊ณ , HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE ๋“ฑ...)์— ๋Œ€ํ•ด

Reply all
Reply to author
Forward
0 new messages