오늘도 개발
Node.js에서 express 사용하기 - 2. TypeORM으로 데이터베이스 연결하기 본문
1. TypeORM이란?
Node에서 가장 많이 사용되는 ORM 라이브러리 중 하나이다.
(sequelize, typeorm, prisma 등 존재)
ORM은 SQL문을 객체처럼 사용할 수 있게 해주는 기술로,
TypeORM은 SQL문을 js 객체처럼 사용할 수 있게 해준다.
- ORM의 장점 : 개발 속도 향상, 가독성 상승, 객체 지향적 접근 가능
- ORM의 단점 : 미세한 수정이나 디버깅이 어려움, ORM에 지정된 명령만 수행 가능, 쿼리 수행 속도 저하
여기서는 공부를 위해 TypeORM의 db connection 기능만 사용하고,
쿼리는 SQL 쿼리를 사용할 예정이다.
2. typeorm 설치
npm install typeorm
mysql driver가 존재하지 않는다는 에러가 나는 경우
mysql driver는 TypeORM과 Mysql을 연동해주는 도구.
에러가 나는 경우 npm으로 mysql 또는 mysql2로 관련 드라이버를 재설치해야 한다.
npm install mysql
그래도 계속 오류가 나면 TypeORM 삭제 -> mysql 또는 mysql2 설치 -> TypeORM 재설치 해보기.
npm uninstall typeorm
npm install mysql
3. typeorm 연결
dotenv로 환경변수 설정
환경변수는 내 운영체제에 저장해서 사용하는 변수.
dotenv는 이것을 도와주는 라이브러리.
.env 파일에 typeorm 환경 변수 저장하고 사용하기.
1) dotenv 설치
npm install dotenv
2) 프로젝트 폴더 내 .env 파일 생성 후 데이터베이스 관련 내용 작성
DATABASE_URL = mysql://root:password@127.0.0.1:3306/justagram
TYPEORM_CONNECTION = mysql
TYPEORM_HOST = 127.0.0.1
TYPEORM_USERNAME = root
TYPEORM_PASSWORD = password
TYPEORM_DATABASE = justgram
TYPEORM_PORT = 3306
TYPEORM_LOGGING = True
3) mysql에서 데이터베이스 생성
CREATE DATABASE justgram CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
환경변수 사용하기
1) 프로젝트 데이터베이스 지정하기 : 프로젝트 파일에서 .env에 쓴 설정 불러오기
const dotenv = require('dotenv');
dotenv.config();
// 한 줄로 require('dotenv').config()로 써도 됨
console.log(process.env) // 환경변수 설정을 객체로 불러와서 사용할 수 있음
2) 프로젝트와 데이터베이스 연동하기 : DataSource 명령어 사용
const { DataSource } = require('typeorm');
const myDataSource = new DataSource({
type: process.env.TYPEORM_CONNECTION,
host: process.env.TYPEORM_HOST,
port: process.env.TYPEORM_PORT,
username: process.env.TYPEORM_USERNAME,
password: process.env.TYPEORM_PASSWORD,
database: process.env.TYPEORM_DATABASE
})
myDataSource.initialize()
.then(() => {
console.log("Data Source has been initialized!")
}).catch(() => {
console.log("Database initiation fail")
})
MySQL 업그레이드하라는 에러 뜨는 경우
mysql 버전 문제가 있는 경우 다음과 같은 에러가 뜬다.
ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
간단하게 해결하려면 mysql workbench에서 비밀번호를 추가하면 된다.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호 8글자 이상';
하지만 이 경우 프로젝트 db 보안이 취약해질 수도 있다.
이 방법보다는 npm install mysql2로 mysql2를 설치하고
const { mysql } = require('mysql2');를 설정해주는 것이 더 낫다.
4. typeorm으로 쿼리 실행하기
회원가입 앱 예시
// 프로젝트와 mysql db 연동
const dotenv = require('dotenv');
dotenv.config();
const mysql = require('mysql2')
const { DataSource } = require('typeorm');
const myDataSource = new DataSource({
type: process.env.TYPEORM_CONNECTION,
host: process.env.TYPEORM_HOST,
port: process.env.TYPEORM_PORT,
username: process.env.TYPEORM_USERNAME,
password: process.env.TYPEORM_PASSWORD,
database: process.env.TYPEORM_DATABASE
})
myDataSource.initialize()
.then(() => {
// 연동 성공 시 뜨는 메시지
console.log("Data Source has been initialized!")
})
.catch(() => {
// 연동 실패 시 뜨는 메시지
console.log("Data Source initialization fail")
})
const http = require('http')
const express = require('express');
const app = express()
app.use(express.json())
// 회원가입 함수
const signup = (req, res) => {
// 요청 바디에서 name 받아와서 저장
const { name } = req.body
// db에 INSERT 쿼리 날림
const queryRes = myDataSource.query(`
INSERT INTO users(name) VALUES (?)`, [name]);
queryRes
.then(() => {
// 쿼리 성공 시
res.status(201).json({message: "userCreated"})
})
.catch(() => {
// 쿼리 실패 시
res.status(500).json({message: "error"})
})
}
app.post('/signup', signup)
// 서버 실행
const server = http.createServer(app)
server.listen(8000, () => {
console.log('listening at 8000')
})
위 예시의 signup 함수에 async/await을 사용하는 경우
// 프로젝트와 mysql db 연동
const dotenv = require('dotenv');
dotenv.config();
const mysql = require('mysql2')
const { DataSource } = require('typeorm');
const myDataSource = new DataSource({
type: process.env.TYPEORM_CONNECTION,
host: process.env.TYPEORM_HOST,
port: process.env.TYPEORM_PORT,
username: process.env.TYPEORM_USERNAME,
password: process.env.TYPEORM_PASSWORD,
database: process.env.TYPEORM_DATABASE
})
myDataSource.initialize()
.then(() => {
// 연동 성공 시 뜨는 메시지
console.log("Data Source has been initialized!")
})
.catch(() => {
// 연동 실패 시 뜨는 메시지
console.log("Data Source initialization fail")
})
const http = require('http')
const express = require('express');
const app = express()
app.use(express.json())
const signup = async(req, res) => {
const { name, email, password } = req.body
await myDataSource.query(`
INSERT INTO users(name, email, password) VALUES (?, ?, ?)`, [name, email, password]);
res.status(201).json({message: "userCreated"})
}
app.post('/signup', signup)
// 서버 실행
const server = http.createServer(app)
server.listen(8000, () => {
console.log('listening at 8000')
})'웹 프로그래밍 > Javascript' 카테고리의 다른 글
| 자바스크립트와 비동기 프로그래밍(콜백 함수, Promise, async/await) (0) | 2022.09.27 |
|---|---|
| Node.js에서 express 사용하기 - 3. dbmate로 마이그레이션하기 (1) | 2022.09.24 |
| Node.js에서 express 사용해보기 - 1. 개요(express, nodemon) (0) | 2022.09.22 |
| 자바스크립트의 실행 컨텍스트(Execution Contexts) (0) | 2022.05.25 |
| 자바스크립트 런타임과 자바스크립트의 실행 과정 (0) | 2022.05.25 |