카테고리 없음
쿠팡이츠) 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": "너무 맛있어요!"
}
]
}