본 포스팅은 Typescript를 기반으로 작성되었다.
Javascript와 문법이 다르지 않지만 차이점이 존재할 수도 있다는 부분을 염두하고 읽기 바란다.
2021.11.21 - [SW/Typescript] - [Typescript] 1. 소개 및 초기 설치
1. 서두
이번 포스팅에선 Typescript와 Knex.js를 통한 MySQL/MriaDB의 이용법과 보안처리에 관한 내용에 대해 정리했다.
기본적인 Typescript 세팅은 이미 완료되어있다는걸 전재하에 설명된다.
만약 Typescript 세팅이 준비되지 않았다면 필자의 이전 포스팅을 참고하여 세팅하길 바란다.
작업 폴더는 프로젝트 폴더 안에 src 폴더 안에서 진행된다.
2. Knex.js란?
Node.js에서 MySQL/MariaDB를 사용하는 방법은 크게 다음과 같은 방법들이 있다
- raw 쿼리를 직접 작성한 후 실행하는 방법
- 쿼리 빌더를 이용해 쿼리를 실행하는 방법
- ORM을 통해 쿼리를 실행하는 방법
이 방법들 중 첫번째 방법은 쿼리문 작성시 오타의 위험성이 있기 때문에 실무에서 사용하는 경우가 거의 없고, 주로 2번과 3번의 방법을 이용하게 된다.
그럼 크게 쿼리빌더와 ORM이 남았는데,
쿼리빌더는 개발자가 직접 쿼리문을 작성하는 대신 현재 사용하는 프로그래밍 언어를 이용해 간접적으로 쿼리를 작성할 수 있게 해주는 API이다. 덕분에 쿼리의 조합과 재사용을 유연하고 편리하게 관리할 수 있다.
ORM(Object Relational Mapping)은 데이터베이스 구조를 추상화한 객체를 통해 데이터베이스를 다룰 수 있게 하는 툴이다. 여러가지 부가기능을 내장한 경우가 많아서 테이블 간의 관계를 편리하게 다룰 수는 있지만, 숙달되기까지의 러닝커브가 크다는 단점이 있다 (조금 과장하자면 그냥 새로은 SQL 문법을 공부한다는 수준이다.)
여기서 Knex.js는 쿼리빌더에 속하게 되는데, 그로인해 Knex.js을 사용하기 위한 문법, 메소드는 기존 SQL과 비슷한 형태를 띄고 있고, 마이그레이션 기능도 지원하며, MySQL/MariaDB, Postgres, MSSQL, Oracle과 같은 다양한 DBMS를 지원하기 때문에 쿼리빌더 중에서 널리 사용되는 편이다.
3. Knex.js 사용법
우선 간단한 사용법만을 먼저 보겠다.
아래 명령을 통해 Knex를 설치할 수 있다. 우리는 Typescript를 사용할 것이기 때문에 타입도 개발 의존성으로 같이 설치해준다.
npm install knex
npm install -D @types/knex
이제 Knex를 통해 MySQL 서버에 접속하기 위해 아래와 같이 Knex를 import하고 Knex 객체를 생성한다.
이때 Knex 생성자의 인자로 연결정보를 담은 객체를 전달하게 된다. 사실 이러한 식으로 코드에 민감한 정보를 직접 넣는 방식을 바람직 하지 않다. 하지만 일단 간단한 사용법에 대해 먼저 알아보고 이러한 보안적인 부분에 대해선 후술하도록 하겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import Knex from "knex";
const knex = Knex({
client: 'mysql', // DBMS 종류
connection: {
timezone: 'UTC', // 타임존
host: '<DB_HOST_ADDR>', // 서버 주소
port: <DB_HOST_PORT>, // 서버 포트번호
user: '<DB_USER>', // 유저 ID
password: '<DB_PSWD>', // 유저 패스워드
database: '<DB_NAME>', // database 명
pool: { // 커넥션 풀 설정
min: 0, // 커넥션 최소 개수
max: 10 // 커넥션 최대 개수
}
}
});
|
cs |
위 코드를 자세히 보면 pool 이라는 부분이 있는데 이 부분은 Connection Pool에 대한 설정을 하는 부분이다.
Connection Pool이란, DB와의 커넥션을 생성하고 삭제하는 과정에서 발생하는 오버헤드를 줄이기 위해 미리 DB 서버와 커넥션을 연결한 객체를 생성해 모아둔 Pool을 생성해두고 이를 계속 재활용하는 방식을 말한다.
Knex 객체를 생성했으니 이제 간단한 사용법을 알아보겠다.
- 전체적인 사용패턴
전체적인 사용패턴은 아래 예시와 같이 기존의 MySQL/MariaDB 또는 Oracle에서 사용하던 SQL 문법의 키워드 사용 순서와 동일하게 Knex 객체 내부의 메소드들을 체이닝(Chaining)하여 사용하게 된다.
체이닝된 명령줄의 맨 끝에 "then()" 메소드를 붙여주면 메소드 체인으로 구성된 쿼리문의 실행 결과 Row를 Promise를 기반으로 받을 수 있다. 만약에 Promise 작업 수행이 실패 할 경우를 핸들링해야한다면, "catch()" 메소드를 체이닝 맨 마지막에 붙여서 이용하면 된다. Promise에 대한 자세한 사용법 설명이 필요하다면 필자가 이전에 포스트한 글을 참고하길 바란다.
2021.12.08 - [SW/Typescript] - [Typescript] Promise 객체를 이용한 비동기(Asynchronous)적 처리
이런식으로 메소드 체이닝을 통해 쿼리문을 구성할 수도 있는데, 필요 또는 특정 상황에 따라 메소드 체이닝 만으로는 쿼리문 구성이 어렵거나 너무 복잡해지는 경우 아래 예시처럼 RAW 쿼리문을 실행시킬 수도 있다.
- 세부 메소드 레퍼런스
Knex의 더욱 세부적인 메소드에 대한 레퍼런스는 아래 첨부한 링크를 참고하면 된다. Knex 내부의 모든 메소드들의 사용법들이 나와있으니 참고하도록 하자.
'SW > Typescript' 카테고리의 다른 글
[Typescript] Chrome Extension manifest v3 (0) | 2022.10.07 |
---|---|
[Typescript] 소규모 서비스에서의 FaaS(Netlify Functions)와 WebRTC를 통한 Peer간 (서버측면)저비용 통신 서비스 구현 - 1. 방법론 (0) | 2022.06.10 |
[Typescript] Promise 객체를 이용한 비동기(Asynchronous)적 처리 (0) | 2021.12.08 |
[Typescript] JavaScript의 비동기(Asynchronous)적 처리 (0) | 2021.12.05 |
[Typescript] dotenv와 cross-env를 이용한 환경변수 설정 및 환경에 따른 환경변수 분리 (0) | 2021.12.04 |