Day 29 - DELETE, DROP, TRUNCATE, 비동기 처리, FK 비활성화, query와 execute

이유승·2024년 12월 16일
0

* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.

* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.

1. DELETE, DROP, TRUNCATE

  • 데이터, 테이블 등을 삭제하는 명령어.

  • 데이터 삭제의 위험성에 대해서는 이전 포스팅 참조.



DELETE

-- 특정 조건의 데이터 삭제
DELETE FROM users WHERE id = 10;

-- 테이블의 모든 데이터 삭제
DELETE FROM users;

목적:

  • 테이블의 일부 또는 모든 데이터를 삭제.

특징:

  • 데이터만 삭제하며, 테이블 구조와 정의는 유지.
  • WHERE 절을 사용하여 조건에 맞는 데이터만 삭제할 수 있다.
  • 트랜잭션을 지원하며, 롤백이 가능(특히 InnoDB 테이블에서).
  • DELETE FROM table_name WHERE condition;의 형태로 사용.
  • 각 행이 하나씩 삭제되므로 삭제 속도가 느릴 수 있다.



DROP

-- 테이블 삭제
DROP TABLE users;

-- 데이터베이스 삭제
DROP DATABASE example_db;

목적:

  • 테이블 자체를 삭제.

특징:

  • 테이블 구조와 데이터, 모든 관련된 제약조건(키, 인덱스)까지 완전히 삭제.
  • 복구가 불가능.
  • 트랜잭션을 지원하지 않는다.
  • DROP TABLE table_name;의 형태로 사용.



TRUNCATE

-- 테이블의 모든 데이터 삭제 및 초기화
TRUNCATE TABLE users;

목적:

  • 테이블의 모든 데이터를 빠르게 삭제.

특징:

  • 데이터만 삭제하며, 테이블 구조는 유지.
  • 테이블의 모든 행을 한 번에 삭제.
  • 트랜잭션을 지원하지 않으며, 복구가 불가능.
  • AUTO_INCREMENT 값이 초기화.
  • TRUNCATE TABLE table_name;의 형태로 사용.
  • DELETE보다 훨씬 빠르게 실행.



주요 차이점 비교

구분DELETEDROPTRUNCATE
데이터 삭제일부 또는 전체 데이터 삭제 가능테이블과 데이터 모두 삭제모든 데이터 삭제
테이블 구조유지삭제유지
ROLLBACK가능 (InnoDB)불가능불가능
WHERE 사용가능불가능불가능
속도느림 (한 행씩 삭제)빠름매우 빠름
AUTO_INCREMENT유지삭제초기화



2. 비동기 처리



3. FK 비활성화

// 비활성화: 외래 키 제약을 무시하도록 설정
SET FOREIGN_KEY_CHECKS = 0;

// 재활성화: 외래 키 제약을 다시 활성화
SET FOREIGN_KEY_CHECKS = 1;
  • MySQL에서 외래 키 제약(foreign key constraint)을 일시적으로 활성화/비활성화하는 명령어.

  • 일반적인 상황에서 사용할 이유는 없고..

  • 데이터베이스 초기화, 테이블 삭제 또는 데이터 삽입/수정 작업 등의 상황에서 FK 제약조건으로 에러가 발생했을 때를 잠시 회피하기 위해 사용한다.

  • 개발 중의 편의성을 위해서 사용하는 명령어.



4. query와 execute

const db = require('../config/database');

const connection = await db.getConnection();

await connection.query();

or

await connection.execute();
  • MySQL을 사용해 데이터베이스에 명령을 전달하는 함수 2가지.

  • query는 데이터베이스에 SQL 명령문을 직접 전달하는 저수준 함수.

  • 저수준? 쿼리를 문자열로 전달하며, 파라미터 바인딩이 제공되지 않는다.

  • SQL 인젝션을 막는 수단이 없다. 절대 사용을 권장하지 않는다!

SQL 인젝션?



  • execute! 파라미터 바인딩과 함께 SQL 명령을 실행하기 위한 고수준 함수.

  • 이미 준비된 SQL 쿼리문에 필요한 파라미터만 삽입하여 데이터베이스로 전달한다.

  • query는 쿼리문이 문자열 형태로 전달하기만 하기 때문에 쿼리문을 수정해서 데이터베이스에 공격을 가하는게 가능하지만, execute는 이 것이 원천적으로 봉쇄되어있다.

  • MySQL 작업 시 execute를 사용하는 것을 권장한다.

query와 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);
});
profile
프론트엔드 개발자를 준비하고 있습니다.

0개의 댓글