카테고리 없음

쿠팡이츠) store_selet 요청 JOIN 사용 전/후

joo_coding 2025. 6. 19. 09:51

쿼리문 JOIN 사용 전 :: 복합구조

json handle_store_select(const json& data) {
    json response;

    // [1] 요청 데이터 유효성 검사
    if (!data.contains("ST_ID") || !data["ST_ID"].is_number()) {
        return {
            {"role", "server"},
            {"action", "store_select"},
            {"status", "error"},
            {"message", "ST_ID 누락 또는 형식 오류"}
        };
    }

    int st_id = data["ST_ID"];
    MYSQL* conn = connect_db();
    if (!conn) {
        return {
            {"role", "server"},
            {"action", "store_select"},
            {"status", "error"},
            {"message", "DB 연결 실패"}
        };
    }

    // [2] 가게 기본 정보 조회 (store_info)
    json store_info;
    string query_store =
        "SELECT ST_ID, ST_NAME, ST_MIN_PRICE, ST_ADDRESS "
        "FROM ST_INFO "
        "WHERE ST_ID = " + to_string(st_id);
    if (mysql_query(conn, query_store.c_str()) == 0) {
        MYSQL_RES* res = mysql_store_result(conn);
        if (res) {
            MYSQL_ROW row = mysql_fetch_row(res);
            if (row) {
                store_info["ST_ID"]        = row[0] ? atoi(row[0]) : 0;
                store_info["ST_NAME"]      = row[1] ? row[1] : "";
                store_info["ST_MIN_PRICE"] = row[2] ? atoi(row[2]) : 0;
                store_info["ST_ADDRESS"]   = row[3] ? row[3] : "";
            }
            mysql_free_result(res);
        }
    }

    // [3] 카테고리 목록 조회 (cate_list)
    json cate_list = json::array();
    string query_cate =
        "SELECT CATE_ID, CATE_NAME "
        "FROM CATE_INFO "
        "WHERE ST_ID = " + to_string(st_id);
    if (mysql_query(conn, query_cate.c_str()) == 0) {
        MYSQL_RES* res = mysql_store_result(conn);
        if (res) {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res))) {
                json cate;
                cate["CATE_ID"]   = row[0] ? atoi(row[0]) : 0;
                cate["CATE_NAME"] = row[1] ? row[1] : "";
                cate_list.push_back(cate);
            }
            mysql_free_result(res);
        }
    }

    // [4] 메뉴 목록 조회 (menu_list)
    json menu_list = json::array();
    string query_menu =
        "SELECT MENU_ID, MENU_NAME, MENU_PRICE, MENU_DESC "
        "FROM MENU_INFO "
        "WHERE ST_ID = " + to_string(st_id);
    if (mysql_query(conn, query_menu.c_str()) == 0) {
        MYSQL_RES* res = mysql_store_result(conn);
        if (res) {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res))) {
                json menu;
                menu["MENU_ID"]    = row[0] ? atoi(row[0]) : 0;
                menu["MENU_NAME"]  = row[1] ? row[1] : "";
                menu["MENU_PRICE"] = row[2] ? atoi(row[2]) : 0;
                menu["MENU_DESC"]  = row[3] ? row[3] : "";
                menu_list.push_back(menu);
            }
            mysql_free_result(res);
        }
    }

    // [5] 리뷰 목록 조회 (review_list)
    json review_list = json::array();
    string query_review =
        "SELECT RV_ID, RV_RATING, RV_CONTENTS "
        "FROM REVIEW_LIST "
        "WHERE ST_ID = " + to_string(st_id);
    if (mysql_query(conn, query_review.c_str()) == 0) {
        MYSQL_RES* res = mysql_store_result(conn);
        if (res) {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res))) {
                json review;
                review["RV_ID"]        = row[0] ? atoi(row[0]) : 0;
                review["RV_RATING"]    = row[1] ? atoi(row[1]) : 0;
                review["RV_CONTENTS"]  = row[2] ? row[2] : "";
                review_list.push_back(review);
            }
            mysql_free_result(res);
        }
    }

    mysql_close(conn);

    // [6] 최종 응답 JSON 구성
    response["role"]        = "server";
    response["action"]      = "store_select";
    response["status"]      = "success";
    response["store_info"]  = store_info;
    response["cate_list"]   = cate_list;
    response["menu_list"]   = menu_list;
    response["review_list"] = review_list;
    return response;
}
JOIN 전 :: 클라이언트가 받는 JSON

{
  "role": "server",
  "action": "store_select",
  "status": "success",
  "store_info": {
    "ST_ID": 1,
    "ST_NAME": "명인의 찜닭",
    "ST_MIN_PRICE": 20000,
    "ST_ADDRESS": "광주광역시 ..."
  },
  "cate_list": [
    {"CATE_ID": 1, "CATE_NAME": "메뉴소개"},
    {"CATE_ID": 2, "CATE_NAME": "기타메뉴"},
    {"CATE_ID": 3, "CATE_NAME": "계절별미"},
    {"CATE_ID": 4, "CATE_NAME": "추가메뉴"}
  ],
    "menu_list": [
      {
        "MENU_ID": 1,
        "MENU_NAME": "싸이순살버거",
        "MENU_PRICE": 5900,
        "MENU_DESC": "국내산 통닭다리살을 사용한 버거"
      }
    ],
    "review_list": [
      {
        "RV_ID": 1001,
        "RV_RATING": 5,
        "RV_CONTENT": "치킨이 바삭하고 맛있어요!"
      }
    ]
}

 


