require 함수
require로 외부 모듈을 불러오고 모듈 캐싱을 이해합니다.
require 함수은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
require의 작동 방식
require(modname)은 모듈을 불러와 반환합니다. package.path에서 .lua 파일을 검색하고 package.cpath에서 C 라이브러리를 검색합니다. 결과는 package.loaded[modname]에 캐시되므로 이후 호출에서는 파일을 다시 실행하지 않고 캐시된 값을 반환합니다.
-- First require: loads and executes math_utils.lua
local math_utils = require("math_utils")
-- Second require: returns cached value (file not re-run)
local math_utils2 = require("math_utils")
print(math_utils == math_utils2) -- true (same object)
print(package.loaded["math_utils"] == math_utils) -- true모듈 반환 값
모듈 파일은 값을 반환해야 하며, 일반적으로 함수 테이블을 반환합니다. 이 반환 값이 require가 호출자에게 돌려주는 값입니다. 파일이 아무것도 반환하지 않거나 true를 반환하면 require도 해당 값을 반환합니다.
-- mymodule.lua:
-- local M = {}
-- function M.hello() print("Hello from module!") end
-- return M
-- In main script:
local m = require("mymodule")
m.hello() -- Hello from module!
-- The module table is the interfacepackage.loaded의 캐싱
package.loaded는 모듈 이름과 불러온 값을 연결하는 테이블입니다. 항목을 수동으로 설정하여 모의 객체를 미리 불러오거나, nil로 설정하여 다시 불러오도록 할 수 있습니다. 그러면 다음 require에서 모듈 파일이 다시 실행됩니다.
-- Force reload by clearing cache
package.loaded["mymodule"] = nil
local fresh = require("mymodule") -- re-executes the file
-- Preload a mock for testing
package.loaded["db"] = {
query = function() return {} end,
close = function() end,
}
local db = require("db") -- gets the mockpackage.path 형식
package.path는 세미콜론으로 구분된 패턴 목록입니다. 자리 표시자 ?는 모듈 이름으로 대체되며, 이때 점은 경로 구분자로 바뀝니다. package.path 앞에 디렉터리를 추가하여 검색할 위치를 늘릴 수 있습니다.
print(package.path)
-- typically: ./?.lua;./?.luac;/usr/share/lua/5.4/?.lua;...
-- Add local lib directory
package.path = "./lib/?.lua;" .. package.path
-- Now require("utils") will look in ./lib/utils.luarequire와 dofile 및 loadfile 비교
require: 캐시하고 package.path를 검색합니다. dofile(path): 파일을 즉시 실행하며 캐시하지 않고 직접 경로를 사용합니다. loadfile(path): 실행하지 않고 컴파일하여 함수를 반환합니다. 모듈에는 require를, 한 번만 실행할 스크립트에는 dofile을 사용하십시오.
-- dofile: no caching, direct path
dofile("./scripts/setup.lua")
-- loadfile: compile only, returns function
local fn, err = loadfile("./config.lua")
if fn then
local result = fn() -- execute when ready
end
-- require: best for modules
local json = require("json")디렉터리를 위한 점 표기법 require
모듈 이름에 점을 사용하면 하위 디렉터리의 파일을 참조할 수 있습니다. require("utils.string")은 utils/string.lua에 매핑됩니다(경로 패턴에 ?가 있는 경우). 이것이 여러 파일로 구성된 라이브러리를 정리하는 방식입니다.
-- Directory structure:
-- lib/
-- utils/
-- string.lua
-- table.lua
-- init.lua
package.path = "./lib/?.lua;" .. package.path
local strUtils = require("utils.string") -- loads lib/utils/string.lua
local tblUtils = require("utils.table") -- loads lib/utils/table.lua모듈 초기화의 부수 효과
모듈 파일은 처음 require될 때 한 번 실행됩니다. 최상위 수준(함수 외부)에 있는 코드는 require 시점에 실행됩니다. 이는 한 번만 수행하는 초기화에 유용하지만, 네트워크 연결이나 파일 작업 같은 부수 효과도 가져오기 시점에 실행된다는 점에 주의하십시오.
-- counter.lua:
-- local count = 0 -- initialized once on first require
-- local M = {}
-- function M.increment() count = count + 1 end
-- function M.get() return count end
-- return M
local c = require("counter")
c.increment()
c.increment()
print(c.get()) -- 2
local c2 = require("counter")
print(c2.get()) -- 2 (same instance, cached)require에서의 오류 처리
모듈 파일에 구문 오류가 있거나 불러오는 중 오류를 발생시키면 require가 오류를 발생시킵니다. 오류 메시지에는 모듈 이름과 파일 내부에서 발생한 오류가 포함됩니다. 모듈 불러오기의 실패를 원활하게 처리하려면 pcall을 사용하십시오.
local ok, mod = pcall(require, "possibly_missing")
if not ok then
print("Module not available:", mod)
-- fall back to alternative or default implementation
mod = {feature = function() return "fallback" end}
end
print(mod.feature())package.preload
package.preload은 모듈 이름별로 로더 함수를 등록할 수 있는 테이블입니다. require("name")이 호출되면 Lua는 먼저 preload를 확인합니다. 이를 사용하면 파일 없이 모듈을 등록할 수 있어, 내장 Lua 환경이나 테스트에 유용합니다.
package.preload["mymath"] = function()
return {
double = function(n) return n * 2 end,
triple = function(n) return n * 3 end,
}
end
local m = require("mymath")
print(m.double(5)) -- 10
print(m.triple(5)) -- 15순환 require
순환 종속성(A가 B를 require하고 B가 A를 require하는 경우)은 부분적으로 처리됩니다. Lua는 모듈을 실행하기 전에 package.loaded에 true 자리 표시자를 저장합니다. B가 A의 아직 완성되지 않은 테이블을 사용하려고 하면 불완전한 결과를 받을 수 있습니다. 모듈 설계에서 순환 종속성을 피하십시오.
-- a.lua: local b = require("b"); local M = {}; M.name = "A"; return M
-- b.lua: local a = require("a"); print("a.name:", a.name); return {}
-- When a.lua is loaded:
-- 1. a starts executing
-- 2. requires b -> b starts executing
-- 3. b requires a -> gets partial a (still loading!)
-- 4. a.name may be nil at step 3
print("Avoid circular requires in module design")빠른 확인
require("mod")를 두 번째로 호출하면 어떻게 됩니까?
복습: require
요약:
require(name)는 한 번만 로드하고package.loaded에 캐시합니다- 모듈 파일은 공개 인터페이스(일반적으로 테이블)를 반환합니다
- 강제로 다시 로드하려면
package.loaded[name]을 지웁니다 - 사용자 지정 검색 디렉터리를 추가하려면
package.path에 추가합니다 - 메모리 내 모듈에는
package.preload을 사용합니다 - 순환 종속성을 피합니다
자주 묻는 질문
“require 함수” 강의는 무료인가요?
네 — “require 함수” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“require 함수”에서 뭘 배우나요?
require로 외부 모듈을 불러오고 모듈 캐싱을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“require 함수” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.