Home 캡스톤일지 | ~ 11.28(1) 일단은 밀린 캡스톤 일지 쓰기
Post
Cancel

캡스톤일지 | ~ 11.28(1) 일단은 밀린 캡스톤 일지 쓰기

블로그를 못쓴 짧은 몇주간 많은 일들이 있었다.

  • 😢 준비하던게 잘 안되서 으어어어엄청 속상했었고 (여전히 그 우울함에서 못벗어나고 있음)
  • 🫢 작년에 다녔던 회사에 다시 몇달간 다니게 되었고
  • 🤯 다시 하고 싶은게 생겼으나 힘이 나지 않고..
  • 🤬 그와중에 강의는 왕창 밀렸는데 시험은 일주일이나 당겨졌다.

캡스톤도 이제 거의 막바지다.. 오랜만에 블로그를 보며 다시 열심히 살아야겠다고 생각해서 이제 다시 캡스톤 일지를 써보려 한다.!
간간히 캡스톤하면서 엇 이 오류는 캡스톤 일지에 써야징 했던거를 블로그에 적어놨었는데 그것들부터 털어내야겠다.

사실 하느라 바빠서 몇 개 없음


MySQL connection

📄 config/db_config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var mysql = require('mysql');
require('dotenv').config();

const db_info = {
	dev:{ // 개발환경
		host: 'localhost',
		user: 'root',
		password: process.env.DB_SECRET,
		database: 'capstone',
		multipleStatements: true
    },
	real: { // 실제 운영환경
	}	
};

const db_connection = {
	init : function(){
        return mysql.createConnection(db_info.dev);
	}
};

module.exports = db_connection;

데이터베이스 비밀번호는 노드 환경변수로 저장
자세한건 👉🏻 https://ijo0r98.github.io/posts/capstion8/

⚙️ .env

DB_SECRET={비밀번호}

📄 routes/order/order.ctrl.js (주문 API 컨트롤러)

1
2
3
const config = require('../../config/db_config');
const connection = config.init();
connection.connect();

Node & MySQL 여러 쿼리 한번에 실행

키오스크 웹백엔드 개발에서 나는 주문 시스템을 맡았는데 본격적으로 주문 관련 API를 작성하던 중 노드에서 mysql 쿼리 매핑하며 몇가지 소소한 문제들을 해결했다.

그 중 첫번째로 해결한 소소한 문제는 바로 여러 쿼리를 한번에 실행하는 것! 생각보다 쉽게 해결함 ~~

1. 주문시스템 처음 화면에서 카테고리 리스트와 첫번째 카테고리의 메뉴 보여주기
먼저 작성한 쿼리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 카테고리 조회
let query1 = ' SELECT categoryNo, categoryName FROM category WHERE storeNo = ?;';

// 첫번째 카테고리의 메뉴 조회
let query2 = `  SELECT	*
                FROM	menu
                WHERE	categoryNo
                IN (
                    SELECT categoryNo
                    FROM (
                        SELECT	categoryNo
                        FROM	category C
                        WHERE	C.storeNo = ?
                        LIMIT 1
                    ) AS tmp
                );`;

두 쿼리 이어서 한번에 실행 (자잘한 로그들은 모두 지운 상태임)

1
2
3
4
5
6
7
8
9
10
11
12
13
connection.query(query1 + query2, [storeNo, storeNo], function(err, result) {
    if(err) {
        // 에러 발생 시 
        res.status(400).end();
    } else {
        // 성공 시
        let data = {
            'category': result[0],
            'menu': result[1]
        }
        return res.status(200).json(data).end();
    }
});

두 쿼리가 한번에 실행됨으로 파라미터도 array 형태로 같이 묶어줘야한다.
결과는 array 형태로 반환된다.

2. 주문 정보 추가 후 주문번호 알아오기
작성한 쿼리

1
2
let insertOrderQuery = `INSERT INTO orders(orderTime, customerTel, totalPrice, storeNo) VALUE (?, ?, ?, ?); 
                        SELECT LAST_INSERT_ID();`

위에서도 그렇지만 쿼리 사이가 ;로 구별됨으로 뛰어쓰기와 ; 잘 지켜서 쓸 것

가장 최근에 insert된 row의(테이블 가장 마지막의) PK값 가져오기

1
SELECT LAST_INSERT_ID()

나는 간단한 서비스이고 그냥 로컬에서만 사용하기 때문에 그냥 썼지만 트랜잭션과 해당 변수의 작동 원리는 잘 알고 써야될듯 하다

[참고] https://cirius.tistory.com/1139

쿼리 실행

1
2
3
4
5
6
7
8
9
10
let params = [orderTime, customerTel, totalPrice, storeNo];
connection.query(insertQuery, params, function(err, result) {
        if(err) {
            // 실패 시
            return res.status(400).end();
        } else {
            // 성공 시 주문 번호 반환
            res.status(200).json({"orderNo": result[1][0]["LAST_INSERT_ID()"]}).end();
        }
    });