쿼리문 JOIN 사용 후 :: 단일구조

<쿼리>

SELECT 
    S.ST_ID, S.ST_NAME, S.ST_MIN_PRICE, S.ST_ADDRESS,
    C.CATE_NAME,
    M.MENU_ID, M.MENU_NAME, M.MENU_PRICE, M.MENU_DESC,
    R.RV_ID, R.RV_RATING, R.RV_CONTENTS
FROM ST_INFO S
LEFT JOIN CATE_INFO C ON S.CATE_ID = C.CATE_ID
LEFT JOIN MENU_INFO M ON S.ST_ID = M.ST_ID
LEFT JOIN REVIEW_LIST R ON S.ST_ID = R.ST_ID
WHERE S.ST_ID = ?
json handle_store_select(const json& data) {
    json response;

    // 🔒 유효성 검사
    if (!data.contains("ST_ID") || !data["ST_ID"].is_number()) {
        return {
            {"role", "server"},
            {"action", "store_select"},
            {"status", "error"},
            {"message", "ST_ID 누락 또는 형식 오류"}
        };
    }

    int st_id = data["ST_ID"];
    MYSQL* conn = connect_db();
    if (!conn) {
        return {
            {"role", "server"},
            {"action", "store_select"},
            {"status", "error"},
            {"message", "DB 연결 실패"}
        };
    }

    // 📦 쿼리: 4개 테이블을 JOIN하여 하나의 결과 레코드로
    string query =
        "SELECT "
        "S.ST_ID, S.ST_NAME, S.ST_MIN_PRICE, S.ST_ADDRESS, "
        "C.CATE_NAME, "
        "M.MENU_ID, M.MENU_NAME, M.MENU_PRICE, M.MENU_DESC, "
        "R.RV_ID, R.RV_RATING, R.RV_CONTENT "
        "FROM ST_INFO S "
        "LEFT JOIN CATE_INFO C ON S.CATE_ID = C.CATE_ID "
        "LEFT JOIN MENU_INFO M ON S.ST_ID = M.ST_ID "
        "LEFT JOIN REVIEW_LIST R ON S.ST_ID = R.ST_ID "
        "WHERE S.ST_ID = " + to_string(st_id);

    if (mysql_query(conn, query.c_str()) != 0) {
        mysql_close(conn);
        return {
            {"role", "server"},
            {"action", "store_select"},
            {"status", "error"},
            {"message", "쿼리 실패: " + string(mysql_error(conn))}
        };
    }

    MYSQL_RES* result = mysql_store_result(conn);
    if (!result) {
        mysql_close(conn);
        return {
            {"role", "server"},
            {"action", "store_select"},
            {"status", "error"},
            {"message", "결과 없음"}
        };
    }

    MYSQL_ROW row;
    json store_list = json::array();

    while ((row = mysql_fetch_row(result))) {
        json store;
        store["ST_ID"]        = row[0] ? atoi(row[0]) : 0;
        store["ST_NAME"]      = row[1] ? row[1] : "";
        store["ST_MIN_PRICE"] = row[2] ? atoi(row[2]) : 0;
        store["ST_ADDRESS"]   = row[3] ? row[3] : "";

        store["CATE_NAME"]    = row[4] ? row[4] : "";

        store["MENU_ID"]      = row[5] ? atoi(row[5]) : 0;
        store["MENU_NAME"]    = row[6] ? row[6] : "";
        store["MENU_PRICE"]   = row[7] ? atoi(row[7]) : 0;
        store["MENU_DESC"]    = row[8] ? row[8] : "";

        store["RV_ID"]        = row[9] ? atoi(row[9]) : 0;
        store["RV_RATING"]    = row[10] ? atoi(row[10]) : 0;
        store["RV_CONTENT"]   = row[11] ? row[11] : "";

        store_list.push_back(store);
    }

    mysql_free_result(result);
    mysql_close(conn);

    response["role"] = "server";
    response["action"] = "store_select";
    response["status"] = "success";
    response["stores"] = store_list;
    return response;
}
클라이언트가 받는 JSON

{
  "role": "server",
  "action": "store_select",
  "status": "success",
  "stores": [
    {
      "ST_ID": 1,
      "ST_NAME": "맘스터치",
      "ST_MIN_PRICE": 10000,
      "ST_ADDRESS": "서울 강남구",
      "CATE_NAME": "패스트푸드",
      "MENU_ID": 101,
      "MENU_NAME": "싸이순살버거",
      "MENU_PRICE": 5900,
      "MENU_DESC": "매콤한 닭다리살 버거",
      "RV_ID": 2001,
      "RV_RATING": 5,
      "RV_CONTENT": "너무 맛있어요!"
    }
  ]
}