* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.
* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.
데이터, 테이블 등을 삭제하는 명령어.
데이터 삭제의 위험성에 대해서는 이전 포스팅 참조.
-- 특정 조건의 데이터 삭제
DELETE FROM users WHERE id = 10;
-- 테이블의 모든 데이터 삭제
DELETE FROM users;
-- 테이블 삭제
DROP TABLE users;
-- 데이터베이스 삭제
DROP DATABASE example_db;
-- 테이블의 모든 데이터 삭제 및 초기화
TRUNCATE TABLE users;
구분 | DELETE | DROP | TRUNCATE |
---|---|---|---|
데이터 삭제 | 일부 또는 전체 데이터 삭제 가능 | 테이블과 데이터 모두 삭제 | 모든 데이터 삭제 |
테이블 구조 | 유지 | 삭제 | 유지 |
ROLLBACK | 가능 (InnoDB) | 불가능 | 불가능 |
WHERE 사용 | 가능 | 불가능 | 불가능 |
속도 | 느림 (한 행씩 삭제) | 빠름 | 매우 빠름 |
AUTO_INCREMENT | 유지 | 삭제 | 초기화 |
// 비활성화: 외래 키 제약을 무시하도록 설정
SET FOREIGN_KEY_CHECKS = 0;
// 재활성화: 외래 키 제약을 다시 활성화
SET FOREIGN_KEY_CHECKS = 1;
MySQL에서 외래 키 제약(foreign key constraint)을 일시적으로 활성화/비활성화하는 명령어.
일반적인 상황에서 사용할 이유는 없고..
데이터베이스 초기화, 테이블 삭제 또는 데이터 삽입/수정 작업 등의 상황에서 FK 제약조건으로 에러가 발생했을 때를 잠시 회피하기 위해 사용한다.
개발 중의 편의성을 위해서 사용하는 명령어.
const db = require('../config/database');
const connection = await db.getConnection();
await connection.query();
or
await connection.execute();
MySQL을 사용해 데이터베이스에 명령을 전달하는 함수 2가지.
query는 데이터베이스에 SQL 명령문을 직접 전달하는 저수준 함수.
저수준? 쿼리를 문자열로 전달하며, 파라미터 바인딩이 제공되지 않는다.
SQL 인젝션을 막는 수단이 없다. 절대 사용을 권장하지 않는다!
execute! 파라미터 바인딩과 함께 SQL 명령을 실행하기 위한 고수준 함수.
이미 준비된 SQL 쿼리문에 필요한 파라미터만 삽입하여 데이터베이스로 전달한다.
query는 쿼리문이 문자열 형태로 전달하기만 하기 때문에 쿼리문을 수정해서 데이터베이스에 공격을 가하는게 가능하지만, execute는 이 것이 원천적으로 봉쇄되어있다.
MySQL 작업 시 execute를 사용하는 것을 권장한다.
// 안전하지 않은 방식 (SQL 인젝션 가능성)
const userId = "1 OR 1=1"; // 위험한 값
connection.query(`SELECT * FROM users WHERE id = ${userId}`, (err, results) => {
if (err) throw err;
console.log(results);
});
// 안전한 방식 (파라미터 바인딩 사용)
connection.query("SELECT * FROM users WHERE id = ?", [1], (err, results) => {
if (err) throw err;
console.log(results);
});