PROJECT/[ 유튜브 ]

MySQL Workbench를 사용하기 위한 고군분투,, PK, NN, UQ, B, UN, ZF, AI / mysql2 / Callback require = > Promise import(ES6)로!!! 바꾸자!!!(리팩토링) / select insert update delete

Lim임 2025. 9. 30. 17:29

hostname은 localhost 여도됨 안되면 서로 스위치해서 쓰쇼 

 

https://dalsong-00.tistory.com/17

 

[MySQL] 맥북 MySQL Workbench 응용 프로그램이 예기치 않게 종료되었습니다.

MySQL 을 공부하기 위해 MySQL과 MySQL Workbench를 설치했다. 초반에는 잘 작동하다가 갑자기 오류가 나서 꺼지더니 그 이후부터 계속 실행하면 'MYSQLWorkbench 응용 프로그램이 예기치 않게 종료되었습니

dalsong-00.tistory.com

ㅇ오류 생김!!!

난 저걸로 안됨 8.0.28

잘 읽어보니 내 컴퓨터 버전인 sonoma 를 위하 ㄴ버전이 있는 것 같음

한번 써보겠음!!!!

 

 

안됨!!ㅁ ㅓ가 이슈인거임?

https://itinerant.tistory.com/199

 

[MySQL] MacOS ventura 13 에서 MySQL Workbench 가 실행되지 않을때 해결 방법

[MySQL] MacOS ventura 13 에서 MySQL Workbench 가 실행되지 않을때 해결 방법 기존에 workbench 는 몇 버전이었는지 기억은 안납니다. 원래 업데이트 같은거 잘 안하는 스타일인데,,,,, 테스트를 위해 ios 시뮬

itinerant.tistory.com

버전 이슈가 맞는 것 같음

 

아니었음 강의에서 말해주셨는데 
8.0.43버전 그대로 하면 되는데 걍,,,,

( + ) 버튼으로 새로 connection name 까지 지어주면 되는 일이었음 실화냐ㅐ~~~

오류 메세지가 중요한 이유~

 

 

----

 

Board 스키마를 따블클릭하고 해라~ 라는 뜻

 

 

폰트크기 키우는 법

뒤에 숫자 조절하고 껐다 키소

 

PK primary Key

NN not null

UQ unique

B... Binary

UN unsigned

ZF

AI auto Increament

 

users table 생성

CREATE TABLE `Youtube`.`users` ( `id` INT NOT NULL, `email` VARCHAR(100) NOT NULL, `name` VARCHAR(45) NOT NULL, `password` VARCHAR(45) NOT NULL, `contact` VARCHAR(45) NULL, PRIMARY KEY (`id`), UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE);

CREATE TABLE `Youtube`.`users` (

`id` INT NOT NULL,

`email` VARCHAR(100) NOT NULL,

`name` VARCHAR(45) NOT NULL,

`password` VARCHAR(45) NOT NULL,

`contact` VARCHAR(45) NULL,

PRIMARY KEY (`id`),   // primary key로 id값 쓸거임!!

UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE);

