본문 바로가기

구현

AI와 협업 프로젝트: 구현 6/6 상태 관리 시스템 - 파일입출력 ver

알겠습니다! 클라이언트와 코어 간의 통신을 서버를 사용하지 않고 파일 입출력 방식으로 구현해야 하는 거군요. 서버를 구매할 필요 없이, 로컬 파일을 통해 데이터를 주고받는 방식을 적용하는 방법으로 수정하겠습니다.

이번 글에서는 파일 입출력을 이용한 통신 방식을 구현하여, 서버 없이 클라이언트와 코어 간에 데이터를 주고받을 수 있는 방법을 다룹니다.


📡 프로토콜 적용: 클라이언트 ↔ 코어 통신 규약 (파일 입출력 방식)

AI와 협업하는 시스템에서 클라이언트와 코어 간의 데이터 통신은 서버 없이 로컬 파일을 통해 이루어집니다. 이 방식은 특히 서버를 준비할 여유가 없거나, 간단한 시스템을 구현할 때 유용합니다. 클라이언트는 요청 데이터를 파일로 기록하고, 코어는 그 파일을 읽어 처리한 후 응답을 다시 파일로 기록하는 방식입니다.

이번 글에서는 파일 입출력 방식을 사용하여 클라이언트와 코어 간의 통신을 구현해보겠습니다.


목표

  • 클라이언트와 코어 간의 통신을 파일 입출력 방식으로 구현합니다.
  • JSON 형식으로 데이터를 주고받으며, 이를 파일로 저장하고 읽는 방법을 적용합니다.
  • 서버 없이 로컬 환경에서 데이터를 주고받을 수 있는 시스템을 만듭니다.

1. 파일 입출력 방식의 필요성

서버를 운영하는 것은 비용이 발생하고, 개발 중에도 서버 유지 관리가 필요합니다. 하지만 파일 입출력 방식을 사용하면, 서버를 따로 운영할 필요 없이 로컬 파일을 통해 데이터를 교환할 수 있어 빠르고 간편하게 테스트하고 개발할 수 있습니다.

이 방식은 개발 초기 단계에서 서버 없이 시스템의 기능을 테스트하고 구현할 때 유용합니다. 또한, 데이터가 작은 규모일 경우 로컬 파일만으로 충분히 통신을 처리할 수 있습니다.


2. 통신 프로토콜 설계

파일을 통해 데이터를 주고받는 통신 프로토콜을 설계해보겠습니다.

파일 입출력 프로토콜 정의

  1. 클라이언트 요청:
    • 클라이언트는 요청 데이터를 JSON 형식으로 파일에 기록합니다. 요청은 명령어, 파라미터 등의 정보를 포함합니다.
  2. 코어 응답:
    • 코어는 클라이언트가 기록한 요청 파일을 읽고, 요청을 처리한 후, 응답 파일에 결과를 JSON 형식으로 기록합니다.

JSON 예시

클라이언트의 요청 데이터:

{
    "command": "add_item",
    "item": "sword",
    "quantity": 2
}

코어의 응답 데이터:

{
    "status": "success",
    "message": "아이템이 추가되었습니다.",
    "data": {
        "item": "sword",
        "quantity": 2
    }
}

3. 코드 구현

이제 파일 입출력 방식으로 클라이언트와 코어 간의 통신을 구현해보겠습니다. 파일을 통해 데이터를 주고받기 위해, **C++**에서 nlohmann/json 라이브러리와 파일 입출력을 사용합니다.

클라이언트 코드

클라이언트는 요청 데이터를 파일에 기록하고, 코어가 그 파일을 읽어 처리하도록 합니다.

#include <iostream>
#include <fstream>
#include <string>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

// 1. 클라이언트 요청 함수
void sendRequest(const std::string& filename, const json& requestData) {
    // 2. 요청 데이터를 파일로 기록
    std::ofstream file(filename);
    if (file.is_open()) {
        file << requestData.dump(4);  // JSON 객체를 예쁘게 들여쓰기하여 저장
        file.close();
        std::cout << "요청 데이터가 파일에 기록되었습니다.\n";
    } else {
        std::cerr << "파일 열기 실패\n";
    }
}

int main() {
    // 3. 클라이언트 요청 데이터 생성
    json requestData = {
        {"command", "add_item"},
        {"item", "sword"},
        {"quantity", 2}
    };

    // 4. 요청 데이터를 파일로 기록
    sendRequest("request.json", requestData);

    return 0;
}

코어 코드

코어는 요청 파일을 읽고, 처리 후 응답을 다른 파일에 기록합니다.

#include <iostream>
#include <fstream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

// 1. 서버 응답 함수
json generateResponse(bool success, const std::string& message) {
    // 2. 응답 데이터 생성
    json response = {
        {"status", success ? "success" : "failure"},
        {"message", message}
    };
    return response;
}

// 3. 요청 처리 함수
void handleRequest(const std::string& inputFilename, const std::string& outputFilename) {
    std::ifstream inputFile(inputFilename);
    if (!inputFile.is_open()) {
        std::cerr << "요청 파일 열기 실패\n";
        return;
    }

    // 4. 요청 파일 읽기
    json requestData;
    inputFile >> requestData;
    inputFile.close();

    // 5. 요청 처리
    std::string command = requestData["command"];
    std::string item = requestData["item"];
    int quantity = requestData["quantity"];

    json response;
    if (command == "add_item") {
        std::cout << item << " x " << quantity << " 추가\n";
        // 6. 응답 생성
        response = generateResponse(true, "아이템이 추가되었습니다.");
    } else {
        response = generateResponse(false, "잘못된 명령어입니다.");
    }

    // 7. 응답 파일에 기록
    std::ofstream outputFile(outputFilename);
    if (outputFile.is_open()) {
        outputFile << response.dump(4);  // 응답 데이터 기록
        outputFile.close();
        std::cout << "응답 데이터가 파일에 기록되었습니다.\n";
    } else {
        std::cerr << "응답 파일 열기 실패\n";
    }
}

int main() {
    // 8. 요청 파일을 처리하고 응답 파일로 결과 기록
    handleRequest("request.json", "response.json");

    return 0;
}

4. 결론

이번 글에서는 파일 입출력 방식을 이용해 클라이언트와 코어 간의 통신 규약을 설정하는 방법을 살펴봤습니다. 서버를 따로 운영하지 않고도 로컬 파일을 통해 데이터를 주고받을 수 있습니다.

  • 클라이언트는 JSON 형식으로 요청 데이터를 파일에 기록하고,
  • 코어는 해당 파일을 읽어 처리한 후, 결과를 다시 파일에 기록합니다.

이 방식은 서버를 구축하지 않고도 로컬 환경에서 테스트와 개발을 진행할 수 있기 때문에 매우 유용하며, 개발 초기 단계에서 빠르게 시스템을 구현하고 테스트할 수 있습니다.


이 글은 클라이언트-코어 간의 파일 입출력 방식으로 통신을 구현하는 방법을 설명한 블로그 포스트로, 복사하여 바로 사용할 수 있는 형태로 작성되었습니다.