28. mysql2모듈에서 async-await 사용하기, 테이블 truncate

JSLEE·2024년 5월 31일

mysql2 모듈에서 async-await 사용하기

먼저, 지난 포스트에서 공부했던 asyncawait을 이용해서, mysql2 모듈에 어떻게 사용하는지 알아보자.
다음은 공식 문서의 코드 예제이다.


asyncawait을 사용하는 방법은 총 2가지가 존재한다.

  1. createConnection & execute
    createConnection 을 이용하는 방법은, 우리가 이전에 공부했던 내용처럼 createConnection에 데이터베이스와 연결되기 위한 정보들을 입력하면 된다.
    예시코드처럼, async-awiat을 이용해 데이터베이스 세션 연결 동작을 보장할 수 있다.
    createConnection은 단일 연결 방식이며, 세션을 끊고 싶을 때에는 .end()를 이용한다.
  1. createPool & query
    createPool을 이용하는 방법은, createConnection을 두가지 동작으로 구분한다고 보면 될 것 같다. 첫번째 동작은 세션을 여는 것이다.
    createPool은 다음과 같이 작성할 수 있다.
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: '1234',
  database: 'BookShop',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

여기서 createConnection과 다른점은 waitForConnections, connectionLimit , queueLimit 이다.
connectionLimit은 한번에 몇개의 연결을 허용할지 설정한다.
queueLimit은 connectionLimit의 값 이상으로 요청이 들어왔을 때, 요청을 대기시킬 수이다.
즉, 세션을 열어놓은 상태로 여러개의 연결을 수행할 수 있도록 해준다. 이 말은, 여러 클라이언트에게서 동시에 많은 요청이 왔을 때 유용하다는 것을 의미한다.

우리가 API를 구현할 때 다음과 같이 .getConnection()으로 세션에 연결하여 사용한다.

pool.getConnection( async (err,conn) => {
	const [rows, fields] = await conn.query("sql","values");
});

우리는 이렇게 두 가지의 방법으로 세션을 열고, 연결할 수 있는 방법을 알아보았다.
다음으로는 await conn.execute()await conn.query() 가 어떤 값을 반환하는 지 알아보자.

위의 두 함수 모두 [ 결과값 , fields ] 형태의 값을 return한다.

만약 SELECT문으로 작성했다면, [ 조회된 값, 필드속성들 ] 형태의 값이 return되고,
INSERT문으로 작성했다면, [ DB수행 결과, undefined] 형태의 값이 return 된다.
아래는 INSERT문의 return 값이다.

따라서 예제 코드처럼 비구조화를 이용해서, 필요하다면 insertIdaffectedRows 등의 key값들을 이용할 수 있다.

pool.getConnection( async (err,conn) => {
  	let sql = "INSERT INTO table1 VALUES (1,2,3)"
	const [result] = await conn.query(sql);
    console.log(result.insertId, result.affectedRows) ; 
});

TRUNCATE

우리가 위처럼 여러개의 테스트 데이터를 입력하고 삭제하고 여러 작업을 수행하다보면,
데이터베이스 테이블이 알아보기 어렵게 지저분해지는 경우가 발생한다.
따라서, 데이터베이스 테이블의 값들을 지우는 방법에 대해 알아보자.

데이터베이스의 테이블값들을 지우는 방법은 총 3가지가 있다.

  1. DROP TABLE 테이블명 : 테이블을 통째로 삭제시킨다. 따라서, 테이블을 다시 CREATE해주고, 컬럼을 다시 작성해야 하는 불편함이 있다.

  2. DELETE FROM 테이블명 : 테이블 안에 있는 모든 Row의 값들을 제거한다. 하지만, 테이블이 완전히 초기화되는 것은 아니다. 예를 들어, Auto Increment를 설정한 컬럼은 여전히 증가된 상태로 유지되므로, 새롭게 데이터를 입력했을 때 1이라는 값을 가지지 않을 수 있다.

  3. TRUNCATE 테이블명 : 테이블 안에 있는 모든 Row의 값들을 삭제한다. DELETE와는 다르게 Auto Increment값도 1부터 시작하게 만든다. 즉, 테이블의 속성(컬럼)들을 유지하면서 테이블을 초기화 시킨다고 보면 된다. 이는 곧 CREATE TABLE 테이블 을 수행하고 직후의 상태와도 같다.


SET FOREIGN_KEY_CHECKS = 0; (1) ;

우리가 DELETETRUNCATE를 수행하려고 할 때,
다른 테이블이 현재 테이블을 참조하고 있으면 현재 테이블을 삭제할 수 없다는 오류가 발생한다.

이것은 참조 무결성 설정 때문인데, 우리는 다음과 같은 SQL문으로 FK에 대한 참조 무결성을 잠시 꺼줄 수 있다.

SET FOREIGN_KEY_CHECKS = 0;

우리는 테스트 데이터값들이 지저분해서 지우는 것이기 때문에, 이렇게 강제적으로 참조 무결성을 끄고 데이터를 삭제하는 것인데,
실제 서비스를 하고 있는 데이터들의 삭제에는 신중하여야 한다.
따라서, 데이터값을 제거해도 이상이 없는 테이블에 한해서만 SET FOREIGN_KEY_CHECKS = 0 을 사용하고, 값을 제거했다면 다시 옵션을 켜주는게 좋다.

SET FOREIGN_KEY_CHECKS = 1;
profile
공부한 내용들을 정리하기 위해 사용하는 블로그입니다.

0개의 댓글