안녕하세요! RyuWoong입니다.
이번에는 TypeORM을 한번 다뤄보도록 하겠습니다.
다뤄보시다보면 Query문 입력하는 것보다 훨씬 편리하다는 것을 느끼실 수 있을거라 생각합니다.
그럼 시작해볼까요?
Entity
Entity 생성하기
TypeORM에서 Entity로 데이터베이스 테이블을 Mapping 할 수 있습니다.
먼저 src폴더 내에 entity폴더를 생성한 후에, User Entity를 만들어 보도록 하겠습니다.
idx와 id로 구성된 User Entity입니다.
//src/entity/user.ts
import {
Column,
Entity,
PrimaryGeneratedColumn,
} from 'typeorm';
@Entity()
export default class User {
@PrimaryGeneratedColumn()
idx: number;
@Column({ type: 'varchar', length: 30, comment: '회원 아이디' })
id: string;
@CreateDateColumn({ comment: '회원 생성 날짜' })
created_at: Date;
}
Entity는 클래스형태로 작성하게 됩니다.
@Entity() 를 잊지 않도록 주의하세요. 만약 빼먹으면 Entity로 인식이 안됩니다! (꽤나 자주 있는 실수)
@PrimaryGeneratedColumn()은 DB대해 배우게 되면 index값으로 사용할 primary key이자 auto increase가 적용된 컬럼을 하나씩 만들어 보셨을 겁니다. 해당 역할 컬럼을 생성하는 데코레이션입니다.
@Column() 은 일반적인 컬럼을 뜻합니다. () 안에 다양한 옵션을 설정할 수 있습니다.
@CreateDateColumn() 은 생성된 시간을 기록해주는 컬럼입니다. 기본적으로 type은 datetime이 적용되며 default 값으로 CURRENT_TIMESTAMP()가 적용 되어 있어 있습니다.
이외에도 @DeletedDateColumn() , @JolinColumn.. 등 다양한 데코레이션이 있습니다.
Entity 연결하기
entity를 연결하기 전에 entity폴더 내에 index.ts 파일을 생성합니다.
// src/entity/index.ts
import User from './User';
export { User }
그리고 data-source.ts 를 열어서 아래와 같이 수정합니다.
// src/data-source.ts
import { DataSource } from "typeorm";
export const AppDataSource = new DataSource({
type: "mysql",
host: "localhost", //DB HOST
port: 3306, // DB 포트 mysql default port는 3306
username: "test", // DB 접속시 계정
password: "test", // DB 접속시 비밀번호
database: "test", // DB내 사용하는 DATABASE
synchronize: true, // 엔티티 동기화 여부, 개발 중일땐 true를 해도 상관없으나 실서버에서는 false로 하고 migration을 하거나, 직접 수정한다.
logging: true,
entities: ['src/entity/index.ts'], // Entity 경로 설정
subscribers: [],
migrations: [],
});
이후 터미널을 열어 `npm start`를 하면 DB가 synchronize 되며 테이블이 생성됩니다.
Repository
Entity를 생성 했으니 Repository를 선언해보겠습니다.
Repository는 테이블에 대해 명령을 실행할 수 있게 해줍니다.
먼저 src 폴더 내에 repository 폴더를 생성합니다. 그 후 index.ts를 작성해줍니다.
// src/repository/index.ts
import { AppDataSource } from "../data-source";
import { User } from "../entity";
export const userRepository = AppDataSource.getRepository(User);
간단하게 사용해보기.
그전에..
API 통신은 Get, Post, Put, Delete와 같은 다양한 method를 이용하여 처리하게 됩니다.
따라서 Post, Put 같은 경우 Body로 값으로 들어오게 되는데 Body을 사용할 수 있게 처리해주겠습니다.
// src/index.ts
import "reflect-metadata";
import express, { Request, Response } from "express";
import { AppDataSource } from "./data-source";
const app = express();
const port = 4040;
app.use(express.json()); // <<추가
app.use(express.urlencoded({ extended: true })); // <<추가
app.get("/", (req: Request, res: Response) =>
res.status(200).send("Hello, RyuWoong?")
);
AppDataSource.initialize().then(() => console.log("☘️ DB Connection"));
app.listen(port, () => {
console.log(`server on ${port}`);
});
추가 사항을 추가하면 Body값을 처리할 수 있으며, extended를 false처리하면 내장모듈인 queryString을 이용하는데 이는 Request.Query에서 Object 값을 사용하지 못합니다. 따라서 extended를 true로 변경하면 qs 모듈을 설치해서 Object 값을 사용할 수 있게 확장할 수 있습니다. 따라서 qs 모듈을 추가로 설치해 줍시다.
npm install --save qs
Insert
우선 간단하게 User Table에 데이터를 Insert 해보도록 하겠습니다.
userRepository를 import 하고 save 함수를 이용해서 Insert를 할 수 있습니다.
// src/index.ts
app.get("/", async (req: Request, res: Response) => {
const user = await userRepository.save({ id: "ryuwoong" });
return res.status(200).json(user);
});
user에는 save된 row가 바로 반환되어 잘 저장 되었는지 확인 할 수 있습니다.
{
"id": "ryuwoong",
"idx": 1,
"created_at": "2022-10-09T08:02:28.191Z"
}
Update
Update도 쉽게 할 수 있습니다.
update함수는 첫번째 props는 조건이고 두번째 props는 조건에 해당하는 데이터들을 수정할 내용을 넣습니다.
저는 ryuwoong이라는 아이디를 가진 데이터들의 id를 ryuwoong1로 바꾸겠습니다.
app.get("/", async (req: Request, res: Response) => {
const user = await userRepository.update(
{ id: "ryuwoong" },
{ id: "ryuwoong1" }
);
return res.status(200).json(user);
});
Select
select는 여러가지 방법으로 할 수 있습니다.
find, findBy,findOne, findOneBy,findAndCount,findAndCountBy 등 다양한 select기능을 하는 함수를 지원합니다.
큰 차이는 끝에 By가 붙는 함수들은 조건만 입력받으며, By가 없는 함수들은 select할 컬럼, where, order, relation 등 다양한 옵션 여부까지 설정하여 select할 수 있게 해줍니다.
app.get("/", async (req: Request, res: Response) => {
const user1 = await userRepository.find({ where: { id: "ryuwoong" } });
const user2 = await userRepository.findBy({ id: "ryuwoong" });
return res.status(200).json(user1);
});
이렇게 간단한 사용법까지 해봤습니다.
단순하게 쿼리를 입력하는 것보다 직관적으로 사용할 수 있다는 점이 참 매력적인 ORM입니다.
좋은 연휴 보내세요 : )
'Back-End > Express.js' 카테고리의 다른 글
[Express] TypeORM 연결하기 .02 (0) | 2022.10.03 |
---|---|
[Express] 서버 구성하기 .01 (0) | 2022.09.13 |
[Express] 시작하기 전에 .00 (0) | 2022.09.11 |
삽질의 기록과 일상을 남기는 블로그입니다. 주로 React Native를 다룹니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!