IMCAT.DEV
로그인 가입
Lua 중급 네트워크

Lua 파일 및 네트워크 I/O

Lua 파일 및 네트워크 I/O — 중급

파일 및 네트워크 I/O

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

파일 및 네트워크 I/O는 현대 소프트웨어 개발에서 필수적인 요소입니다. 데이터 저장 및 전송은 모든 프로그램의 핵심 기능으로, 사용자 데이터를 안전하게 저장하고, 서버와 클라이언트 간에 정보를 주고받는 데 필수적입니다. 이 기술을 이해하지 못하면, 예를 들어 웹 애플리케이션에서 사용자 정보를 불러오거나, 게임에서 저장된 게임 데이터를 읽어오지 못하는 등의 문제가 발생할 수 있습니다. 즉, 파일 및 네트워크 I/O를 제대로 활용하지 못하면 프로그램의 기능이 제한되고, 사용자 경험이 저하될 수 있습니다.

2. 핵심 개념 설명

파일 I/O

파일 I/O는 프로그래밍에서 파일을 읽고 쓰는 과정을 의미합니다. 이를 통해 프로그램이 데이터를 영구적으로 저장하거나 불러올 수 있습니다.

  • 읽기(read): 파일에서 데이터를 가져오는 과정
  • 쓰기(write): 데이터를 파일에 저장하는 과정
  • 네트워크 I/O

    네트워크 I/O는 클라이언트와 서버 간의 데이터 전송을 의미합니다. 이는 API 호출이나 데이터베이스와의 통신 등 다양한 상황에서 사용됩니다.

  • 소켓(Socket): 네트워크 통신의 기본 단위로, 클라이언트와 서버가 서로 데이터를 주고받는 통로
  • HTTP 요청: 웹 서버에 정보를 요청하는 방법
  • 용어설명
    파일 I/O파일의 내용을 읽고 쓰는 기능
    네트워크 I/O네트워크를 통해 데이터를 송수신하는 기능

    3. 기본 코드 예제

    파일 읽기 및 쓰기 예제

    -- 파일에 문자열 쓰기
    local file = io.open("example.txt", "w") -- "w" 모드로 파일 열기
    file:write("안녕하세요, Lua!") -- 파일에 문자열 쓰기
    file:close() -- 파일 닫기
    
    -- 파일에서 문자열 읽기
    local file = io.open("example.txt", "r") -- "r" 모드로 파일 열기
    local content = file:read("*a") -- 파일의 모든 내용을 읽기
    file:close() -- 파일 닫기
    
    print(content) -- 읽은 내용을 출력

    실행 결과:

    안녕하세요, Lua!
  • 1행: "example.txt"라는 이름의 파일을 쓰기 모드로 엽니다.
  • 2행: 파일에 "안녕하세요, Lua!"라는 문자열을 씁니다.
  • 3행: 파일을 닫습니다.
  • 5행: "example.txt"라는 이름의 파일을 읽기 모드로 엽니다.
  • 6행: 파일의 모든 내용을 읽어 content 변수에 저장합니다.
  • 7행: 파일을 닫습니다.
  • 9행: 읽은 내용을 출력합니다.
  • 네트워크 통신 예제

    local socket = require("socket")
    local client = socket.tcp() -- TCP 소켓 생성
    client:connect("www.example.com", 80) -- 호스트와 포트에 연결
    
    client:send("GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n") -- HTTP GET 요청 보내기
    local response = client:receive('*a') -- 응답을 모두 읽기
    client:close() -- 소켓 닫기
    
    print(response) -- 응답 내용 출력

    실행 결과: (HTTP 응답 내용이 출력됨)

  • 1행: 소켓 라이브러리를 불러옵니다.
  • 2행: TCP 소켓을 생성합니다.
  • 3행: 지정한 호스트와 포트에 연결합니다.
  • 5행: HTTP GET 요청을 서버에 보냅니다.
  • 6행: 서버로부터 응답을 모두 읽어 response 변수에 저장합니다.
  • 7행: 소켓을 닫습니다.
  • 9행: 서버가 보낸 응답 내용을 출력합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니 구현

    장바구니에 담긴 상품 정보를 파일에 저장하고, 웹 애플리케이션에서 읽어오는 경우입니다.

    -- 장바구니에 상품 추가
    local cart = {"사과", "바나나", "오렌지"}
    local file = io.open("cart.txt", "w")
    for _, item in ipairs(cart) do
        file:write(item .. "\n") -- 각 상품을 새로운 줄에 씁니다.
    end
    file:close()
    
    -- 장바구니 내용 읽기
    local file = io.open("cart.txt", "r")
    local items = {}
    for line in file:lines() do
        table.insert(items, line) -- 파일에서 읽은 각 줄을 테이블에 추가
    end
    file:close()
    
    print(table.concat(items, ", ")) -- 장바구니 내용 출력

    예제 2: 서버에서 사용자 데이터 가져오기

    서버에 사용자 정보를 요청하고, 결과를 파일로 저장하는 예제입니다.

    local socket = require("socket")
    local client = socket.tcp()
    client:connect("api.example.com", 80)
    
    client:send("GET /users HTTP/1.1\r\nHost: api.example.com\r\n\r\n")
    local response = client:receive('*a')
    client:close()
    
    local file = io.open("users.json", "w")
    file:write(response) -- 사용자 정보를 파일에 저장
    file:close()

    5. 흔한 실수와 주의사항

    흔한 실수 1: 파일 모드 실수

  • 잘못된 코드:
  • local file = io.open("example.txt", "r") -- 파일을 읽기 모드로 열었지만 존재하지 않으면 오류 발생
  • 올바른 코드:
  • local file = io.open("example.txt", "r") or io.open("example.txt", "w") -- 파일이 없으면 새로 생성

    흔한 실수 2: 소켓 연결 오류

  • 잘못된 코드:
  • client:connect("invalid.host", 80) -- 잘못된 호스트
  • 올바른 코드:
  • local success, err = client:connect("valid.host", 80)
    if not success then
        print("연결 오류: " .. err) -- 오류 처리
    end

    6. 정리

  • 파일 I/O는 데이터의 영구 저장과 불러오기에 필수적입니다.
  • 네트워크 I/O는 서버와 클라이언트 간의 데이터 통신을 가능하게 합니다.
  • 파일 모드와 소켓 연결에 주의하여야 합니다.
  • 다음에 학습하면 좋은 주제: Lua의 테이블과 JSON 처리, HTTP 요청 라이브러리 활용.