필사 모드: 모던 Lua & Luau 2026 — Lua 5.4 / LuaJIT / Roblox Luau / Neovim Lua / OpenResty / Defold / Love2D 심층 가이드
한국어프롤로그 — Lua는 죽었다고? 어디서 그런 소리를
2026년 5월, 누군가 "Lua는 끝났다"고 말하면 그 사람은 최근 5년간 게임 업계, 에디터 생태계, 그리고 고성능 웹 서버 영역을 한 번도 보지 않은 사람이다.
수치를 보자.
- **Roblox**: 월간 활성 사용자 4억 명 이상. 게임 로직은 전부 **Luau**(Roblox가 fork한 타입 Lua). 매일 수십만 줄의 Luau 코드가 새로 쓰인다.
- **Neovim**: 2024년 0.10, 2025년 0.11, 2026년 0.12 — 그동안 **VimScript에서 Lua로의 마이그레이션이 완전히 끝났다.** LazyVim·AstroNvim·NvChad·LunarVim 4대 디스트로가 GitHub 별 합산 10만 개를 넘겼다.
- **OpenResty / NGINX Lua**: Cloudflare가 여전히 자기네 엣지에서 LuaJIT을 돌린다. 한 노드가 초당 수백만 요청을 처리하는 워크로드의 대부분이 Lua로 짜여 있다.
- **World of Warcraft 애드온**: 20년이 지났는데 여전히 Lua. 2026년 패치마다 인기 애드온 수백 개가 업데이트된다.
- **Defold**: King(Candy Crush 만든 곳)이 만든 Lua 게임 엔진. 모바일 시장에서 Unity·Godot과 함께 3대 선택지.
그리고 이 모든 게 **Lua라는 한 줄짜리 언어 위에서 돌아간다.** 본체 인터프리터는 25,000줄도 안 되고, ANSI C 89로 짜여 있어서 거의 모든 곳에 임베드된다.
이 글은 2026년 Lua/Luau 생태계를 한 호흡으로 정리한다. Lua 5.4의 새 기능부터 LuaJIT의 성능, Roblox Luau의 타입 시스템, LazyVim의 설정 폭발, OpenResty의 NGINX 임베디드, Defold·Love2D 인디 엔진, 그리고 Hammerspoon·Wireshark 같은 데스크톱 임베디드까지.
1장 · 2026년 Lua 생태계 지도 — 4개의 큰 축
먼저 그림 한 장.
[ Lua 코어 본체 ]
|
+------------------------+------------------------+
| | | |
Lua 5.4 LuaJIT 2.1 Luau (Roblox) 변형 언어
(PUC-Rio) (Mike Pall) (typed fork) (4가지 + α)
정수 타입 Lua 5.1 ABI gradual types MoonScript
to-be-closed 인터프리터 최강 native codegen Yuescript
bitwise FFI Teal (typed)
integer 가장 빠른 동적 parallel Luau Pluto
언어 중 하나 Fennel (Lisp)
| | | |
+-------+--------+--------+-------+-------+-------+
| | |
[ Neovim 0.12 ] [ OpenResty ] [ 게임/엔진 ]
LazyVim NGINX + Lua Roblox
AstroNvim Kong API GW WoW 애드온
NvChad Apache APISIX Defold (King)
LunarVim Tarantool DB Love2D
Solar2D
Garry's Mod
Tabletop Sim
Source 2 (CS2)
|
[ 데스크톱 임베디드 ]
Hammerspoon (Mac)
Adobe Lightroom 플러그인
Wireshark dissector
핵심 정리:
- **Lua 5.4** — PUC-Rio(브라질 리우데자네이루 가톨릭대) 본가에서 나오는 최신 안정. **여전히 5.5 commitment는 없다.** Roberto Ierusalimschy가 페이스를 정한다.
- **LuaJIT 2.1** — Mike Pall이 만든 LuaJIT. **여전히 5.3+의 통합 지원 후계자는 없다.** Lua 5.1 ABI 호환에 고정. 그래도 동적 언어 중 가장 빠른 실행기 중 하나.
- **Luau** — Roblox가 fork한 typed Lua. 점진적 타이핑, native code generation, parallel Luau(멀티스레드). 2025년 11월 오픈소스 로드맵 발표.
- **변형 언어** — MoonScript(CoffeeScript-like), Yuescript(MoonScript fork), Teal(typed Lua), Pluto(Lua 5.4 확장 + 모던 기능), Fennel(Lisp on Lua).
2장 · Lua 5.4 — 최신 안정, 그러나 보수적
PUC-Rio Lua 5.4는 2020년 6월에 1차 릴리스, 2024년에 5.4.7까지 패치되어 있다. 2025–2026년에도 새 메이저 버전(5.5)은 아직 없다. Roberto Ierusalimschy는 인터뷰마다 "**언어는 안정성이 가장 중요하다**"고 말한다.
5.4가 가져온 변화는 다음과 같다.
정수 vs 부동소수 — 별도 타입
5.3부터 도입된 변화지만 5.4에서 더 다듬어졌다. 이전엔 모든 숫자가 double이었다.
-- Lua 5.4
print(math.type(1)) -- integer
print(math.type(1.0)) -- float
print(math.type(1/2)) -- float (나눗셈은 항상 float)
print(math.type(1//2)) -- integer (floor 나눗셈)
-- 비트 연산은 정수에만
print(0xFF & 0x0F) -- 15
print(1 << 4) -- 16
LuaJIT은 여전히 Lua 5.1 ABI 기반이라 이 정수 타입을 표준으로 지원하지 않는다. 이게 두 진영의 가장 큰 분기점.
to-be-closed 변수 — Lua의 RAII
C++의 RAII나 Python의 with와 비슷한 자원 관리 기능.
-- Lua 5.4
do
local file <close> = io.open("data.txt", "r")
-- 블록을 빠져나가는 순간 __close 메타메서드가 자동 호출
-- 예외가 던져져도 호출됨 (try/finally 없이 안전)
for line in file:lines() do
print(line)
end
end
-- 여기서 file은 이미 닫혔다
`<close>` 어노테이션이 붙은 변수는 스코프를 벗어날 때 메타테이블의 `__close`가 호출된다. 자원 누수 패턴을 잡는 데 매우 유용.
통합 GC — generational
5.4의 GC는 **세대별(generational) 모드**를 기본 선택지로 추가했다. 이전 incremental GC와 토글 가능.
-- generational GC로 전환
collectgarbage("generational")
-- 짧은 수명 객체가 많은 워크로드(파싱·렌더 루프)에서 30–60% 빨라짐
새 문법 — `goto` 라벨, `<const>`, `<close>`
local PI <const> = 3.14159 -- 재할당 시도하면 컴파일 에러
for i = 1, 10 do
for j = 1, 10 do
if i * j > 50 then goto done end
end
end
::done::
print("나왔다")
`<const>`는 작지만 큰 안전성 향상이다. 의도치 않은 재할당을 컴파일 시점에 잡는다.
3장 · LuaJIT — Mike Pall, 성능의 왕, 후계자는 없다
LuaJIT 이야기를 빼고 Lua를 말할 수 없다. Mike Pall이 거의 혼자 만들고 유지한 이 프로젝트는, **2026년에도 동적 언어 실행기의 황금 표준** 중 하나다.
왜 빠른가
- **Trace compiler**: 핫 루프를 감지해서 머신 코드로 컴파일한다. PyPy와 같은 아이디어, 더 단단한 구현.
- **NaN-tagging**: 모든 Lua 값(숫자·문자열·테이블·함수)을 64-bit double 안에 packed. 박싱 없이 직접 메모리 접근.
- **FFI(Foreign Function Interface)**: C 함수와 구조체를 Lua에서 직접 부른다. C extension 없이.
-- LuaJIT FFI 예시
local ffi = require("ffi")
ffi.cdef[[
typedef struct { double x, y, z; } Vec3;
double sqrt(double);
]]
local v = ffi.new("Vec3", 1, 2, 3)
local len = ffi.C.sqrt(v.x*v.x + v.y*v.y + v.z*v.z)
print(len) -- 3.7416...
이 코드는 C에서 짠 것과 거의 같은 속도로 돈다. 게임 엔진·미들웨어가 LuaJIT을 사랑하는 이유.
5.3+ 통합 지원이 없는 진실
LuaJIT은 **Lua 5.1 ABI에 고정**되어 있다. Mike Pall이 2020년경 LuaJIT 2.1 beta 작업을 일시 중단했고, 2.1은 여전히 "beta"라는 꼬리표를 단 채 production에서 쓰인다. 정수 타입·to-be-closed·64-bit 비트 연산은 부분 지원이거나 미지원.
이 때문에 2026년 현재 Lua 생태계는 **두 갈래**다.
- **LuaJIT 진영**: OpenResty, World of Warcraft(Wrath 이후), Defold, Love2D(0.11+에서 LuaJIT 기본), Wireshark
- **순수 Lua 5.4 진영**: 임베디드 환경(메모리 제약), Roberto Ierusalimschy의 PUC-Rio 본가, 일부 신규 프로젝트
LuaJIT의 미래
- **OpenResty의 fork**: openresty/luajit2 — LuaJIT 2.1 fork에 PR을 적극 수용. 사실상 production 표준.
- **Cloudflare가 유지하는 커밋**: 일부 핵심 패치는 Cloudflare 엔지니어가 보낸다.
- **Mike Pall 본인은?** 2025년에 LuaJIT의 새 maintainer를 모집한다는 글을 다시 올렸다. 후계 체제 정착이 2026년의 과제.
4장 · Luau — Roblox의 typed Lua fork
Luau(loo-OW)는 Roblox가 2019년경 fork한 Lua 5.1 기반 언어다. 2021년 오픈소스로 공개됐고, 2026년 현재 **Lua 생태계에서 가장 빠르게 진화하는 변종**이다.
무엇이 다른가
-- Luau 타입 시스템
local function add(a: number, b: number): number
return a + b
end
type Vec3 = { x: number, y: number, z: number }
local function length(v: Vec3): number
return math.sqrt(v.x^2 + v.y^2 + v.z^2)
end
-- strict / nonstrict / nocheck 모드 선택 가능
--!strict
- **점진적 타이핑(gradual typing)** — 타입을 안 써도 동작. 점점 추가하면 점점 안전해진다. TypeScript와 같은 철학.
- **strict / nonstrict** — 파일 첫 줄에 `--!strict`를 쓰면 풀 타입 체크.
- **native code generation** — 2023년 도입된 NCG는 핫 함수를 머신 코드로 컴파일한다. LuaJIT의 trace compiler와 다른 메서드별 접근.
- **parallel Luau** — Roblox가 도입한 액터 모델 멀티스레드. 메인 스레드 외 워커 스레드에서 Luau 실행.
- **Lua 5.1 호환 기반** — 따라서 LuaJIT 코드를 옮기기 비교적 쉽다. 단, Roblox API에 묶여 있어서 통째로는 못 옮긴다.
Roblox 외부에서 쓸 수 있나
2025년 말부터 Luau는 standalone 실행기를 점점 더 진지하게 만들고 있다. `luau` 명령줄 도구가 npm·brew에 올라와 있고, Lune(Luau 런타임) 같은 프로젝트가 디스코드 봇·CLI 도구를 Luau로 짜는 길을 열었다.
Luau standalone 설치 (macOS)
brew install luau
실행
echo 'print(string.format("hello %s", "luau"))' | luau -
2026년 로드맵
Roblox는 분기마다 Luau RFC(공식 제안)를 공개한다. 2026년 1분기 핵심:
- **type function** — 타입 수준 함수. TypeScript의 conditional type과 비슷한 메타프로그래밍.
- **buffer 표준 API 확장** — 바이너리 데이터 처리.
- **에러 처리 개선** — `try`/`catch` 비슷한 구조 RFC가 진행 중.
5장 · Roblox 개발 — 거대한 Luau 시장
Lua/Luau를 무시할 수 없는 이유의 절반은 Roblox다.
- **MAU 4억+**, 일평균 사용 시간 2.5시간.
- 게임 안의 **모든 로직이 Luau**. 클라이언트도 서버도. Studio(에디터)도 Luau로 확장한다.
- **Roblox Developer Forum**: 게시글 수백만 개. Stack Overflow 다음으로 큰 Luau Q&A 풀.
어떻게 시작하나
1. Roblox Studio 다운로드 (Windows / Mac)
2. New Place → Baseplate 템플릿
3. Explorer 패널에서 ServerScriptService 우클릭 → Insert Object → Script
4. Luau 작성
-- 예시: 클릭하면 색이 바뀌는 부분
local part = workspace.Part
part.Touched:Connect(function(hit)
local character = hit.Parent
if character:FindFirstChild("Humanoid") then
part.Color = Color3.fromRGB(
math.random(0, 255),
math.random(0, 255),
math.random(0, 255)
)
end
end)
Roblox 개발자 경제
- **Robux 환전** — 일정 임계치 이상이면 USD로 환전. 인기 게임은 월 수십만 달러 수익.
- **2025년 신규** — UGC(User Generated Content) 마켓플레이스 확대. 의상·악세서리도 Luau 기반 스크립트로 만든다.
- **DataStore / OpenCloud API** — Luau만으론 부족한 게임은 외부 백엔드(Python/Go)와 OpenCloud API로 통신.
한국·일본의 Roblox 개발
- 한국: 2024–2026년에 Roblox 한국 진출 가속. 청소년 대상 코딩 교육이 Scratch에서 Roblox Studio로 옮겨가는 흐름.
- 일본: Roblox JP가 2025년 본격 출범. Cygames·Bandai Namco 출신 인디 개발자들이 Luau로 데뷔작을 만드는 사례 다수.
6장 · Neovim Lua 설정 폭발 — LazyVim / AstroNvim / NvChad / LunarVim
Vim → Neovim의 가장 큰 변화는 **VimScript에서 Lua로의 마이그레이션**이다. 0.5(2021)에서 Lua API가 안정화됐고, 0.10·0.11·0.12로 가면서 VimScript는 사실상 사양길에 들어섰다.
2026년의 Neovim 설정 생태계는 4개의 distribution이 90% 이상을 가져간다.
LazyVim — Folke의 단일 인기 distro
[folke/lazy.nvim](https://github.com/folke/lazy.nvim)이 만든 lazy-loading 플러그인 매니저 위에 구축된 distro. 2024년 등장 직후 사실상 표준이 됐다.
-- ~/.config/nvim/lua/plugins/example.lua
return {
{
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
config = function()
require("nvim-treesitter.configs").setup({
ensure_installed = { "lua", "python", "typescript", "rust" },
highlight = { enable = true },
})
end,
},
{
"neovim/nvim-lspconfig",
dependencies = { "williamboman/mason.nvim" },
config = function()
require("lspconfig").lua_ls.setup({})
end,
},
}
**장점**
- 빠른 시작. `:Lazy` 명령으로 GUI 플러그인 매니저.
- 모듈식. `lua/plugins/`에 파일 던지면 자동 로드.
- Folke 본인의 일관된 코드 스타일.
**단점**
- 추상화 레이어가 더 두꺼움. raw Neovim Lua를 배우려는 사람에겐 약간 우회.
AstroNvim — 화려한 UI
대시보드·상태표시줄·아이콘이 처음부터 잘 꾸며져 있다. "**즉시 쓸 수 있는 IDE 같은 Neovim**"을 추구.
-- AstroNvim v4 구조
return {
colorscheme = "catppuccin",
features = {
large_buf = { size = 1024 * 256, lines = 10000 },
autopairs = true,
cmp = true,
diagnostics_mode = 3,
},
diagnostics = { virtual_text = true, underline = true },
}
**누가 좋아하나** — Vim 처음 쓰는 개발자, IDE 출신.
NvChad — 가벼움 + 깔끔한 UI
인도 개발자 siduck이 만든 distro. **시작 속도 30ms 이하**를 목표. 한국·일본에서도 사용자 많음.
-- NvChad v2.5+
require("nvchad.configs.lspconfig").defaults()
local servers = { "html", "cssls", "tsserver", "lua_ls", "rust_analyzer" }
vim.lsp.enable(servers)
LunarVim — 종합 IDE 지향
전통적인 "**Vim도 진짜 IDE처럼 쓰자**" distro. 2022–2023년에 가장 인기였고 지금도 안정적 사용자층.
어떤 distro를 골라야 하나
| 상황 | 추천 |
| --------------------------------- | --------------- |
| 처음 Neovim 입문 | LazyVim 또는 AstroNvim |
| 빠른 부팅·가벼운 UI | NvChad |
| 일정한 학습 곡선·풀 IDE 경험 | LunarVim |
| distro 안 쓰고 from-scratch | kickstart.nvim → 직접 |
**from-scratch의 부활** — 2025–2026년에 nvim-lspconfig·blink.cmp·snacks.nvim 같은 모듈식 플러그인이 성숙하면서, "**distro 없이 직접 짜는 게 더 깔끔하다**"는 흐름도 다시 강해지고 있다. kickstart.nvim이 출발점.
7장 · OpenResty (NGINX + Lua) — 고성능 웹의 숨은 주역
NGINX 코어에 LuaJIT을 임베드해서 **요청 처리를 Lua로 짜는** 플랫폼. 2011년 Yichun Zhang(agentzh)이 만들었고, 지금은 OpenResty Inc.가 유지.
왜 빠른가
nginx.conf
location /api/users {
content_by_lua_block {
local user_id = ngx.var.arg_id
local redis = require "resty.redis"
local red = redis:new()
red:connect("127.0.0.1", 6379)
local user_json = red:get("user:" .. user_id)
ngx.header.content_type = "application/json"
ngx.say(user_json)
}
}
- 요청 핸들러가 LuaJIT 머신 코드로 컴파일됨.
- NGINX 이벤트 루프 안에서 **non-blocking I/O**로 Redis·Postgres·MySQL 호출.
- 같은 하드웨어에서 Node.js 대비 2–5배 RPS.
누가 쓰나 (2026년 현재)
- **Cloudflare** — 엣지 곳곳에서 LuaJIT 기반 모듈. WAF·routing·rate limit 일부.
- **Kong** — API Gateway. OpenResty 기반. 2025년 Kong 4.0에서 일부 모듈을 Rust로 교체했지만 코어는 여전히 Lua.
- **Apache APISIX** — Kong과 경쟁하는 OSS API Gateway. 중국 Zhejiang 대학에서 시작, 현재 Apache 프로젝트.
- **WeChat / Tencent** — 내부 게이트웨이 일부.
모듈 생태계
`opm`(OpenResty Package Manager) 또는 LuaRocks로 설치.
자주 쓰는 라이브러리
opm install openresty/lua-resty-redis
opm install openresty/lua-resty-mysql
opm install openresty/lua-resty-http
opm install bungle/lua-resty-prometheus
한국에서의 OpenResty
- KT·SK텔레콤 사내 게이트웨이 일부.
- 게임 회사들(특히 모바일 게임)이 매치메이킹·인증 서버에 도입한 사례 다수. 동시접속 처리에 강점.
8장 · Tarantool — 인메모리 DB + Lua 애플리케이션 서버
러시아 Mail.Ru에서 시작해 지금은 독립 프로젝트가 된 Tarantool은 **인메모리 DB + Lua 앱 서버**라는 특이한 조합이다.
-- Tarantool 안에서 실행
box.cfg{ listen = 3301 }
box.schema.space.create('users', { if_not_exists = true })
box.space.users:format({
{ name = 'id', type = 'unsigned' },
{ name = 'name', type = 'string' },
{ name = 'email', type = 'string' },
})
box.space.users:create_index('primary', { parts = { 'id' } })
-- 비즈니스 로직도 같은 프로세스 안에서
function add_user(id, name, email)
return box.space.users:insert{ id, name, email }
end
function find_user(id)
return box.space.users:get(id)
end
- **인메모리 + WAL** — Redis보다 강한 일관성 보증. SQL도 지원.
- **Lua 앱 서버** — DB와 같은 프로세스 안에서 비즈니스 로직 실행. 네트워크 hop 한 단계 절약.
- **샤딩** — vshard 모듈로 자동 샤딩.
쓰는 곳: 러시아 대형 인터넷 기업, 동유럽 게임사, 그리고 점점 더 많은 fintech.
9장 · 게임 — WoW 애드온부터 Source 2까지
World of Warcraft 애드온
WoW는 2004년 출시 직후부터 **Lua 기반 애드온 시스템**을 제공했다. 22년이 지난 지금도 그대로.
-- 가장 간단한 WoW 애드온 (MyAddon.toc + MyAddon.lua)
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function(self, event, ...)
print("|cFFFF0000Hello|r from MyAddon!")
end)
- 2024–2026년에도 인기 애드온 (ElvUI·WeakAuras·Details!·Plater)이 매 패치마다 업데이트.
- WeakAuras는 **사용자 Lua 스니펫**을 받아 실행하는 메타 도구로 진화. 사실상 WoW용 Lua IDE.
Tabletop Simulator
2014년 출시 후 여전히 인기. **모든 모드(게임 룰)가 Lua**. Steam Workshop에 수만 개 모드.
Garry's Mod / Source 2 (CS2)
Garry's Mod의 모든 모드는 Lua. Source 2(2023+ CS2 등) 엔진도 **Lua 스크립팅을 일부 지원** — 맵 메이커·서버 플러그인이 Lua로 작성된다.
Defold — King이 만든 Lua 엔진
King(Candy Crush 만든 곳)이 인수해 오픈소스로 공개한 2D/3D 엔진. **로직은 Lua, 엔진 본체는 C++**.
-- script.script
function init(self)
self.speed = 100
end
function update(self, dt)
local pos = go.get_position()
pos.x = pos.x + self.speed * dt
go.set_position(pos)
end
function on_input(self, action_id, action)
if action_id == hash("touch") and action.pressed then
self.speed = self.speed * -1
end
end
- **단일 실행 파일 빌드** — Defold 에디터에서 iOS·Android·HTML5·Switch까지 한 번에 빌드.
- **작은 게임 크기** — 빈 프로젝트가 1MB대. 모바일에서 인기.
- 2026년 현재 King이 메인 스폰서, 커뮤니티가 활발히 기여.
Solar2D (구 Corona SDK)
Corona Labs가 사라진 후 커뮤니티가 인수해 Solar2D로 리브랜드. 모바일 2D 게임 엔진. **Lua가 메인 언어**. 한국·일본에서 학원·인디 개발자들이 여전히 사용.
Love2D — 작은 2D 게임의 표준
100KB대의 작은 SDK. **`love.load` / `love.update` / `love.draw` 3개 콜백**만 있으면 게임이 돈다.
function love.load()
player = { x = 100, y = 100, speed = 200 }
end
function love.update(dt)
if love.keyboard.isDown("right") then
player.x = player.x + player.speed * dt
end
if love.keyboard.isDown("left") then
player.x = player.x - player.speed * dt
end
end
function love.draw()
love.graphics.rectangle("fill", player.x, player.y, 50, 50)
end
- 게임잼(Ludum Dare·GMTK Jam)에서 가장 자주 보이는 엔진 중 하나.
- LuaJIT 기본 탑재로 성능도 충분.
10장 · 변형 언어 — MoonScript / Yuescript / Teal / Pluto / Fennel
Lua는 작고 단순하지만, "이게 좀 부족한데?"라고 느끼는 사람들이 만든 변형 언어들이 있다.
MoonScript — CoffeeScript의 Lua판
들여쓰기 기반 문법, 클래스, 리스트 컴프리헨션.
-- MoonScript
class Animal
new: (@name) =>
speak: => print "#{@name} makes a sound"
class Dog extends Animal
speak: => print "#{@name} barks"
d = Dog "Rex"
d\speak!
2010년대 초중반에 인기, 지금은 유지보수 모드. 그러나 **OpenResty 진영의 일부 라이브러리가 여전히 MoonScript로 작성**되어 있다.
Yuescript — MoonScript의 활발한 fork
대만 개발자 Li Jin이 만든 MoonScript fork. Lua 5.4 호환, **활발히 개발 중**.
Teal — typed Lua, 가장 진지한 선도자
-- Teal (.tl 파일)
local record Point
x: number
y: number
end
local function distance(a: Point, b: Point): number
return math.sqrt((a.x - b.x)^2 + (a.y - b.y)^2)
end
- Hisham Muhammad(LuaRocks 메인테이너)가 만들었다.
- Lua 5.3·5.4 호환 코드로 트랜스파일.
- Luau의 자매 프로젝트 같은 느낌 — Luau는 Roblox 묶음, Teal은 standalone.
Pluto — Lua 5.4 + 모던 기능
`continue`, `switch`, `??` (null-coalescing), 클래스, async/await 등을 Lua 5.4에 더한 superset.
-- Pluto
class Player
function __construct(self, name)
self.name = name
self.hp = 100
end
function takeDamage(self, amount)
self.hp -= amount -- 복합 대입
if self.hp <= 0 then
print(self.name .. " died")
end
end
end
local p = new Player("Alice")
p:takeDamage(50)
local config = json.decode(http.get("https://example.com/cfg")) ?? {}
활발히 개발 중이며 게임 모딩 커뮤니티(특히 stand 등)에서 인기.
Fennel — Lua VM 위의 Lisp
Clojure스러운 S-expression 문법, Lua VM에서 실행.
;; Fennel
(fn greet [name]
(print (.. "Hello, " name "!")))
(greet "World")
(local people [{:name "Alice" :age 30}
{:name "Bob" :age 25}])
(each [_ person (ipairs people)]
(print (.. person.name " is " person.age " years old")))
- LISP의 macro와 함수형 스타일을 Lua 임베디드 환경에서 쓰고 싶을 때.
- Love2D·TIC-80(팬타지 콘솔)에서 인기.
- Neovim에서도 Fennel로 설정 짜는 사람들이 있다(antifennel·hotpot.nvim).
11장 · Hammerspoon (Mac) / Wireshark Lua dissector
Hammerspoon — macOS 자동화
-- ~/.hammerspoon/init.lua
-- Cmd+Alt+R로 윈도우 정렬
hs.hotkey.bind({"cmd", "alt"}, "R", function()
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen():frame()
f.x = screen.x + screen.w / 2
f.y = screen.y
f.w = screen.w / 2
f.h = screen.h
win:setFrame(f)
end)
-- 클립보드 히스토리
local clipboardHistory = {}
hs.pasteboard.watcher.new(function()
local item = hs.pasteboard.readString()
if item then table.insert(clipboardHistory, 1, item) end
end):start()
- macOS 시스템 API(`hs.window`, `hs.hotkey`, `hs.audiodevice`...)를 Lua로 직접 부른다.
- Karabiner·BetterTouchTool과 함께 Mac 파워유저의 3대 도구.
Wireshark Lua dissector
Wireshark는 네트워크 패킷을 분석할 때 **사용자 정의 프로토콜을 Lua로 정의**할 수 있다.
-- Wireshark plugins/my_proto.lua
local my_proto = Proto("MyProto", "My Custom Protocol")
local fields = my_proto.fields
fields.id = ProtoField.uint16("myproto.id", "ID", base.DEC)
fields.payload = ProtoField.bytes("myproto.payload", "Payload")
function my_proto.dissector(buffer, pinfo, tree)
pinfo.cols.protocol = my_proto.name
local subtree = tree:add(my_proto, buffer())
subtree:add(fields.id, buffer(0, 2))
subtree:add(fields.payload, buffer(2))
end
DissectorTable.get("tcp.port"):add(8080, my_proto)
게임 회사나 IoT 회사에서 자체 프로토콜 디버깅에 큰 도움. C dissector 짤 일을 Lua 100줄로 끝낸다.
12장 · Adobe Lightroom Lua 플러그인
거의 안 알려진 사실: **Adobe Lightroom의 플러그인 시스템은 Lua 기반**이다. 2007년 도입 이후 지금까지.
-- Lightroom SDK 플러그인 예시 (Info.lua + Main.lua)
return {
LrSdkVersion = 12.0,
LrToolkitIdentifier = "com.example.exporter",
LrPluginName = "My Exporter",
LrExportServiceProvider = {
title = "My Cloud",
file = "ExportServiceProvider.lua",
},
}
- Photo Mechanic·Capture One로 옮겨가도, 사진가 워크플로 자동화는 Lightroom + Lua 플러그인이 압도적으로 많다.
- **LR/Mogrify·Photo Mechanic Bridge·Photolemur 통합** 같은 유명 플러그인이 Lua로 작성.
13장 · 한국 / 일본의 Lua
한국
- **Smilegate** — 크로스파이어·로스트아크 같은 자체 엔진 게임에서 일부 모딩 API에 Lua 활용. 사내 도구·QA 자동화에도 Lua.
- **NCSoft** — 리니지 W·블레이드앤소울 등에서 일부 게임 로직 스크립트에 Lua. 사내 엔진 도구.
- **Krafton·Nexon** — 게임 회사 다수가 클라이언트 측 모드·서버 측 hot-reload에 Lua를 부분적으로 도입.
- **Naver / Kakao** — 일부 서비스의 게이트웨이·CDN 레이어에 OpenResty 도입 사례. 대규모 트래픽 처리에 적합.
일본
- **Square Enix** — Final Fantasy 시리즈 일부, 사내 도구. 도쿄 본사에서 Lua 사용 직군 모집 공고가 분기마다 올라온다.
- **Bandai Namco** — 그래픽스 미들웨어·게임 로직 스크립트에 Lua. 일본 게임 엔진(Yebis 등)이 Lua 플러그인 지원.
- **Cygames** — Granblue Fantasy·Uma Musume 등에서 사내 도구에 Lua 사용. 모바일 게임의 hot-fix 채널에 Lua를 쓰는 패턴.
- **사이게 외 인디** — 도쿄·교토 인디씬에서 Defold·Love2D로 게임 만드는 사람들 다수. Tokyo Indies 등 밋업에서 매번 발표 나옴.
14장 · 누가 Lua/Luau를 배워야 하나
Roblox 게임 개발자
명백히 Luau가 필수. Roblox 외부에서도 standalone Luau 런타임(Lune)이 자라고 있어서 점점 더 폭이 넓어진다.
Neovim 사용자
설정만 하더라도 Lua를 최소한 읽을 수 있어야 한다. **VimScript에서 Lua로의 마이그레이션은 사실상 끝났다.** init.lua, lazy.nvim 설정, 플러그인 작성 모두 Lua.
임베디드 개발자
작은 메모리 풋프린트의 인터프리터 = Lua. ESP32에 Lua를 올려 IoT를 짜는 NodeMCU 프로젝트가 여전히 살아 있고, 게임 엔진·미들웨어 임베드에도 Lua가 표준.
NGINX·웹 인프라 엔지니어
OpenResty·Kong·APISIX를 만지는 사람은 Lua가 거의 필수. Cloudflare Workers나 Envoy(Lua extension)에서도 쓸 일이 있다.
게임 모더
WoW·Tabletop Simulator·Garry's Mod·CS2(맵 메이커)에서 모드·플러그인·확장을 만들고 싶다면 Lua가 진입점이다.
macOS 파워유저
Hammerspoon으로 자동화 짜고 싶으면 Lua 100줄 정도는 알아야 한다. AppleScript의 답답함에서 벗어나는 길.
사진가·Lightroom 사용자
자기 워크플로에 맞는 익스포터·파일 명명 자동화를 만들고 싶다면 Lua + Lightroom SDK가 가장 효율적이다.
15장 · 학습 경로 — 0에서 모던 Lua까지
0주차 — 본체 1시간
Programming in Lua (Roberto Ierusalimschy) 4판 1–5장. 기초 문법·테이블·함수·메타테이블 개념만.
1주차 — 실전 환경 하나 고르기
- Roblox: Roblox Studio 설치, Code Academy의 Roblox 코스.
- Neovim: kickstart.nvim 클론해서 직접 수정.
- Love2D: 간단한 핑퐁 게임 만들기.
2주차 — 메타테이블·OOP 패턴
OOP는 Lua에 빌트인이 없다. `setmetatable`로 클래스 흉내내기를 한 번은 직접 짜봐야 한다.
local Animal = {}
Animal.__index = Animal
function Animal.new(name)
local self = setmetatable({}, Animal)
self.name = name
return self
end
function Animal:speak()
print(self.name .. " makes a sound")
end
local Dog = setmetatable({}, { __index = Animal })
Dog.__index = Dog
function Dog.new(name)
local self = Animal.new(name)
return setmetatable(self, Dog)
end
function Dog:speak()
print(self.name .. " barks")
end
local d = Dog.new("Rex")
d:speak() -- Rex barks
3주차 — coroutine·LPeg·요청 처리
- `coroutine.create` / `coroutine.resume` / `coroutine.yield` — Lua의 강력한 협력 멀티태스킹.
- LPeg(Lua PEG) — PEG 파서 라이브러리. JSON·CSV·DSL 파서를 작은 양의 코드로 만든다.
- OpenResty를 설치해 간단한 API 서버 짜기.
4주차 이후 — 한 영역 깊이 파기
- **Roblox 게임 라이브 운영**까지 — DataStore·OpenCloud·MessagingService.
- **Neovim 플러그인 작성** — nvim-treesitter·blink.cmp 코드 읽고 자기 플러그인 만들기.
- **OpenResty production** — Kong·APISIX 소스 코드 읽기.
- **Defold·Love2D로 게임잼 참여** — Ludum Dare·GMTK Jam.
에필로그 — 작은 언어의 큰 그늘
Lua는 처음 만들어진 1993년부터 한결같았다. **단순한 문법, 8개 데이터 타입, 작은 인터프리터, 강력한 메타테이블.** Roberto Ierusalimschy는 "**Lua는 임베드되기 위한 언어**"라고 거듭 말해 왔고, 32년이 지난 2026년에도 그 말은 정확히 맞다.
2026년의 Lua/Luau 생태계는 어느 때보다 다채롭다. Roblox에서 4억 명이 매일 Luau로 만든 게임을 한다. Neovim 사용자 수십만 명이 LazyVim으로 Lua를 매일 본다. Cloudflare 엣지에서 LuaJIT이 지구상의 트래픽 일부를 처리한다. WoW 애드온이 22년째 살아 있다. Lightroom 사진가가 Lua 플러그인으로 워크플로를 자동화한다.
**Lua는 절대 죽지 않는다. 그저 조용히 어디에나 있다.**
다음 패션은 Rust일 수도, Zig일 수도, 또 다른 무엇일 수도 있다. 하지만 게임 엔진이 스크립팅 언어를 골라야 하고, 에디터가 설정 언어를 골라야 하고, 웹 서버가 임베디드 핸들러 언어를 골라야 할 때, **Lua라는 선택지는 32년째 첫 줄에 올라온다.** 그리고 앞으로도 한참 그럴 것이다.
참고 / References
- Lua official site: https://www.lua.org/
- Lua 5.4 reference manual: https://www.lua.org/manual/5.4/
- Programming in Lua (4th ed.) by Roberto Ierusalimschy: https://www.lua.org/pil/
- LuaJIT: https://luajit.org/
- LuaJIT GitHub: https://github.com/LuaJIT/LuaJIT
- OpenResty fork of LuaJIT: https://github.com/openresty/luajit2
- Luau (Roblox) docs: https://luau.org/
- Luau GitHub: https://github.com/luau-lang/luau
- Roblox Developer Hub: https://create.roblox.com/docs
- Lune (Luau standalone runtime): https://github.com/lune-org/lune
- Neovim: https://neovim.io/
- LazyVim: https://www.lazyvim.org/
- AstroNvim: https://astronvim.com/
- NvChad: https://nvchad.com/
- LunarVim: https://www.lunarvim.org/
- kickstart.nvim: https://github.com/nvim-lua/kickstart.nvim
- OpenResty: https://openresty.org/
- Kong Gateway: https://konghq.com/
- Apache APISIX: https://apisix.apache.org/
- Tarantool: https://www.tarantool.io/
- Defold: https://defold.com/
- Love2D: https://love2d.org/
- Solar2D: https://solar2d.com/
- World of Warcraft AddOn UI: https://warcraft.wiki.gg/wiki/AddOn
- Tabletop Simulator API: https://api.tabletopsimulator.com/
- Garry's Mod Lua: https://wiki.facepunch.com/gmod/
- MoonScript: https://moonscript.org/
- Yuescript: https://yuescript.org/
- Teal: https://github.com/teal-language/tl
- Pluto: https://pluto-lang.org/
- Fennel: https://fennel-lang.org/
- Hammerspoon: https://www.hammerspoon.org/
- Wireshark Lua dissectors: https://wiki.wireshark.org/Lua/Dissectors
- Adobe Lightroom SDK: https://www.adobe.io/photoshop/lightroom-classic
- Cloudflare LuaJIT use: https://blog.cloudflare.com/cloudflares-architecture-eliminating-single-p/
현재 단락 (1/485)
2026년 5월, 누군가 "Lua는 끝났다"고 말하면 그 사람은 최근 5년간 게임 업계, 에디터 생태계, 그리고 고성능 웹 서버 영역을 한 번도 보지 않은 사람이다.