์ „์ฒด ์•„ํ‚คํ…์ฒ˜

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ์ •๋ฆฌ๋œ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๊ตฌ์กฐ

๐Ÿ“ก Sensing / IoT

๐Ÿ“ถ

WiFi CSI๋กœ ์œ„์น˜ ๋ถ„์„์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

๋‹จ์ผ WiFi ์‹ ํ˜ธ์˜ ๋ฌผ๋ฆฌ ๊ณ„์ธต ๋ฐ์ดํ„ฐ๋ฅผ ๋ ˆ์ด๋”์ฒ˜๋Ÿผ ํ™œ์šฉ

WiFi ์‹ ํ˜ธ์˜ CSI(Channel State Information)๋ฅผ ๋ถ„์„ํ•˜์—ฌ, ์นด๋ฉ”๋ผ ์—†์ด ์‚ฌ๋žŒ์˜ ์œ„์น˜ยท์›€์ง์ž„ยทํ˜ธํกยท์‹ฌ๋ฐ•๊นŒ์ง€ ๊ฐ์ง€ํ•˜๋Š” ๊ธฐ์ˆ . ๊ฐ ์„œ๋ธŒ์บ๋ฆฌ์–ด์˜ ์ง„ํญ๊ณผ ์œ„์ƒ ๋ณ€ํ™”๋กœ ๋ฐ€๋ฆฌ๋ฏธํ„ฐ ์ˆ˜์ค€์˜ ๊ณต๊ฐ„ ์ •๋ณด๋ฅผ ์ถ”์ถœ

๐Ÿฆท

๋ธ”๋ฃจํˆฌ์Šค๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ๋‹น์‹ ์˜ ์ •๋ณด๋“ค

BLE ์‹ ํ˜ธ๋งŒ์œผ๋กœ ์ƒํ™œ ํŒจํ„ดยท์œ„์น˜ยทํ–‰๋™์ด ์ถ”์ ๋˜๋Š” ์›๋ฆฌ

๋ธ”๋ฃจํˆฌ์Šค๋ฅผ ์ผœ๋‘๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ MAC ์ฃผ์†Œ, ๊ธฐ๊ธฐ๋ช…, ์ œ์กฐ์‚ฌ, BLE ์„œ๋น„์Šค UUID ๋“ฑ์ด ๋Š์ž„์—†์ด ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋จ. ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ํ•˜๋‚˜๋กœ ์ฃผ๋ณ€ ์‚ฌ๋žŒ์˜ ์ถœํ‡ด๊ทผ ํŒจํ„ด, ํƒ๋ฐฐ ๋„์ฐฉ ์‹œ์ , ์ง‘ ๋น„๋Š” ์‹œ๊ฐ„๋Œ€๊นŒ์ง€ ํŒŒ์•… ๊ฐ€๋Šฅ

๐Ÿงฉ Runtime / Execution

โš™๏ธ

WebAssembly(WASM)๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

C++/Rust/Zig ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์†๋„๋กœ ์‹คํ–‰

WebAssembly(WASM)๋Š” C++, Rust, Zig ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ์— ๊ฐ€๊นŒ์šด ์†๋„๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ์ˆ . JavaScript๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณ ์„ฑ๋Šฅ ์—ฐ์‚ฐ(์ด๋ฏธ์ง€/๋น„๋””์˜ค ์ฒ˜๋ฆฌ, 3D ๋ Œ๋”๋ง, ํ„ฐ๋ฏธ๋„ ํŒŒ์„œ ๋“ฑ)์„ ์›น์—์„œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

๐Ÿ†

WASM์„ ์›น์˜ 1๊ธ‰ ์–ธ์–ด๋กœ ๋งŒ๋“ค๊ธฐ

JS glue ์—†์ด Web API๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” Component Model

2017๋…„ ์ถœ์‹œ ์ดํ›„ WASM์€ ์›น์—์„œ "2๊ธ‰ ์‹œ๋ฏผ" โ€” DOM/console ๋“ฑ Web API์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ  ๋ฐ˜๋“œ์‹œ JS glue code๋ฅผ ๊ฑฐ์ณ์•ผ ํ•จ. Mozilla๊ฐ€ ์ œ์•ˆํ•œ Component Model์€ WIT๋กœ API๋ฅผ ์„ ์–ธํ•˜๊ณ  JS ์—†์ด ์ง์ ‘ ํ˜ธ์ถœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ, WASM์„ ๋ธŒ๋ผ์šฐ์ €์˜ 1๊ธ‰ ์‹คํ–‰ ํ™˜๊ฒฝ์œผ๋กœ ๊ฒฉ์ƒ์‹œํ‚ค๋ ค๋Š” ์‹œ๋„

๐ŸŽฎ

WebGPU โ€” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋กœ์ปฌ GPU๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ๋ฐฉ๋ฒ•

WebGL์˜ ํ›„์†, Vulkan/Metal/DX12 ์ˆ˜์ค€์˜ ์ €์ˆ˜์ค€ GPU API๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋“ค์–ด์™”๋‹ค

WebGPU๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋œ JavaScript API๋กœ, ์›นํŽ˜์ด์ง€๊ฐ€ ๋กœ์ปฌ GPU ํ•˜๋“œ์›จ์–ด์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. WebGL์˜ ํ›„์†์ด๋ฉฐ OS๋ณ„๋กœ Vulkan/Metal/DirectX 12์— ๋งคํ•‘๋œ๋‹ค.

๐ŸŒ DNS / Domain

๐ŸŒ

DNS ๋„๋ฉ”์ธ ์„ค์ •์€ ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜๋˜๋‚˜?

onamae.com ๊ฐ™์€ ์‚ฌ์ดํŠธ์—์„œ ๋„๋ฉ”์ธ ์„ค์ •ํ•˜๋ฉด ์‹ค์ œ๋กœ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”๊ฐ€

DNS(Domain Name System)๋Š” ๋„๋ฉ”์ธ๋ช…(์˜ˆ: example.com)์„ IP ์ฃผ์†Œ(์˜ˆ: 93.184.216.34)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ธํ„ฐ๋„ท์˜ ์ „ํ™”๋ฒˆํ˜ธ๋ถ€. onamae.com ๊ฐ™์€ ๋ ˆ์ง€์ŠคํŠธ๋ผ์—์„œ ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๋ฉด ๋ฃจํŠธ ์„œ๋ฒ„ โ†’ TLD ์„œ๋ฒ„ โ†’ ๊ถŒํ•œ ๋„ค์ž„์„œ๋ฒ„ ์ˆœ์œผ๋กœ ๊ณ„์ธต์ ์œผ๋กœ ์ „ํŒŒ๋˜์–ด ์ „ ์„ธ๊ณ„์—์„œ ์ ‘์† ๊ฐ€๋Šฅํ•ด์ง„๋‹ค