CREATE TABLE `Youtube`.`channels` ( `id` INT NOT NULL, `name` VARCHAR(100) NOT NULL, `sub_num` INT NOT NULL DEFAULT 0, `video_count` INT NOT NULL DEFAULT 0, `user_id` INT NULL, PRIMARY KEY (`id`), INDEX `user_id_idx` (`user_id` ASC) VISIBLE, CONSTRAINT `user_id` FOREIGN KEY (`user_id`) REFERENCES `Youtube`.`users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION);

CREATE TABLE `Youtube`.`channels` (
  `id` INT NOT NULL,
  `name` VARCHAR(100) NOT NULL,
  `sub_num` INT NOT NULL DEFAULT 0,
  `video_count` INT NOT NULL DEFAULT 0,
  `user_id` INT NULL,
  PRIMARY KEY (`id`),
  INDEX `user_id_idx` (`user_id` ASC) VISIBLE,   // 오름차순으로 정렬을 해줄테야~ 
  CONSTRAINT `user_id`  //  제약조건 제약조건이름
    FOREIGN KEY (`user_id`) // user-id 컬럼을
    REFERENCES `Youtube`.`users` (`id`)  // Youtube의 user.id 랑 엮고싶어~
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

 

 

user_id가 없는데? 라는 뜻

미친! 실패한 것 까지 들어가는 오토 인크리먼트 극혀무극혀무

 

 

-------------

 

npm install --save mysql2

 

import 쓰고 싶으면 package.json에 "type":"module" 추가하세용

https://tech-marineplay.tistory.com/12

ESM 식 import 문으로 진행하고 싶으면 Promise

 

CJS 식 require 문으로 진행하고 싶으면 Callback(추천하지않음)

둘에게 비동기식 진행ㄴ에서 차이가 있따고 듣고 promise를 추천한다고 들었는데

여러가지 이야기도 들었지만 딱 거기까지만 이해했다

https://tin814.tistory.com/41

 

import require 왜 공존할수업서!!!!!!

import 쓰고 싶으면 package.json에 "type":"module" 추가하세용 로컬 파일 임포트할 때는 확장자까지 적어야 합니다. 예: import { foo } from './utils.js'이거 말고도 파일 확장자를 .mjs로 바꾸는 방법도 있어요("

tin814.tistory.com

챗지피티한테 물어본 내용을 적어놨으니 혹시 참고할 사람들 참고하쇼

그래서 나는 강사님과 다른 방식으로 진행할 예정이다

나만의 채-린지

timezone AsiaSeoul 세팅은 실패함

SET GLOBAL time_zone = 'Asia/Seoul';

글로벌빼고 

SET time_zone = 'Asia/Seoul';

SELECT @global.time_zone, @session.time_zone;

 

하면 됨

 

시간 뒤에 드러브 ㄴ숫자문자 제거

휴 import 로 변환과정에서 우여곡절이 있었따~

몇가지 챙겨야 하는거는

  • require문을 import 문으로 다 바꿔줘야 한다는 거
    • const {db} = require('../db');
    • import {db} from '../db.js'  // .js 파일명 뒤에 까지 꼭 붙여줘야함
  • export문도 바꿔줘야 한다는 거
    • module.exports = router;
    • export default router;
  • async function testConnection() { 은 굳이 해 줄 필요 없지만 공부해주겠음!!! 원래부터 궁금했던 내용이라
  • 글고 코파일럿이 요란뻑쩍찌끈한게 열받음

아하,,,게다가 await을 사용하여 async를 붙이려면

이 구조를 이용해서

async 위치를 주의해서 보세여

뭐야 맞짱뜨자

 

🚫 문제가 되는 코드:

const [result] = await connection.query(
  `SELECT * FROM users WHERE email = ${email}`
  //                                 ↑ 이 부분이 문제!
);

 

1️⃣ SQL Injection 방지:

// ❌ 위험한 코드
`SELECT * FROM users WHERE email = ${email}`

// ✅ 안전한 코드  
'SELECT * FROM users WHERE email = ?',
[email]

 

2️⃣ GET 요청 파라미터:

// ❌ GET에서 body 사용 (불가능)
let { email } = req.body;

// ✅ GET에서 query 사용
let { email } = req.query;

 

이런거 수정해야댐

📚 SQL Injection이 뭔가요?
🚫 위험한 방식:

-- 사용자가 email에 악성 코드 입력하면
-- email = "'; DROP TABLE users; --"
SELECT * FROM users WHERE email = '; DROP TABLE users; --
-- 결과: 테이블이 삭제됨! 😱

 

✅ 안전한 방식:

-- ? 사용하면 자동으로 이스케이프 처리
SELECT * FROM users WHERE email = ?
-- 결과: 악성 코드도 그냥 문자열로 처리됨 😊

 

 

 

하나씩 완성중입니다..........!!!!!!!!끼욧  이지 까까브로 ㅋㅋ

근데 이제 delete는 if문이 덜 완성상태긴해 ㅋㅋ

여억시이,,,요즘 트랜드,,얘기도 해주시는구나,,,

기뻐욧,,! 공부하는 맛이 나는구만

 

 

리펙토링 결과,,,,결과란게 뭐지,,?

로그인

코드 올리지 말라구 하셨던 것같은데,, 그치만

리팩토링 결과라면 이것 밖에 없는걸요,,,

 

 

이제 channels 

 

선생님이 하신 그대로 arrow function으로 밑에 만들었는데

오류가낫따

코파일럿이 말하길

일반 function으로 하면 가능한데

arrow function으로 하면 변수선언을 해줘야한다는 것이다

왜 그런가~ 살펴보니

 

애초에 정석은 붙이는 게 맞다!!

 

 

자바스크립트는 

변수 선언 키워드를 느슨하게 관리했음

CommonJS에서는 가끔 관리하지만

ESModule에서는 엄격하게!!관리함

import 쓰려고 module type으로 했더니

제대로 공부할 수 있게되,,,

 

 

 

 

 

 

그리고 일반함수는

호이스팅(여기저기 불려다니는 거)이 가능하지만

Arrow함수는 안되기 때문에~

위에다 올려주는 것이 좋댔음

 

 

 

 

오,,, 갱장히 신기한 문법

userId가 있으면~ 이거해라

 

 

자자

const [result] = await connection.query()에서

각 sql 구문에 따라 들어오는 값이 다르다는데~~!!!(당연함)

 

select문

// SELECT 쿼리
const [results] = await connection.query('SELECT * FROM channels');
console.log(results);

// 결과: 배열 형태의 데이터
[
  { id: 1, name: '채널1', user_id: 'user1' },
  { id: 2, name: '채널2', user_id: 'user2' }
]

insert문

// INSERT 쿼리  
const [results] = await connection.query('INSERT INTO channels (name,user_id) VALUES (?,?)', [name, user_id]);
console.log(results);

// 결과: 실행 정보 객체
{
  fieldCount: 0,
  affectedRows: 1,      // 영향받은 행 수
  insertId: 15,         // 새로 생성된 ID (AUTO_INCREMENT)
  info: "",
  serverStatus: 2,
  warningStatus: 0,
  changedRows: 0
}

update문

// UPDATE 쿼리
const [results] = await connection.query('UPDATE channels SET name = ? WHERE id = ?', ['새이름', 1]);
console.log(results);

// 결과: 업데이트 정보 객체
{
  fieldCount: 0,
  affectedRows: 1,      // 수정된 행 수
  insertId: 0,
  info: "Rows matched: 1  Changed: 1  Warnings: 0",
  serverStatus: 2,
  warningStatus: 0,
  changedRows: 1        // 실제 변경된 행 수
}

delete문

// DELETE 쿼리
const [results] = await connection.query('DELETE FROM channels WHERE id = ?', [1]);
console.log(results);

// 결과: 삭제 정보 객체
{
  fieldCount: 0,
  affectedRows: 1,      // 삭제된 행 수
  insertId: 0,
  info: "",
  serverStatus: 2,
  warningStatus: 0,
  changedRows: 0
}

 

 

잘 쓰는 법

 

이게 진짜 개맛있네

코파일럿이 말아주는 개 맛있는 코드,,,

완뇨,,!!!!!!!!!!