paint-brush
Lightbug ๐Ÿ”ฅ๐Ÿ- ์ตœ์ดˆ์˜ Mojo HTTP ํ”„๋ ˆ์ž„์›Œํฌโ€‚by@a2svior
3,536
3,536

Lightbug ๐Ÿ”ฅ๐Ÿ- ์ตœ์ดˆ์˜ Mojo HTTP ํ”„๋ ˆ์ž„์›Œํฌ

Valentin Erokhin5m2024/01/10
Read on Terminal Reader

Mojo๋Š” Python์˜ ๊ฐ€๋…์„ฑ๊ณผ C++์˜ ์†๋„๋ฅผ ๊ฒฐํ•ฉํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด์— ๊ฐ€๊นŒ์šด ํ•˜์œ„ ์ˆ˜์ค€ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋ฐฑ์—”๋“œ API ๋””์ž์ธ์„ ํ†ตํ•ด ํ”„๋ŸฐํŠธ์—”๋“œ ๋ฐ ์›น ์„ธ๊ณ„์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์šฉ๋„์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Mojo๋Š” ์ตœ์‹  ์Šคํƒ ์ „์ฒด๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.
featured image - Lightbug ๐Ÿ”ฅ๐Ÿ- ์ตœ์ดˆ์˜ Mojo HTTP ํ”„๋ ˆ์ž„์›Œํฌ
Valentin Erokhin HackerNoon profile picture
0-item

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์„ ์œ„ํ•ด ๋” ๋‚˜์€ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹ค์Œ ์‹œ๊ฐ„๊นŒ์ง€!