โณ

๋„ค์ž„์„œ๋ฒ„ ๋ณ€๊ฒฝ์€ ์™œ 24~72์‹œ๊ฐ„ ๊ฑธ๋ฆฌ๋‚˜?

๋„ค์ž„์„œ๋ฒ„(NS) ๋ณ€๊ฒฝ ์‹œ ์ „ํŒŒ๊ฐ€ ๋А๋ฆฐ ์ง„์งœ ์ด์œ ์™€ ๊ฐ ๋‹จ๊ณ„๋ณ„ ์บ์‹œ ๊ตฌ์กฐ

๋„ค์ž„์„œ๋ฒ„ ๋ณ€๊ฒฝ์€ ๋‹จ์ˆœํ•œ DNS ๋ ˆ์ฝ”๋“œ ๋ณ€๊ฒฝ๊ณผ ๋‹ฌ๋ฆฌ TLD(.com/.net) ๋ ˆ๋ฒจ์˜ ์บ์‹œ๊นŒ์ง€ ๊ฐฑ์‹ ์ด ํ•„์š”ํ•˜๋‹ค. TLD NS ๋ ˆ์ฝ”๋“œ์˜ TTL์ด ๋ณดํ†ต 48์‹œ๊ฐ„์ด๊ณ , ISP ๋ฆฌ์กธ๋ฒ„๊ฐ€ ์ด๋ฅผ ์บ์‹œํ•˜๋ฏ€๋กœ ์ „ ์„ธ๊ณ„์— ๋ฐ˜์˜๋˜๊ธฐ๊นŒ์ง€ 24~72์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค

๐Ÿ”’

DNS-PERSIST-01์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

Let's Encrypt์˜ ์ง€์†์  DNS ์ธ์ฆ ๋ ˆ์ฝ”๋“œ๋กœ ๋ฐ˜๋ณต ๊ฒ€์ฆ ์ œ๊ฑฐ

Let's Encrypt ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์‹œ ๋งค๋ฒˆ DNS TXT ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” DNS-01์˜ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐ. _validation-persist. TXT ๋ ˆ์ฝ”๋“œ์— CA ๊ณ„์ • ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์„ค์ •ํ•˜๋ฉด ์ดํ›„ ๋ฐœ๊ธ‰/๊ฐฑ์‹ ์— ์žฌ์‚ฌ์šฉ

๐Ÿข

onamae.com์€ DNS ์ œ๊ณต ์—…์ฒด๊ฐ€ ๋˜๋ ค๋ฉด?

ICANN ์ธ์ฆ๋ถ€ํ„ฐ Anycast ์ธํ”„๋ผ๊นŒ์ง€, ๋„๋ฉ”์ธ ๋ ˆ์ง€์ŠคํŠธ๋ผ์˜ ๋’ท๋ฉด

onamae.com ๊ฐ™์€ DNS ์ œ๊ณต ์—…์ฒด(๋ ˆ์ง€์ŠคํŠธ๋ผ)๊ฐ€ ๋˜๋ ค๋ฉด ICANN ์ธ์ฆ, Anycast DNS ๋„คํŠธ์›Œํฌ, EPP ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„, WHOIS/RDAP ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, DDoS ๋ฐฉ์–ด ๋“ฑ ๋Œ€๊ทœ๋ชจ ์ธํ”„๋ผ์™€ ๊ทœ์ • ์ค€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค

๐Ÿ›’

๋„๋ฉ”์ธ ๊ตฌ์ž…์˜ ํ๋ฆ„

TLD ์„ ํƒ๋ถ€ํ„ฐ ๊ฐฑ์‹  ๊ด€๋ฆฌ๊นŒ์ง€, ๋„๋ฉ”์ธ ๊ตฌ๋งค์˜ ๋ชจ๋“  ๋‹จ๊ณ„

๋„๋ฉ”์ธ ๊ตฌ๋งค๋Š” TLD ์„ ํƒ โ†’ WHOIS ๊ฐ€์šฉ์„ฑ ํ™•์ธ โ†’ ๋ ˆ์ง€์ŠคํŠธ๋ผ ์„ ํƒ โ†’ ๋“ฑ๋ก (์—ฐ๋ฝ์ฒ˜ ์ •๋ณด + WHOIS Privacy) โ†’ DNS ์ดˆ๊ธฐ ์„ค์ • โ†’ ๊ฐฑ์‹  ๊ด€๋ฆฌ์˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋œ๋‹ค. ๋„๋ฉ”์ธ ๋ผ์ดํ”„์‚ฌ์ดํด, ํ”„๋ฆฌ๋ฏธ์—„ ๋„๋ฉ”์ธ ์‹œ์žฅ, ๋„๋ฉ”์ธ ๋„๋‚œ ๋ฐฉ์ง€๊นŒ์ง€ ํฌ๊ด„ ํ•ด์„ค

๐Ÿ”

๋ฌด๋ฃŒ HTTPS ์„œ๋น„์Šค๋“ค์˜ ์›๋ฆฌ

Let's Encrypt, Cloudflare, ACM์ด ๋ฌด๋ฃŒ ์ธ์ฆ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•

ACME ํ”„๋กœํ† ์ฝœ, ๋„๋ฉ”์ธ ๊ฒ€์ฆ, CA ์‹ ๋ขฐ ์ฒด์ธ, TLS ํ•ธ๋“œ์…ฐ์ดํฌ ๋“ฑ ๋ฌด๋ฃŒ HTTPS ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ํ•ด๋ถ€ํ•ฉ๋‹ˆ๋‹ค

๐Ÿšจ

DNS ์žฅ์•  ์‚ฌ๊ณ  ์‚ฌ๋ก€ ๋ชจ์Œ

์ธํ„ฐ๋„ท์„ ๋ฉˆ์ถ˜ ๋Œ€ํ˜• DNS ์žฅ์• ๋“ค๊ณผ ๊ตํ›ˆ

Dyn DDoS, Facebook BGP ์‚ฌ๊ณ , Fastly ์žฅ์•  ๋“ฑ ์ฃผ์š” DNS ๊ด€๋ จ ์žฅ์•  ์‚ฌ๋ก€๋ฅผ ๋ถ„์„ํ•˜๊ณ , ๋‹จ์ผ ์žฅ์• ์  ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์‹ค๋ฌด ๊ตํ›ˆ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค

๐Ÿ” How It Works

๐Ÿš‡

ngrok์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

๋ฆฌ๋ฒ„์Šค ํ„ฐ๋„๋กœ ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์ธํ„ฐ๋„ท์— ๋…ธ์ถœ

ngrok์€ ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๊ณต๊ฐœ URL๋กœ ๋…ธ์ถœํ•˜๋Š” ํ„ฐ๋„๋ง ์„œ๋น„์Šค. ๋‚ด PC์—์„œ ngrok ํด๋ผ์ด์–ธํŠธ๊ฐ€ ngrok ํด๋ผ์šฐ๋“œ์— ์•„์›ƒ๋ฐ”์šด๋“œ ์—ฐ๊ฒฐ์„ ์—ด๊ณ , ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์ด ๊ทธ ํ„ฐ๋„์„ ํƒ€๊ณ  ๋กœ์ปฌ๋กœ ์ „๋‹ฌ๋จ

๐Ÿ’ฌ

Slack Socket Mode๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

Webhook ์—†์ด ์•„์›ƒ๋ฐ”์šด๋“œ WebSocket์œผ๋กœ ์ด๋ฒคํŠธ ์ˆ˜์‹ 

Slack Bot์ด ๊ณต๊ฐœ URL ์—†์ด ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐฉ์‹. Bot ์„œ๋ฒ„๊ฐ€ Slack์— WebSocket ์—ฐ๊ฒฐ์„ ๋จผ์ € ์—ด๋ฉด, Slack์ด ๊ทธ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ push. ๋ฐฉํ™”๋ฒฝ ๋’ค์—์„œ๋„ ๋™์ž‘

๐Ÿค–

ChatGPT ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

SSE๋กœ ํ† ํฐ ๋‹จ์œ„ ์‹ค์‹œ๊ฐ„ ์‘๋‹ต ์ „๋‹ฌ

ChatGPT๊ฐ€ ๋‹ต๋ณ€์„ ํ•œ ๊ธ€์ž์”ฉ ํ‘œ์‹œํ•˜๋Š” ๋น„๋ฐ€. OpenAI API๊ฐ€ SSE(Server-Sent Events)๋กœ ์ƒ์„ฑ๋œ ํ† ํฐ์„ ์ฆ‰์‹œ ์ŠคํŠธ๋ฆฌ๋ฐ ์ „์†กํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜๋‚˜์”ฉ ๋ฐ›์•„ ํ™”๋ฉด์— ๋ Œ๋”๋ง

๐Ÿ™

GitHub Webhook์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

git push โ†’ HTTP POST โ†’ CI/CD ํŠธ๋ฆฌ๊ฑฐ

GitHub์—์„œ ์ฝ”๋“œ push, PR ์ƒ์„ฑ ๋“ฑ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ, ์‚ฌ์ „์— ๋“ฑ๋กํ•œ URL๋กœ HTTP POST๋ฅผ ๋ณด๋‚ด ์™ธ๋ถ€ ์‹œ์Šคํ…œ(CI/CD, ์Šฌ๋ž™ ์•Œ๋ฆผ ๋“ฑ)์„ ์ž๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹

โš™๏ธ

Sidekiq๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

Redis ๊ธฐ๋ฐ˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์žก ํ ์‹œ์Šคํ…œ

