๋ฆฌ์์ค ๊ฐ์ฒด ๋งคํ์ ๊ตฌํ์ ์์ด์, ํ์ฌ ๊ฐ์ฅ ์ด์๊ฐ ๋๋ ์ฌํญ์ด ๋ค์์คํ์ด์ค ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๋ถ๋ช
ํฉ๋๋ค. ์ ๋ ์ด ๋ถ๋ถ์ ๋ํด
์ฌ๋ฌ๊ฐ์ง ๊ณ ๋ฏผ์ ํ๊ณ ์์ต๋๋ค. 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 ๋ฌธ์๋ก ๋ง๋ค๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋๋๊ตฐ์.. ^_^
๊ทธ๋์ ๋ค๋ฅธ ์ธ์ด๋ก 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_์ด๋ผ๋ ์ ๋์ฌ๊ฐ ํญ์ ๋ถ๊ฒ ๋์ด ๋ค์์คํ์ด์ค ๋ฌธ์ ๊ฐ
์ฌ๋ผ์ก๊ฒ ์ฃ .
์ ๊ฐ ์๊ฐํ ย ๊ฒ์ ์ด๋ฐ ์์ผ๋ก ๊ฐ์ฒด์ ์ ํธ๋ฆฌ๋ทฐํธ/ํ๋กํผํฐ๋ฅผ ์์ ๋ฆฌ์์ค์ ์ ๊ทผ์ผ๋ก ์ฌ์ฉํ๋ ๊ฑฐ์๋๋ฐ, ๋ฌธ์ ๋ Python
๊ฐ์ฒด ๋ชจ๋ธ์ Lisp-1 vs Lisp-2 debate[1]์์ ๋งํ๋ Lisp-1์ ํด๋นํ๊ธฐ ๋๋ฌธ์, ์ฆ, ๊ฐ์ฒด์ ๋ฉค๋ฒ
ํจ์๋ ์ฌ์ค์ ํด๋น ์ด๋ฆ์ ์ ํธ๋ฆฌ๋ทฐํธ๋ก ํจ์ ๊ฐ์ฒด๊ฐ ๋ค์ด์์ ๋ฟ์ด๋ฏ๋ก resource.get(), resource.post()
๊ฐ์ ์์ผ๋ก HTTP ๋ฉ์๋๋ฅผ ์ํ ๋ณ๋ ๋ฉค๋ฒ ํจ์๋ฅผ ย ๋ง๋ค ๊ฒฝ์ฐ /get, /post์ ํด๋นํ๋ ์์ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค ์๊ฐ
์๊ฒ ๋๋ค๋ ์ ์ ๋๋ค. ๋ช ๋ฐฑํ์ง๋ง ์ด๋ ค์ด ๋ง์ ์ฐ์๋ฉด, ์ ํฌ๊ฐ ํ์ํ ์ ์ ๋ ๊ตฌ์ญ(HTTP ๋ฉ์๋, ์์ ๋ฆฌ์์ค ์ด๋ฆ)์ธ๋ฐ
๋งตํํ Python ๊ฐ์ฒด์๋, ์ง๊ธ๊น์ง๋, ์ผ๋จ ์ ์ด ํ๋(์ ํธ๋ฆฌ๋ทฐํธ)์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ฃ .
ย ์ ๊ฐ ๋ฌธ์ ๊ฐ ๋๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ 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 ํจ์๋ก ์๋ํ๊ณ ,
ํค์๋ ์ธ์๊ฐ ๋ค์ด์ค๊ฑฐ๋ ์ธ์๊ฐ ์์ผ๋ฉด ์ผ๋ฐ ๋ฉ์๋์ฒ๋ผ ์๋ํ๊ฒ ์ค๋ฒ๋ก๋ฉ๋๊ฒ ํ๋ฉด ์ด๋จ๊น ํ๋ ์์ด๋์ด๊ฐ ์๊ธด ํฉ๋๋ค. ๋
์ข์ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ ๊ฐ์๋ฐ, ์๊ฐ์ด ๋์ง ์๋ค์.
@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 ๋ฑ...)์ ๋ํด