IMCAT.DEV
로그인 가입
Lua 고급 비동기

Lua 비동기 프로그래밍 (coroutines)

Lua 비동기 프로그래밍 (coroutines) — 고급

비동기 프로그래밍 (Coroutines)

1. 도입 (왜 배워야 하는가)

비동기 프로그래밍은 현대 소프트웨어 개발에서 매우 중요합니다. 특히, 사용자 인터페이스가 복잡한 어플리케이션이나 네트워크 요청을 처리하는 서버 애플리케이션에서는 비동기 처리 없이 사용자 경험을 저해할 수 있습니다. Lua의 코루틴(coroutines)은 이러한 비동기 프로그래밍을 쉽게 구현할 수 있는 강력한 도구입니다.

코루틴을 사용하지 않으면, 블로킹(blocking) 코드로 인해 프로그램이 멈추거나 느려지는 문제가 발생할 수 있습니다. 예를 들어, 네트워크에서 데이터를 받아오는 동안 UI가 멈춘다면 사용자에게 좋지 않은 경험을 줄 수 있습니다. 따라서 코루틴을 통해 비동기적으로 코드를 실행하면 이러한 문제를 해결할 수 있습니다.

2. 핵심 개념 설명

코루틴은 여러 실행 흐름을 동시에 처리할 수 있는 경량 스레드입니다. 이는 마치 여러 개의 요리를 동시에 준비하는 주방장과 같습니다. 주방장이 한 요리를 준비하다가 다른 요리를 잠깐 준비한 후 다시 돌아오는 것처럼, 코루틴은 특정 작업을 중단하고 다른 작업을 처리한 후 다시 돌아올 수 있습니다.

용어설명
코루틴여러 실행 흐름을 관리하는 경량 스레드
yield코루틴의 현재 상태를 중단하고 값을 반환
resume중단된 코루틴을 다시 실행

3. 기본 코드 예제

아래는 Lua에서 코루틴을 사용하는 가장 기본적인 예제입니다.

function simpleCoroutine()
    print("코루틴 시작")
    yield("첫 번째 중단")
    print("코루틴 계속")
    yield("두 번째 중단")
    print("코루틴 완료")
end

co = coroutine.create(simpleCoroutine)
print(coroutine.resume(co))  -- 첫 번째 호출
print(coroutine.resume(co))  -- 두 번째 호출
print(coroutine.resume(co))  -- 세 번째 호출

실행 결과:

코루틴 시작
첫 번째 중단
true	 첫 번째 중단
코루틴 계속
두 번째 중단
true	 두 번째 중단
코루틴 완료
false	 종료 상태

코드 한 줄씩 동작 설명:

  1. simpleCoroutine 함수를 정의합니다.
  2. 코루틴이 시작될 때 "코루틴 시작"을 출력합니다.
  3. yield("첫 번째 중단")에서 코루틴 실행을 중단하고 "첫 번째 중단" 값을 반환합니다.
  4. coroutine.resume(co)로 첫 번째 호출 시 코루틴이 재개되고 "코루틴 계속"을 출력합니다.
  5. 두 번째 yield에서 "두 번째 중단"을 반환하고 다시 중단됩니다.
  6. 세 번째 호출 시 "코루틴 완료"를 출력하고 코루틴이 종료됩니다.
  7. 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니

    쇼핑몰에서 장바구니에 상품을 추가할 때, 여러 개의 상품 정보를 비동기적으로 처리할 수 있습니다.

    function addToCart(cart)
        for _, item in ipairs(cart) do
            print(item .. "이(가) 장바구니에 추가되었습니다.")
            coroutine.yield()
        end
    end
    
    cart = {"사과", "바나나", "체리"}
    co = coroutine.create(function() addToCart(cart) end)
    
    while coroutine.status(co) ~= "dead" do
        coroutine.resume(co)
    end

    상황 설명: 사용자가 여러 상품을 장바구니에 추가할 때마다 UI는 반응성을 유지하면서 각 상품 추가 작업을 수행할 수 있습니다.

    예제 2: 파일 다운로드

    네트워크에서 파일을 다운로드하는 동안 사용자에게 다운로드 진행 상황을 보여줄 수 있습니다.

    function downloadFile(file)
        for i = 1, 10 do
            print(file .. " 다운로드 중: " .. (i * 10) .. "% 완료")
            coroutine.yield()
        end
        print(file .. " 다운로드 완료!")
    end
    
    co = coroutine.create(function() downloadFile("example.txt") end)
    
    while coroutine.status(co) ~= "dead" do
        coroutine.resume(co)
    end

    상황 설명: 파일이 다운로드되는 동안 사용자 인터페이스가 멈추지 않고, 다운로드 진행 상황을 실시간으로 보여줄 수 있습니다.

    5. 흔한 실수와 주의사항

    실수 1: 코루틴을 호출하지 않음

    -- 잘못된 코드
    co = coroutine.create(simpleCoroutine)
    -- coroutine.resume(co)를 호출하지 않음

    해결: 반드시 코루틴을 실행해야 합니다.

    실수 2: yield 후 다시 resume하지 않음

    -- 잘못된 코드
    function brokenCoroutine()
        print("시작")
        yield()
    end
    -- resume 호출 없음

    해결: yield 후 반드시 resume을 호출하여 다음 실행을 이어가야 합니다.

    6. 정리

    • 코루틴은 비동기 프로그래밍을 구현하는 강력한 도구입니다.
    • 코루틴을 사용하면 여러 작업을 동시에 처리할 수 있어 사용자 경험을 향상시킬 수 있습니다.
    • 코루틴의 yield와 resume 메커니즘을 이해하고 활용하는 것이 중요합니다.

다음에 학습하면 좋은 주제: 비동기 프로그래밍 패턴, 이벤트 루프, Lua의 테이블과 메타테이블 활용법.