Rails์—์„œ ๋ฌด๊ฑฐ์šด ์ž‘์—…(์ด๋ฉ”์ผ ๋ฐœ์†ก, ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋„˜๊ธฐ๋Š” ์‹œ์Šคํ…œ. ์›น ํ”„๋กœ์„ธ์Šค๊ฐ€ Redis ํ์— ์žก์„ ๋„ฃ์œผ๋ฉด, Sidekiq ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊บผ๋‚ด์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

๐Ÿ“น

WebRTC๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ์ง์ ‘ ์˜์ƒ/์Œ์„ฑ/๋ฐ์ดํ„ฐ ์ „์†ก

๋ธŒ๋ผ์šฐ์ €๋ผ๋ฆฌ ์ค‘์•™ ์„œ๋ฒ„ ์—†์ด ์˜์ƒํ†ตํ™”, ํ™”๋ฉด๊ณต์œ , ํŒŒ์ผ์ „์†ก์„ ํ•˜๋Š” ๊ธฐ์ˆ . ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•œ ๋’ค, STUN/TURN์œผ๋กœ NAT๋ฅผ ๋šซ๊ณ  P2P ์ง์ ‘ ์—ฐ๊ฒฐ

๐Ÿ”Œ

MCP๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

AI ๋ชจ๋ธ๊ณผ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์˜คํ”ˆ ํ”„๋กœํ† ์ฝœ

MCP(Model Context Protocol)๋Š” AI ๋ชจ๋ธ(LLM)๊ณผ ์™ธ๋ถ€ ๋„๊ตฌยท๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์˜คํ”ˆ ํ”„๋กœํ† ์ฝœ. Host(Claude ๋“ฑ)๊ฐ€ Client๋ฅผ ํ†ตํ•ด MCP Server์— ์—ฐ๊ฒฐํ•˜๋ฉด, Server๊ฐ€ DBยทํŒŒ์ผยทAPI ๋“ฑ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์„ AI์— ๋…ธ์ถœ

๐Ÿ”€

MCP Transport: stdio vs Streamable HTTP

๋กœ์ปฌ ๊ฐœ๋ฐœ๊ณผ ํด๋ผ์šฐ๋“œ SaaS ๋ฐฐํฌ์˜ ์ฐจ์ด

MCP๋Š” ๋‘ ๊ฐ€์ง€ ๊ณต์‹ transport๋ฅผ ์ง€์›: stdio(๋กœ์ปฌ)์™€ Streamable HTTP(์›๊ฒฉ/SaaS). 2025๋…„ 3์›” ๋„์ž…๋œ Streamable HTTP๋กœ SaaS ๋ฒค๋”๊ฐ€ MCP ์„œ๋ฒ„๋ฅผ ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌํ•˜๊ณ  ๋‹ค์ˆ˜์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๐Ÿ–ฅ๏ธ

tmux๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

ํ„ฐ๋ฏธ๋„ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ๋กœ ์„ธ์…˜ ์œ ์ง€ & ๋ถ„ํ• 

tmux๋Š” ํ•˜๋‚˜์˜ ํ„ฐ๋ฏธ๋„์—์„œ ์—ฌ๋Ÿฌ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ํ„ฐ๋ฏธ๋„ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ. ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ๋กœ, SSH ์—ฐ๊ฒฐ์ด ๋Š๊ฒจ๋„ ์„ธ์…˜์ด ์œ ์ง€๋˜๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ attach ๊ฐ€๋Šฅ

๐Ÿ”€

Vercel Subdirectory Reverse Proxy๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

Next.js ๋„๋ฉ”์ธ ์•„๋ž˜ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์™ธ๋ถ€ ์„œ๋ฒ„ ์ฝ˜ํ…์ธ ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ SEO ๊ถŒ์œ„๋ฅผ ์ง‘์ค‘

negabaro.com(Vercel/Next.js)์—์„œ /blog/* ๊ฒฝ๋กœ๋ฅผ Rails(DigitalOcean) ๋˜๋Š” Jekyll(GitHub Pages) ๋“ฑ ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ. ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋‹จ์ผ ๋„๋ฉ”์ธ์œผ๋กœ ๋ณด์ด๋ฉด์„œ, ์‹ค์ œ ์ฝ˜ํ…์ธ ๋Š” ๋ณ„๋„ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง. ๋ฐฑ์—”๋“œ ๊ธฐ์ˆ  ์Šคํƒ์— ๋ฌด๊ด€ํ•˜๊ฒŒ canonical/robots.txt/asset ์ ˆ๋Œ€ URL ์„ค์ •์œผ๋กœ SEO ๊ถŒ์œ„๋ฅผ ๋ฉ”์ธ ๋„๋ฉ”์ธ์— ์ง‘์ค‘ํ•˜๋Š” ๊ตฌ์กฐ

๐Ÿณ

Docker ์ปจํ…Œ์ด๋„ˆ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ

Linux ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ถ€ํ„ฐ macOS ์ง€์›, GPU๊นŒ์ง€ โ€” 10๋…„๊ฐ„์˜ ๊ธฐ์ˆ ์  ์ง„ํ™”

2013๋…„ ๋“ฑ์žฅํ•œ Docker๋Š” Linux ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ VM ์—†์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฒฉ๋ฆฌํ•œ๋‹ค. CLI ๋’ค์—๋Š” ์ˆ˜์‹ญ ๋…„๊ฐ„์˜ ์‹œ์Šคํ…œ ์—ฐ๊ตฌ๊ฐ€ ์ˆจ์–ด ์žˆ๊ณ , macOS/Windows ์ง€์›์„ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ VMM์ด๋ผ๋Š” ์—ญ๋ฐœ์ƒ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฑ„ํƒํ–ˆ๋‹ค.

๐Ÿ›

Keploy โ€” eBPF๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„ API ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์กฐ

eBPF๊ฐ€ ์ปค๋„์—์„œ connect() ๋ชฉ์ ์ง€๋ฅผ ๋ชฐ๋ž˜ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋Š” ํˆฌ๋ช… ํ”„๋ก์‹œ ํŒจํ„ด

keploy record๋กœ ์•ฑ์„ ๊ฐ์‹ธ๋ฉด, eBPF๊ฐ€ ์ปค๋„ ๋ ˆ๋ฒจ์—์„œ ๋ชจ๋“  ์•„์›ƒ๋ฐ”์šด๋“œ ์—ฐ๊ฒฐ์˜ ๋ชฉ์ ์ง€๋ฅผ ๋กœ์ปฌ ํ”„๋ก์‹œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•œ๋‹ค. ์•ฑ์€ ๋ชจ๋ฅธ๋‹ค. ํ”„๋ก์‹œ๊ฐ€ ํ”„๋กœํ† ์ฝœ๋ณ„๋กœ ํŠธ๋ž˜ํ”ฝ์„ ํŒŒ์‹ฑํ•ด์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค+Mock์„ YAML๋กœ ๋ฝ‘์•„๋‚ธ๋‹ค.

๐Ÿ—๏ธ System Design

๐Ÿ—๏ธ

์ข‹์€ ์‹œ์Šคํ…œ ์„ค๊ณ„๋ž€ โ€” ๋ˆˆ์— ๋„์ง€ ์•Š๋Š” ์„ค๊ณ„๊ฐ€ ์ตœ๊ณ ์˜ ์„ค๊ณ„๋‹ค

์ƒํƒœ ๊ด€๋ฆฌ, DB ์„ค๊ณ„, ์บ์‹ฑ, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ์žฅ์•  ๋ณต๊ตฌ๊นŒ์ง€ โ€” ๊ฒ€์ฆ๋œ ๋‹จ์ˆœํ•จ์˜ ํž˜

์ข‹์€ ์‹œ์Šคํ…œ ์„ค๊ณ„๋Š” ๋ณต์žกํ•ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , "์ด ๋ถ€๋ถ„์€ ์‹ ๊ฒฝ ์“ธ ํ•„์š” ์—†๋‹ค"๋Š” ๋ฐ˜์‘์ด ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต์ด๋‹ค. ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ค„์ด๊ณ , ๊ฒ€์ฆ๋œ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋ฅผ ์“ฐ๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค.

๐ŸŽฏ

ํ˜‘์—…์€ ํ—›์†Œ๋ฆฌ๋‹ค โ€” ์†Œ์ˆ˜๊ฐ€ ๋งŒ๋“ค๊ณ , ๋‹ค์ˆ˜๊ฐ€ ํšŒ์˜ํ•œ๋‹ค

Brooks์˜ ๋ฒ•์น™, Ringelmann ํšจ๊ณผ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ๋„๊ตฌ๊ฐ€ ๊ฐ์ถ”๋Š” ์ฑ…์ž„ ํ™•์‚ฐ์˜ ๊ตฌ์กฐ

์กฐ์ง ๋‚ด ์‹ค์งˆ์  ์„ฑ๊ณผ๋Š” ์†Œ์ˆ˜๊ฐ€ ๋งŒ๋“ ๋‹ค. ํ…Œํฌ ์—…๊ณ„๋Š” ์ด ๋ฌธ์ œ์— 'ํ˜‘์—…'์„ ์ฒ˜๋ฐฉํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์กฐ์œจ ๋„๊ตฌ๋งŒ ๋Š˜๊ณ  ์‚ฐ์ถœ๋ฌผ์€ ๋‚˜์˜ค์ง€ ์•Š๋Š” ๊ตฌ์กฐ๊ฐ€ ๊ณ ์ฐฉ๋๋‹ค. ์ง„์งœ ํ•„์š”ํ•œ ๊ฑด ํ˜‘์—… ์ธํ”„๋ผ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐœ์ธ์˜ ์ฃผ์ฒด์  ํŒ๋‹จ๊ณผ ์ฑ…์ž„(ownership)์ด๋‹ค.

๐Ÿงช

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ƒˆ๋กœ์šด ํ•ด์ž(Moat)๊ฐ€ ๋˜๋Š” ์‹œ๋Œ€

AI ์‹œ๋Œ€์— ์ง„์งœ ์ž์‚ฐ์€ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋‹ค

AI๊ฐ€ ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„๋„ ์•ˆ ๋ณด๊ณ  ๋ฌธ์„œ์™€ ํ…Œ์ŠคํŠธ๋งŒ ํ•™์Šตํ•ด์„œ ๊ฒฝ์Ÿ ์ œํ’ˆ์„ 1์ฃผ์ผ ๋งŒ์— ๋งŒ๋“ค์–ด๋‚ด๋Š” ์‹œ๋Œ€๋‹ค. ์ฝ”๋“œ๋Š” ๋” ์ด์ƒ ํ•ด์ž๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ง„์งœ ์ž์‚ฐ์€ ์ˆ˜๋งŒ ๊ฐœ์˜ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฒ„ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋‹ค.

๐ŸŽฌ FFmpeg

๐ŸŽฌ

FFmpeg โ€” 25๋…„๊ฐ„ ๋ฏธ๋””์–ด ์„ธ๊ณ„๋ฅผ ์ง€ํƒฑํ•ด์˜จ ์Šค์œ„์Šค ์•„๋ฏธ ๋‚˜์ดํ”„

์•„ํ‚คํ…์ฒ˜, ์ฝ”๋ฑ ์ถ”์ƒํ™”, ํ•„ํ„ฐ ์ฒด์ธ, ํ•˜๋“œ์›จ์–ด ๊ฐ€์†๊นŒ์ง€ โ€” FFmpeg์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ ํ•ด๋ถ€

FFmpeg์€ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฏธ๋””์–ด ํฌ๋งท์„ ๋””์ฝ”๋”ฉยท์ธ์ฝ”๋”ฉยท๋ณ€ํ™˜ยท์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. 2000๋…„ Fabrice Bellard๊ฐ€ ์‹œ์ž‘ํ•ด 25๋…„ ๋„˜๊ฒŒ ๊ฐœ๋ฐœ์ด ์ด์–ด์ง€๊ณ  ์žˆ๋‹ค. YouTube, Netflix, Meta, VLC, OBS โ€” ๋ฏธ๋””์–ด๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ณณ์—์„œ FFmpeg์ด ๋Œ์•„๊ฐ„๋‹ค.

๐Ÿ“ก

Meta์˜ FFmpeg ํ™œ์šฉ โ€” ํ•˜๋ฃจ ์ˆ˜๋ฐฑ์–ต ํšŒ, ๋Œ€๊ทœ๋ชจ ๋ฏธ๋””์–ด ์ฒ˜๋ฆฌ์˜ ๋น„๋ฐ€

๋‚ด๋ถ€ ํฌํฌ ํ๊ธฐ, ๋ฉ€ํ‹ฐ๋ ˆ์ธ ๋ณ‘๋ ฌ ์ธ์ฝ”๋”ฉ, ์‹ค์‹œ๊ฐ„ ํ’ˆ์งˆ ๋ฉ”ํŠธ๋ฆญ, ์ž์ฒด ASIC๊นŒ์ง€

Meta๋Š” ํ•˜๋ฃจ ์ˆ˜๋ฐฑ์–ต ํšŒ FFmpeg์„ ์‹คํ–‰ํ•œ๋‹ค. ์˜ค๋žซ๋™์•ˆ ๋‚ด๋ถ€ ํฌํฌ์— ์˜์กดํ–ˆ์ง€๋งŒ, FFmpeg ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ˜‘๋ ฅํ•ด ๋ฉ€ํ‹ฐ๋ ˆ์ธ ๋ณ‘๋ ฌ ์ธ์ฝ”๋”ฉ๊ณผ ์‹ค์‹œ๊ฐ„ ํ’ˆ์งˆ ๋ฉ”ํŠธ๋ฆญ์„ ์—…์ŠคํŠธ๋ฆผ์— ๊ตฌํ˜„ํ•˜๊ณ  ๋‚ด๋ถ€ ํฌํฌ๋ฅผ ์™„์ „ํžˆ ํ๊ธฐํ–ˆ๋‹ค. ์ž์ฒด ASIC์ธ MSVP๋„ FFmpeg ํ‘œ์ค€ API๋กœ ํ†ตํ•ฉํ–ˆ๋‹ค.

๐Ÿ“ฆ

FFmpeg ๋ฒ„์ „๋ณ„ ๋ณ€ํ™” โ€” 6.0์—์„œ 8.1๊นŒ์ง€, ๋ฌด์—‡์ด ๋‹ฌ๋ผ์กŒ๋‚˜

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๋ฆฌํŒฉํ† ๋ง, Vulkan ์ฝ”๋ฑ, ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ํ™•๋Œ€, ๊ทธ๋ฆฌ๊ณ  8.1 "Hoare"๊นŒ์ง€

FFmpeg 6.0๋ถ€ํ„ฐ 8.1๊นŒ์ง€ ๋ฉ”์ด์ € ๋ณ€ํ™”๋ฅผ ์ •๋ฆฌํ•œ๋‹ค. Meta ๊ธฐ๋ฐ˜์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๋ฆฌํŒฉํ† ๋ง(6.0~8.0), Vulkan ํ•˜๋“œ์›จ์–ด ์ฝ”๋ฑ, ์ธ๋ฃจํ”„ ๋””์ฝ”๋”ฉ, ๊ทธ๋ฆฌ๊ณ  ์ตœ์‹  8.1 "Hoare"์˜ xHE-AAC, D3D12, Rockchip ์ธ์ฝ”๋”ฉ๊นŒ์ง€.

๐Ÿ“ฑ Cross-Platform

โœจ

Sparkling โ€” TikTok์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ธํ”„๋ผ

Lynx ์—”์ง„ ์œ„์—์„œ ์‹ค์ œ ์•ฑ์„ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ํ”„๋กœ๋•์…˜ ํ”„๋ ˆ์ž„์›Œํฌ

TikTok์ด ์ž์‚ฌ ์•ฑ์—์„œ Lynx ์—”์ง„์„ ํ”„๋กœ๋•์…˜ ๊ทœ๋ชจ๋กœ ์šด์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์ถ•ํ•œ ์ธํ”„๋ผ ๋ ˆ์ด์–ด๋ฅผ ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœํ–ˆ๋‹ค. React Native์— Expo๊ฐ€ ํ•„์š”ํ•˜๋“ฏ, Lynx ์—”์ง„ ์œ„์—์„œ ์‹ค์ œ ์•ฑ์„ ์šด์šฉํ•˜๋ ค๋ฉด ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ, ๋„ค์ดํ‹ฐ๋ธŒ ๋ธŒ๋ฆฟ์ง€, ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ฐ™์€ ์ธํ”„๋ผ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Sparkling์ด ๊ทธ ๊ฐญ์„ ๋ฉ”์šด๋‹ค.

๐Ÿฑ

Lynx โ€” TikTok์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ UI ์—”์ง„

React์ฒ˜๋Ÿผ ์“ฐ๊ณ , ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๋ Œ๋”๋ง

Lynx๋Š” TikTok์ด ๊ณต๊ฐœํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ UI ๋ Œ๋”๋ง ์—”์ง„์ด๋‹ค. ์›น ๊ธฐ์ˆ (React ์œ ์‚ฌ ๋ฌธ๋ฒ•)๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ๋ Œ๋”๋ง์œผ๋กœ Android/iOS ํ™”๋ฉด์„ ๊ทธ๋ ค์ค€๋‹ค. React Native์™€ ๋น„์Šทํ•œ ํฌ์ง€์…˜์ด์ง€๋งŒ, TikTok ํ”„๋กœ๋•์…˜์—์„œ ๊ฒ€์ฆ๋œ ์ž์ฒด ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ๊ฒŒ ์ฐจ๋ณ„์ .

๐Ÿค– Agentic AI

๐Ÿค–

Agentic AI โ€” ์ž์œจ ์—์ด์ „ํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

LLM์ด ๋„๊ตฌ๋ฅผ ์“ฐ๊ณ , ํŒ๋‹จํ•˜๊ณ , ๋ฐ˜๋ณตํ•˜๋Š” ๊ตฌ์กฐ

Agentic AI๋Š” LLM์ด ๋‹จ์ˆœํžˆ ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฑธ ๋„˜์–ด, ์Šค์Šค๋กœ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ  ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ๋ชฉํ‘œ๋ฅผ ํ–ฅํ•ด ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. "์ฑ—๋ด‡"๊ณผ "์—์ด์ „ํŠธ"์˜ ์ฐจ์ด๋Š” ์ž์œจ์„ฑ์ด๋‹ค. ์ฑ—๋ด‡์€ ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•˜๊ณ , ์—์ด์ „ํŠธ๋Š” ๋ชฉํ‘œ๋ฅผ ํ–ฅํ•ด ์Šค์Šค๋กœ ํ–‰๋™ํ•œ๋‹ค.

๐Ÿ”

Agent Loop โ€” ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ๋ฃจํ”„ ํ•ด๋ถ€

while ๋ฃจํ”„ ํ•˜๋‚˜๊ฐ€ ์—์ด์ „ํŠธ์˜ ์ „๋ถ€๋‹ค

์—์ด์ „ํŠธ์˜ ํ•ต์‹ฌ์€ "LLM์„ ๋ฃจํ”„ ์•ˆ์—์„œ ๋Œ๋ฆฌ๋Š” ๊ฒƒ"์ด๋‹ค. ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ  ๋๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋„๊ตฌ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์„œ ๋‹ค์‹œ LLM์— ๋„˜๊ธฐ๊ณ , LLM์ด ๋‹ค์Œ ํ–‰๋™์„ ๊ฒฐ์ •ํ•˜๋Š” ์‚ฌ์ดํด. ์ด ๋ฃจํ”„๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋А๋ƒ๊ฐ€ ์—์ด์ „ํŠธ์˜ ํ’ˆ์งˆ์„ ๊ฒฐ์ •ํ•œ๋‹ค.

๐Ÿ”ง

Tool Use ํŒจํ„ด โ€” LLM์— ์†๊ณผ ๋ฐœ์„ ๋‹ฌ์•„์ฃผ๊ธฐ

ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด LLM์ด ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ตฌ์กฐ

LLM์€ ํ…์ŠคํŠธ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜, API๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, DB๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด "๋„๊ตฌ"๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Tool Use๋Š” LLM์—๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜ ๋ชฉ๋ก์„ ์•Œ๋ ค์ฃผ๊ณ , LLM์ด ํ•„์š”ํ•  ๋•Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

๐Ÿ˜…

Ralph Wiggum Loop โ€” ์—์ด์ „ํŠธ๊ฐ€ ๊ฐ™์€ ์‚ฝ์งˆ์„ ๋ฐ˜๋ณตํ•  ๋•Œ

"I'm in danger" โ€” ์—์ด์ „ํŠธ๊ฐ€ ๋น ์ ธ๋‚˜์˜ค์ง€ ๋ชปํ•˜๋Š” ๋ฃจํ”„์˜ ์›์ธ๊ณผ ๋Œ€์ฑ…

์—์ด์ „ํŠธ๊ฐ€ ๊ฐ™์€ ์—๋Ÿฌ์— ๊ฐ™์€ ์ˆ˜์ •์„ ๋ฐ˜๋ณตํ•˜๊ณ , ์ง„์ „ ์—†์ด ํ† ํฐ๋งŒ ํƒœ์šฐ๋Š” ์ƒํƒœ. ์‹ฌ์Šจ ๊ฐ€์กฑ์˜ Ralph Wiggum์ด "I'm in danger"๋ผ๊ณ  ํ•˜๋ฉด์„œ ๋ฉํ•˜๋‹ˆ ์•‰์•„์žˆ๋Š” ๋ฐˆ์—์„œ ๋”ฐ์˜จ ์ด๋ฆ„. AI ์—์ด์ „ํŠธ ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ํ”ํ•˜๊ณ  ๋น„์šฉ์ด ํฐ ์•ˆํ‹ฐํŒจํ„ด์ด๋‹ค.

๐Ÿค

Human-in-the-Loop โ€” ์‚ฌ๋žŒ์ด ๋ผ์–ด๋“œ๋Š” ํƒ€์ด๋ฐ

์™„์ „ ์ž์œจ vs ์ ์ ˆํ•œ ๊ฐœ์ž…, ๊ทธ ๊ท ํ˜•์ 

์—์ด์ „ํŠธ๊ฐ€ ๋ชจ๋“  ๊ฑธ ์ž๋™์œผ๋กœ ํ•˜๋ฉด ํŽธํ•˜์ง€๋งŒ, ๋Œ์ดํ‚ฌ ์ˆ˜ ์—†๋Š” ํ–‰๋™(๋ฐ์ดํ„ฐ ์‚ญ์ œ, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ, ๊ฒฐ์ œ)์€ ์‚ฌ๋žŒ์ด ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. Human-in-the-Loop์€ "์–ธ์ œ ์‚ฌ๋žŒํ•œํ…Œ ๋ฌผ์–ด๋ณผ ๊ฒƒ์ธ๊ฐ€"๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

๐Ÿ”ง Harness Engineering

๐Ÿ”ง

Harness(ํ•˜๋„ค์Šค)๋ž€ ๋ฌด์—‡์ธ๊ฐ€

ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ AI ์—์ด์ „ํŠธ๊นŒ์ง€, ๋Œ€์ƒ์„ ๊ฐ์‹ธ์„œ ์ œ์–ดํ•˜๋Š” ์‹œ์Šคํ…œ

Harness๋Š” AI์— ๊ตญํ•œ๋œ ๊ฐœ๋…์ด ์•„๋‹ˆ๋‹ค. ์›๋ž˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์˜ Test Harness์—์„œ ์˜จ ๊ฒƒ์œผ๋กœ, "๋Œ€์ƒ์„ ๊ฐ์‹ธ์„œ ์ œ์–ดํ•˜๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ" ์ „์ฒด๋ฅผ ๋œปํ•œ๋‹ค. AI ํ•˜๋„ค์Šค๋“ , ํ…Œ์ŠคํŠธ ํ•˜๋„ค์Šค๋“ , ํ•ต์‹ฌ์€ ๊ฐ™๋‹ค โ€” ๋Œ€์ƒ ์ž์ฒด๋ณด๋‹ค ๋Œ€์ƒ์„ ๊ฐ์‹ธ๋Š” ์‹œ์Šคํ…œ์˜ ์„ค๊ณ„๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์ขŒ์šฐํ•œ๋‹ค.

โš–๏ธ

Harness Engineering vs Prompt Engineering

ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž˜ ์งœ๋Š” ๊ฒƒ๊ณผ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ž˜ ์งœ๋Š” ๊ฒƒ์€ ๋‹ค๋ฅด๋‹ค

Prompt Engineering์€ ๋ชจ๋ธ์—๊ฒŒ "๋ญ˜ ํ•ด๋ผ"๋ฅผ ์ž˜ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. Harness Engineering์€ ๋ชจ๋ธ์ด "์–ด๋–ค ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋А๋ƒ"๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๊ฐ™์€ ํ”„๋กฌํ”„ํŠธ๋ผ๋„ ํ•˜๋„ค์Šค๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง„๋‹ค.

๐Ÿ›ก๏ธ

๊ฐ€๋“œ๋ ˆ์ผ ์„ค๊ณ„ โ€” ๋ชจ๋ธ์ด ์‚ฝ์งˆํ•˜๊ธฐ ์ „์— ๋ง‰๋Š” ๋ฒ•

์ž…๋ ฅ ํ•„ํ„ฐ, ์ถœ๋ ฅ ๊ฒ€์ฆ, ํ–‰๋™ ์ œํ•œ์œผ๋กœ ์•ˆ์ „ํ•œ ํ•˜๋„ค์Šค ๋งŒ๋“ค๊ธฐ

๋ชจ๋ธ์€ ํ™•๋ฅ ์ ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค. 10๋ฒˆ ์ค‘ 9๋ฒˆ ๋งž์•„๋„ 1๋ฒˆ์€ ํ‹€๋ฆฐ๋‹ค. ๊ฐ€๋“œ๋ ˆ์ผ์€ ๊ทธ 1๋ฒˆ์ด ํ”„๋กœ๋•์…˜์—์„œ ํ„ฐ์ง€์ง€ ์•Š๊ฒŒ ๋ง‰๋Š” ์•ˆ์ „์žฅ์น˜๋‹ค. ์ž…๋ ฅ ๋‹จ๊ณ„, ์‹คํ–‰ ๋‹จ๊ณ„, ์ถœ๋ ฅ ๋‹จ๊ณ„ ๊ฐ๊ฐ์— ๊ฐ€๋“œ๋ ˆ์ผ์„ ๋‘”๋‹ค.

๐Ÿ“Š

ํ‰๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ โ€” ํ•˜๋„ค์Šค ํ’ˆ์งˆ์„ ์ธก์ •ํ•˜๋Š” ๋ฒ•

๊ฐ์œผ๋กœ ํŒ๋‹จํ•˜๋ฉด ์ง„๋‹ค, ์ž๋™ํ™”๋œ ํ‰๊ฐ€ ์ฒด๊ณ„๊ฐ€ ํ•„์ˆ˜๋‹ค

ํ•˜๋„ค์Šค๋ฅผ ๋ฐ”๊ฟจ๋Š”๋ฐ ์ข‹์•„์กŒ๋Š”์ง€ ๋‚˜๋น ์กŒ๋Š”์ง€ ๋ชจ๋ฅด๋ฉด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ํ‰๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์€ ํ•˜๋„ค์Šค ๋ณ€๊ฒฝ์˜ ํšจ๊ณผ๋ฅผ ์ •๋Ÿ‰์ ์œผ๋กœ ์ธก์ •ํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. SWE-bench, HumanEval ๊ฐ™์€ ๋ฒค์น˜๋งˆํฌ๋„ ๊ฒฐ๊ตญ ํ‰๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ผ์ข…์ด๋‹ค.

๐Ÿง 

์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ๊ด€๋ฆฌ โ€” ์œ ํ•œํ•œ ๊ธฐ์–ต์˜ ์ „๋žต

100๋งŒ ํ† ํฐ์ด์–ด๋„ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ด ์ค‘์š”ํ•˜๋‹ค

์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋Š” ๋ชจ๋ธ์˜ "์ž‘์—… ๊ธฐ์–ต"์ด๋‹ค. ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ๋„ ๋ฌดํ•œํ•˜์ง€ ์•Š๊ณ , ๋„ฃ๋Š” ์ˆœ์„œ์™€ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ๋‹ฌ๋ผ์ง„๋‹ค. ํ•˜๋„ค์Šค์˜ ํ•ต์‹ฌ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ด ์ œํ•œ๋œ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๐ŸŽผ

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํŒจํ„ด โ€” ๋ชจ๋ธ ํ˜ธ์ถœ์„ ์กฐํ•ฉํ•˜๋Š” ๋ฒ•

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ์•ˆ ๋˜๋ฉด, ์—ฌ๋Ÿฌ ๋ฒˆ์„ ์–ด๋–ป๊ฒŒ ์—ฎ๋Š”๊ฐ€

๋ณต์žกํ•œ ์ž‘์—…์€ ๋ชจ๋ธ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋กœ ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์—ฌ๋Ÿฌ ๋ชจ๋ธ ํ˜ธ์ถœ์„ ์–ด๋–ค ์ˆœ์„œ๋กœ, ์–ด๋–ค ์กฐ๊ฑด์—์„œ ์‹คํ–‰ํ•˜๋А๋ƒ๊ฐ€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์ด๋‹ค. Agentic AI์˜ ์—์ด์ „ํŠธ ๋ฃจํ”„๋„, RAG๋„, ์ฝ”๋“œ ์ƒ์„ฑ ํŒŒ์ดํ”„๋ผ์ธ๋„ ์ „๋ถ€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํŒจํ„ด์ด๋‹ค.

๐Ÿญ

gstack ํ•ด๋ถ€ โ€” ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง ์‹ค์ „ ์‚ฌ๋ก€

Garry Tan์ด Claude Code๋กœ 60์ผ๊ฐ„ 60๋งŒ ์ค„์„ ์น  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ตฌ์กฐ

gstack์€ Y Combinator CEO Garry Tan์ด ๊ณต๊ฐœํ•œ Claude Code ์Šคํ‚ฌ ํŒฉ์ด๋‹ค. 23๊ฐœ slash command๋กœ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์„ ์—ญํ• ๋ณ„ ์ „๋ฌธ๊ฐ€ ํŒ€์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. ๊ฐ™์€ Claude์ธ๋ฐ ํ•˜๋„ค์Šค๋ฅผ ๋ฐ”๊ฟจ์„ ๋ฟ์ด๋‹ค. ์ด๊ฒŒ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง์˜ ์œ„๋ ฅ์ด๋‹ค.

๐Ÿ”€ Git

๐Ÿ—‚๏ธ

Git์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

Blob, Tree, Commit โ€” Git์˜ 3๊ฐ€์ง€ ๊ฐ์ฒด

Git์€ content-addressable ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‹ค. ๋ชจ๋“  ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ, ์ปค๋ฐ‹์€ SHA-1 ํ•ด์‹œ๋กœ ์‹๋ณ„๋˜๋Š” ๊ฐ์ฒด๋กœ ์ €์žฅ๋œ๋‹ค. Blob(ํŒŒ์ผ), Tree(๋””๋ ‰ํ† ๋ฆฌ), Commit(์Šค๋ƒ…์ƒท) ์„ธ ๊ฐ€์ง€ ๊ฐ์ฒด๋งŒ ์ดํ•ดํ•˜๋ฉด Git์˜ ๋Œ€๋ถ€๋ถ„์ด ์„ค๋ช…๋œ๋‹ค.

๐Ÿ”€

rebase vs merge, ์–ธ์ œ ๋ฌด์—‡์„ ์“ฐ๋‚˜

ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด๊ณผ ์„ ํ˜•ํ™”์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

merge๋Š” ๋‘ ๋ธŒ๋žœ์น˜๋ฅผ merge commit์œผ๋กœ ํ•ฉ์นœ๋‹ค. rebase๋Š” ์ปค๋ฐ‹์„ ๋‹ค๋ฅธ ๋ฒ ์ด์Šค ์œ„๋กœ ๋‹ค์‹œ ์Œ“๋Š”๋‹ค. merge๋Š” ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ๊ธฐ๊ณ , rebase๋Š” ์„ ํ˜•์œผ๋กœ ์ •๋ฆฌํ•œ๋‹ค. ๊ณต์œ  ๋ธŒ๋žœ์น˜์—๋Š” merge, ๊ฐœ์ธ ๋ธŒ๋žœ์น˜์—๋Š” rebase๊ฐ€ ๊ธฐ๋ณธ ์›์น™์ด๋‹ค.

โ†ฉ๏ธ

reset vs revert, ๋ญ˜ ์–ธ์ œ ์“ฐ๋‚˜

ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ณ ์น˜๋Š” ๋ฒ• vs ๋˜๋Œ๋ฆฌ๋Š” ์ปค๋ฐ‹์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฒ•

reset์€ ๋ธŒ๋žœ์น˜ ํฌ์ธํ„ฐ๋ฅผ ๊ณผ๊ฑฐ ์ปค๋ฐ‹์œผ๋กœ ์˜ฎ๊ธด๋‹ค. revert๋Š” ๋ฐ˜๋Œ€ ๋ณ€๊ฒฝ์„ ๋‹ด์€ ์ƒˆ ์ปค๋ฐ‹์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ํ˜ผ์ž ์ž‘์—… ์ค‘์ด๋ฉด reset, ์ด๋ฏธ pushํ•œ ์ปค๋ฐ‹์ด๋ฉด revert๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค.

๐Ÿ“ฆ

stash ์ œ๋Œ€๋กœ ์“ฐ๊ธฐ

์ž‘์—… ์ค‘ ๋ธŒ๋žœ์น˜ ์ „ํ™˜์ด ํ•„์š”ํ•  ๋•Œ

stash๋Š” ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์„ ์ž„์‹œ ์ €์žฅ์†Œ์— ๋ฐ€์–ด๋„ฃ๊ณ  working tree๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋ธŒ๋žœ์น˜ ์ „ํ™˜, cherry-pick, ๊ธด๊ธ‰ bugfix ๋Œ€์‘์— ์“ด๋‹ค. checkout -- . / reset --hard ๋Œ€์‹  stash๋ฅผ ์“ฐ๋ฉด ์‹ค์ˆ˜๋กœ ๋ณ€๊ฒฝ์„ ๋‚ ๋ฆด ์ผ์ด ์—†๋‹ค.

๐ŸŒฒ

worktree๋กœ ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜๋ฅผ ๋™์‹œ์— ์ฒดํฌ์•„์›ƒ

clone ์—ฌ๋Ÿฌ ๋ฒˆ ์•ˆ ํ•ด๋„ ๋œ๋‹ค

git worktree๋Š” ๊ฐ™์€ ์ €์žฅ์†Œ๋ฅผ ์—ฌ๋Ÿฌ ๋””๋ ‰ํ† ๋ฆฌ์— ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ฒดํฌ์•„์›ƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. clone์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , .git ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๊ณต์œ ๋˜๋ฏ€๋กœ ์šฉ๋Ÿ‰๋„ ์ ˆ์•ฝ๋œ๋‹ค. ๊ธด ๋นŒ๋“œ๊ฐ€ ๋„๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜ ์ž‘์—…์„ ๋ณ‘ํ–‰ํ•  ๋•Œ ์ง„๊ฐ€๊ฐ€ ๋‚˜์˜จ๋‹ค.