Mojo๋ Python์ ๊ฐ๋ ์ฑ๊ณผ C++์ ์๋๋ฅผ ๊ฒฐํฉํ ์ธ์ด์ ๋๋ค.
ํ๋์จ์ด์ ๊ฐ๊น์ด ํ์ ์์ค ์ฝ๋๋ถํฐ ๋ฐฑ์๋ API ๋์์ธ์ ํตํด ํ๋ฐํธ์๋ ๋ฐ ์น ์ธ๊ณ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ์ฉ๋์ ์ ์ฉํฉ๋๋ค. Mojo๋ ์ต์ ์คํ ์ ์ฒด๋ก ํ์ฅํ ์ ์์ ๋งํผ ๊ฐ๋ ฅํฉ๋๋ค. ์ด ์ธ์ด๋ AI์ ๋จธ์ ๋ฌ๋์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์์ผ๋ฏ๋ก AI ๊ฐ๋ฐ์์ ๋ฐ์ดํฐ ๊ณผํ์์๊ฒ ํนํ ์ ์ฉํ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๋ชจ์กฐ๋ ์์ง ์ด๋ฆฌ๋ค. ์ํ๊ณ์๋ ๋คํธ์ํน์ด๋ ๊ธฐ๋ณธ HTTP ์์ ๊ณผ ๊ฐ์ ์ผ์์ ์ธ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ํ ๋๊ตฌ๊ฐ ๋ถ์กฑํ์ต๋๋ค.
Lightbug ๐ฅ๐๊ฐ ๋ ์์ค๋ ๊ณณ์ด ๋ฐ๋ก ์ด๊ณณ์ ๋๋ค.
Lightbug ๐ฅ๐๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ถ ์ข ์์ฑ์ด ์๋ ์์ Mojo๋ก ์์ฑ๋ ๊ฐ๋จํ HTTP ํ๋ ์์ํฌ์ ๋๋ค. ์ด๋ ๋ณด๋ค ๋ณต์กํ ํ๋ก์ ํธ๋ฅผ ์ํ ๊ธฐ๋ฐ ์ญํ ์ ํ๋ฉฐ API์ ๊ฐ์ ์น ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ๊ธฐ๋ณธ ๋ผ์ฐํ ์ ์ค์ ํ๊ฑฐ๋ ์ฌ์ง์ด Mojo๋ฅผ ์ฌ์ฉํ์ฌ HTML ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ ๋์์ ์ ์ ์ ๋ ฅ ๋ฐ ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ๊ฐ์ ์ด ์ธ์ด์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. .
์์ํ๋ ค๋ฉด Mojo ์ Git์ ์ค์นํ ๋ค์ Lightbug Github ์ ์ฅ์๋ฅผ ๋ณต์ ํ์ธ์.
git clone https://github.com/saviorand/lightbug_http.git
๋ณต์ ๋๋ฉด ๋ช ๋ น์ค์์ ๋๋ ํฐ๋ฆฌ๋ก ์ ํํฉ๋๋ค.
cd lightbug_http
๊ทธ๋ฐ ๋ค์ ์๋ฒ๋ฅผ ์คํํฉ๋๋ค(์, Mojo ํ์ผ ํ์ฅ์์ ๋๋ค! ๐ฅ).
mojo lightbug.๐ฅ
์ฝ์์ ๋ค์ ์ค์ด ์ธ์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค:
๐ฅ๐ Lightbug is listening on 0.0.0.0:8080 Ready to accept connections...
์ด์ ์๋ฒ์ ์์ฒญ์ ์์ํ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ ์์ localhost:8080
๋๋ 0.0.0.0:8080
์ ์ด์ด๋ณผ ์ ์์ต๋๋ค. ์๊ฐ ํ๋ฉด์ด ํ์๋ฉ๋๋ค. Mojo ์คํ์ผ์ ์น์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค! ์ด์ ์ค์ ์ฝ๋ฉ์ ์์ํด ๋ณด๊ฒ ์ต๋๋ค.
Lightbug๋ ์์ง ์ด๊ธฐ ๋จ๊ณ์ด์ง๋ง ์ฌ๋๋ค์ด ์ต์ ์น์ฉ์ผ๋ก ๊ฐ๋ฐํ ์ ์์ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ ํต์ฌ ๊ธฐ๋ฅ์ ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.
์์ง ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์์ผ๋ฏ๋ก lightbug_http
ํ๋ก์ ํธ ๋ด์ ํ์ ํด๋๋ก ํฌํจํ๋ฉด ๋ฉ๋๋ค. ์ด๋ Mojo ํจํค์ง ๋ก ์๋ํ๋ฉฐ Lightbug์์ ์น ๊ธฐ๋ณธ ์์, ์๋ฒ ๋ฑ๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ํ์ผ ์๋จ์ ๋ค์์ ์ถ๊ฐํ์ธ์.
from lightbug_http.sys.server import SysServer
๊ทธ๋ฌ๋ฉด ์์ Mojo๋ก ์๋ฒ ๊ตฌํ์ ๊ฐ์ ธ์ต๋๋ค. Python ๊ตฌํ์ ์ฌ์ฉํ๋ ค๋ฉด ๋์ PythonServer
๊ฐ์ ธ์ค์ธ์. ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
HTTP ์๋น์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด HTTPService
ํน์ฑ์ ์ถฉ์กฑํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋์ธ์. ์ฆ, ๋ค์ ์๋ช
์ด ์๋ func
๋ฉ์๋๊ฐ ์๋ค๋ ์๋ฏธ์
๋๋ค.
trait HTTPService: fn func(self, req: HTTPRequest) raises -> HTTPResponse: ...
์ด๋ ๋ด์ฅ๋ ๊ธฐ๋ณธ ์์๋ฅผ ์ฌ์ฉํ์ฌ HTTPRequest
๊ฐ์ ธ์ค๊ณ , Mojo ๋๋ Python์ผ๋ก ์์ฑํ ์ฌ์ฉ์ ์ ์ ๋
ผ๋ฆฌ๋ฅผ ์คํํ๊ณ , ์ผ๋ถ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ HTTPResponse
๊ฐ์ฒด๋ฅผ API ์๋น์์๊ฒ ๋ฐํํฉ๋๋ค.
0.0.0.0:8080
์ผ๋ก ์ ์ก๋ ๋ชจ๋ ์์ฒญ์ ์ฝ์์ ์ถ๋ ฅํ๋ ์๋น์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด my_awesome_service.๐ฅ
๋ผ๋ ํ์ผ์ ๋ง๋ค๊ณ ๋ค์์ ๋ถ์ฌ๋ฃ์ต๋๋ค.
from lightbug_http import * @value struct Printer(HTTPService): fn func(self, req: HTTPRequest) raises -> HTTPResponse: let body = req.body_raw print(String(body)) return OK(body) fn main() raises: var server = SysServer() let handler = Printer() server.listen_and_serve("0.0.0.0:8080", handler)
mojo my_awesome_service.๐ฅ
์คํํ๊ณ Insomnia ๋๋ Bruno ์ ๊ฐ์ ์ฆ๊ฒจ ์ฌ์ฉํ๋ API ํด๋ผ์ด์ธํธ์์ 0.0.0.0:8080
์ผ๋ก ์์ฒญ์ ๋ณด๋
๋๋ค. ์ฝ์์ ์ธ์๋ ์์ฒญ์ ๋ํ ์ผ๋ถ ์ธ๋ถ์ ๋ณด๊ฐ ํ์๋ฉ๋๋ค.
์ถํํด์! ์ด์ ๊ณต์์ ์ผ๋ก Mojo ์น ๊ฐ๋ฐ์๊ฐ ๋์ จ์ต๋๋ค ๐ฅ.
์์ ์์๋ let
(์ฌํ ๋นํ ์ ์์)์ ์ฌ์ฉํ์ฌ handler
๋ผ๋ ๋ณ์๋ฅผ ์ด๊ธฐํํ๊ณ ๋ช
ํ์ฑ์ ์ํด ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ด๋ฅผ listen_and_serve
์ ์ ๋ฌํฉ๋๋ค.
@value
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ํ ์ฌํญ์
๋๋ค. ๊ณ ๊ธ Mojician์ด๋ผ๋ฉด ๋์ __init__
์์ฑ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋์ผํ๊ฒ ์๋ํฉ๋๋ค. @value
์ด ๋ฉ์๋์ ๊ธฐํ ์ ์ฉํ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
struct Printer(HTTPService): fn __init__(inout self): print("Printer initialized!") fn func(self, req: HTTPRequest) raises -> HTTPResponse: let body = req.body_raw print(String(body)) return OK(body)
๋ผ๊ณ ๋งํ ์๋ ์์ง๋ง ๊ทธ๊ฒ์ ๋จ์ง ํ๋์ ๊ฒฝ๋ก์ผ ๋ฟ์ ๋๋ค! ์ต์ API์๋ ๊ทธ ์ด์์ด ํ์ํฉ๋๋ค.
Lightbug๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ๋ผ์ฐํ ๋ ์ํํ ์ ์์ต๋๋ค.
@value struct ExampleRouter(HTTPService): fn func(self, req: HTTPRequest) raises -> HTTPResponse: let body = req.body_raw let uri = req.uri() if uri.path() == "/": print("I'm on the index path!") if uri.path() == "/first": print("I'm on /first!") elif uri.path() == "/second": print("I'm on /second!") return OK(body)
์ด๊ฒ์ my_awesome_service.๐ฅ
์ ์ถ๊ฐํ๊ณ ์๋ฒ์ ํธ๋ค๋ฌ๋ก ์ ๋ฌํฉ๋๋ค.
fn main() raises: var server = SysServer() let handler = ExampleRouter() server.listen_and_serve("0.0.0.0:8080", handler)
์ด์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ localhost:8080/first
, localhost:8080/second
๋ก ์ด๋ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ lightbug_http
์ธ ๊ฒฝ๋ ํ๋ ์์ํฌ/ํดํท์ด ์ ๊ณตํ ์ ์๋ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฉ์ ์ ์ ์ต์
์ ํ์ฉํ๋ฉด์ HTTP๋ฅผ ์ฌ์ฉํ๋ ์์ฒด ์ฑ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ ์ ์๋ ๊ธฐ๋ฐ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ lightbug_api
๋ฐ lightbug_web
ํจํค์ง๋ฅผ ๊ตฌ์ถํ์ฌ ๋ผ์ฐํ
์ ๋ฌผ๋ก OpenAPI ์ฌ์์์ API ์์ฑ ๋ฐ ์์ฑ, ๋ฐ์ดํฐ ๋ชจ๋ธ ์ค๊ณ, ์น ์ ํ๋ฆฌ์ผ์ด์
๊ตฌ์ถ๊ณผ ๊ฐ์ ๊ธฐํ ์์
์ ๋์ฑ ์ฆ๊ฒ๊ฒ ๋ง๋ค ๊ณํ์
๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ก๋๋งต์ ํ์ธํ์ธ์.
์ด๊ฒ์ด Lightbug ๐ฅ๐ ์ ๋ํ ์๊ฐ์ ๋๋ค! ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด๊ฒ์ ์คํ ์์ค, ๋น์์ ์ ์ปค๋ฎค๋ํฐ ํ๋ก์ ํธ์ ๋๋ค.
Github ์ ์ฅ์ โญ์ ๋ณํ๋ฅผ ํ์ํ๊ณ Discord ์ ๊ฐ์ ํ๊ณ ์ฝ๋๋ก ๊ธฐ์ฌํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ์ฌ ๋๋ฃ Mojician์ ์ํด ๋ ๋์ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๋ค์ ์๊ฐ๊น์ง!