3. 결제 정보 추가 후 주문 상세정보 추가
작성한 쿼리

1
2
let insertPaymentQuery = `INSERT INTO payment(paymentType, paymentTime, paymentMethod, paymentPrice, storeNo, orderNo) VALUE (?, ?, ?, ?, ?, ?); `
let insertOrderDetailQuery =  `INSERT INTO orderDetail(count, orderDetailPrice, storeNo, orderNo, menuNo, menuName) VALUES ?;`

두번째 insert 쿼리의 파라미터가 ? 하나인 이유는 이따 나옴

파라미터

1
2
3
4
5
6
7
8
9
10
// 결제 정보 파라미터
let params1 = ['결제', payTime, paymentMethod, paymentPrice, storeNo, orderNo];

// 장바구니 목록(req.body) -> 주문 상세정보 파라미터
let shoppingCartDict = JSON.parse(req.body.shoppingCart);
let params2 = [];
for (let key in shoppingCartDict) {
    var value = shoppingCartDict[key];
    params2.push([value["count"], value["totalPrice"], storeNo, orderNo, value["menuNo"], value["menuName"]]);
};

쿼리 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
connection.query(insertPaymentQuery, params1, function(err, result) {
    if(err) {
        res.status(400).end();
    } else {
        connection.query(insertOrderDetailQuery, [params2], function(err, result) {
            if(err) {
                res.status(400).end();
            } else {
                res.json({"orderNo": orderNo}).status(200).end();
            }
        });
    }
});

이번 경우, 결제가 등록된 이후(결제가 완료되면 결제 정보가 insert된다고 가정) 주문 상세 정보가 등록되어야 함으로 첫번째 쿼리 실행이 성공하면 두번째 쿼리가 실행되도록 하였다.

Node & MySQL 여러 row 추가

위에서 살펴본 것 처럼 여러 파라미터가 필요할 때는 ?로 나타내고 이에 매핑되는 값들을 순서대로 묶어 array 형태로 전달해주면 된다.
근데 위의 3번 경우 처럼 여러 row를 한번에 insert 해야할 때는 어떻게 해야되나 조금 헤맸다..

먼저 여러 row insert하는 쿼리는 아래와 같다.

1
2
INSERT INTO TABLE_NAME(COLUMN1, COLUMN2, ...)
VALUES (value1, value2, ...), (value3, value4, ...), ... ;

VALUES 뒤에 들어갈 값들을 모두 커다란 파라미터라 생각해 각 row를 하나의 배열로, 그 row들을 또 배열로 묶어주면 된다.

1
let params = [[value1, value2, ...], [value3, value4, ...]]

여기서 중요한 점은!

1
2
INSERT INTO orderDetail(count, orderDetailPrice, storeNo, orderNo, menuNo, menuName) 
VALUES (?, ?, ?, ?, ?, ?);

처음에 이렇게 모든 파라미터에 ?를 넣어 작성했는데 이렇게 하면 image

이렇게 파라미터 매핑이 안되어있다고 뜬다.

values 뒤의 모든 값들을 하나의 param으로 묶어 전달함으로(위의 콘솔창에서처럼) 쿼리 안에 ? 도 하나만 있으면 된당

1
2
INSERT INTO orderDetail(count, orderDetailPrice, storeNo, orderNo, menuNo, menuName) 
VALUES ?;



맥린이의 끝나지 않은 파이썬 라이브러리 설치

동적제스처 인식때문에 모델학습을 돌리게 되면서 마주한 numpy 오류,,

NotImplementedError: Cannot convert a symbolic Tensor (lstm/strided_slice:0) to a numpy array. This error may indicate that you’re trying to pass a Tensor to a NumPy call, which is not supported.

찾아보니 numpy1.20에서 발생하는 오류로(numpy 버전이 높아서 발생하는 오류) 버전을 낮춰줘야한다고 한다.

1
!pip install numpy=1.19.5

근데 m1에는 1.19가 설치되지 않는다..!!

1
2
3
ERROR: Failed building wheel for numpy
Failed to build numpy
ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects

그래서 나는 이리저리 방법을 찾아보다가 그냥 터미널을 rosseta로 열어서 설치하였더니 됐당 ~.. image

++ 이후 다시 numpy 버전을 업그레이드 할일이 있어서 다시 로제타 끄고 numpy 설치 후 버전이 1.20이 되었었다.
그러고 방금 로제타 활성화하지 않은채로 pip install numpy==1.19.5를 하였더니 설치가 된다!! 이전에 한번 설치했던 적이 있어서 그런건감 image

여전히 m1은 알다가도 모를….

This post is licensed under CC BY 4.0 by the author.

캡스톤일지 | ~ 11.15 robotjs 이용한 마우스 클릭

캡스톤일지 | ~ 11.28(2) 내가 작성한 모델학습 코드